{
  "components": {
    "headers": {
      "RateLimit-Limit": {
        "description": "Requests permitidos por ventana de 60 segundos: hoy 120. No se cuenta por credencial; ver el rate limit en la descripción de la API.",
        "schema": {
          "example": 120,
          "format": "int32",
          "type": "integer"
        }
      },
      "RateLimit-Remaining": {
        "description": "Requests que quedan en la ventana; 0 en un 409. Bajo ráfagas concurrentes el valor es aproximado.",
        "schema": {
          "example": 119,
          "format": "int32",
          "type": "integer"
        }
      },
      "Retry-After": {
        "description": "Segundos a esperar antes de reintentar. En un error con código, solo cuando `X-Reintentable` es `si` (hoy 30).",
        "schema": {
          "example": 30,
          "format": "int32",
          "type": "integer"
        }
      },
      "X-Codigo-Error": {
        "description": "El código del error, el mismo que abre el cuerpo (`CODIGO:…`). Viene en todo error de negocio con código, esté o no el código en `x-errores`; el 429 del cerrojo de CAF (`CAF_REQUEST_IN_PROGRESS`) no lo trae todavía.",
        "schema": {
          "example": "AUT_DOCTYPE_NOT_AUTHORIZED",
          "type": "string"
        }
      },
      "X-Reintentable": {
        "description": "Si vale reintentar el mismo request: el valor de `x-errores` para ese código, y `desconocido` para un código que no figura ahí. `no` quiere decir no reintentar, cualquiera sea el status.",
        "schema": {
          "enum": [
            "si",
            "no",
            "desconocido"
          ],
          "example": "no",
          "type": "string"
        }
      }
    },
    "responses": {
      "ErrorNegocio": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorFramework"
            }
          },
          "text/plain": {
            "schema": {
              "$ref": "#/components/schemas/ErrorTextoPlano"
            }
          }
        },
        "description": "Error de negocio de la API en texto plano, o del framework en JSON. Los headers `X-Codigo-Error`, `X-Reintentable` y `Retry-After` vienen solo en los errores con código (500); el 404 de negocio no los trae.",
        "headers": {
          "RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimit-Limit"
          },
          "RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimit-Remaining"
          },
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          },
          "X-Codigo-Error": {
            "$ref": "#/components/headers/X-Codigo-Error"
          },
          "X-Reintentable": {
            "$ref": "#/components/headers/X-Reintentable"
          }
        }
      },
      "LimiteDeTasa": {
        "content": {
          "text/plain": {
            "example": "The allowed number of requests has been exceeded.",
            "schema": {
              "type": "string"
            }
          }
        },
        "description": "Se superó el rate limit: **409 Conflict**, no 429. El request no se ejecutó.\n\nEl límite (120 por minuto) no se cuenta por credencial sino por la dirección de red desde la\nque la conexión llega al servidor de la aplicación, que detrás de la infraestructura actual es\nla de un intermediario: el cupo podría compartirse con otros clientes. Eso no está verificado\ncontra el servidor desplegado. El cuerpo es texto, no JSON; el código de la API lo emite con\n`Content-Type: text/plain; charset=utf-8`, pero que ninguna capa intermedia lo cambie no está\nverificado: léalo como texto sin depender del header.\n\n**No hay `Retry-After`.** Esperar al menos 60 segundos antes de reintentar.",
        "headers": {
          "RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimit-Limit"
          },
          "RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimit-Remaining"
          }
        }
      },
      "NoAutenticado": {
        "content": {
          "application/json": {
            "example": {
              "Message": "Authorization has been denied for this request."
            },
            "schema": {
              "$ref": "#/components/schemas/ErrorFramework"
            }
          }
        },
        "description": "No autenticado. Hay dos casos:\n\n- **Sin el header `Authorization`:** cuerpo JSON\n  `{\"Message\": \"Authorization has been denied for this request.\"}`.\n- **Con otro esquema que no sea `Basic`** (la comparación distingue mayúsculas) **o con\n  credenciales inválidas:** sin cuerpo.",
        "headers": {
          "RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimit-Limit"
          },
          "RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimit-Remaining"
          },
          "WWW-Authenticate": {
            "description": "Siempre `Basic`. Podría venir además otro desafío de la autenticación del servidor (no verificado): no dependa de que `Basic` sea el único.",
            "schema": {
              "example": "Basic",
              "type": "string"
            }
          }
        }
      },
      "ParametroInvalido": {
        "content": {
          "application/json": {
            "example": {
              "Message": "The request is invalid.",
              "MessageDetail": "The parameters dictionary contains a null entry for parameter 'tipoDocumento' of non-nullable type 'System.Int32' for method '<firma del método>' in '<controller>'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
            },
            "schema": {
              "$ref": "#/components/schemas/ErrorFramework"
            }
          }
        },
        "description": "Un parámetro numérico de la ruta (o de la query) sin valor por omisión no se pudo convertir:\nno es un número, o no cabe en el tipo. Lo responde el framework, después de autenticar y antes\nde ejecutar la operación. `MessageDetail` depende de la configuración del servidor (no\nverificado): no dependa de él.\n\nUn parámetro **con** valor por omisión que no se puede convertir no da este error: la API\nusa el valor por omisión. Con `ambiente`, eso es **producción**.",
        "headers": {
          "RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimit-Limit"
          },
          "RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimit-Remaining"
          }
        }
      }
    },
    "schemas": {
      "Acteco": {
        "description": "Datos de la actividad economica.",
        "properties": {
          "AffectoIva": {
            "description": "Si es afecto a iva o no la actividad. (SI|NO)",
            "type": [
              "string",
              "null"
            ]
          },
          "Codigo": {
            "description": "Codigo de la actividad en el SII.",
            "type": [
              "string",
              "null"
            ]
          },
          "Nombre": {
            "description": "Nombre de la actividad.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "ActualizarCertificacion": {
        "description": "Datos de la certificación para actualizar. (Solo se actualizan los campos que no vengan nulos)",
        "properties": {
          "Certificado": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Certificado"
              },
              {
                "type": "null"
              }
            ],
            "description": "Actualizar los datos del certificado. (v2+)"
          },
          "Direccion": {
            "description": "Direccion",
            "type": [
              "string",
              "null"
            ]
          },
          "DireccionRegional": {
            "description": "Direccion regional",
            "type": [
              "string",
              "null"
            ]
          },
          "Giro": {
            "description": "Giro comercial",
            "type": [
              "string",
              "null"
            ]
          },
          "Productos": {
            "description": "Listado de productos. (nombre;precio)",
            "items": {
              "$ref": "#/components/schemas/Producto"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "RazonSocial": {
            "description": "Razon social",
            "type": [
              "string",
              "null"
            ]
          },
          "Referencia": {
            "description": "Referencia",
            "type": [
              "string",
              "null"
            ]
          },
          "Servicios": {
            "description": "Listado de servicios. (nombre;precio)",
            "items": {
              "$ref": "#/components/schemas/Servicio"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "Sets": {
            "description": "Sets a certificar.",
            "items": {
              "$ref": "#/components/schemas/Set"
            },
            "type": [
              "array",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "Ambiente": {
        "description": "Ambientes del SII.",
        "enum": [
          0,
          1
        ],
        "format": "int32",
        "type": "integer",
        "x-enum-descriptions": [
          "Homologación.",
          "Producción."
        ],
        "x-enum-varnames": [
          "Homologacion",
          "Produccion"
        ]
      },
      "AnulacionMasivaRestultadoAnular": {
        "description": "Resultado de la anulación masiva de folios.",
        "properties": {
          "Anulados": {
            "description": "Cantidad de folios anulados",
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "Certificacion": {
        "description": "Datos de la certificación.",
        "properties": {
          "Actecos": {
            "description": "Activiades economicas.",
            "items": {
              "$ref": "#/components/schemas/Acteco"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "ClasificacionError": {
            "$ref": "#/components/schemas/ClasificacionError",
            "description": "Clasificación del error, cuando la certificación está en estado de error."
          },
          "CodigoError": {
            "description": "Codigo de error.",
            "type": [
              "string",
              "null"
            ]
          },
          "Comentario": {
            "description": "Comentario del estado. Util cuando se encuentra en error.",
            "type": [
              "string",
              "null"
            ]
          },
          "Direccion": {
            "description": "Direccion (Leida desde el SII)",
            "type": [
              "string",
              "null"
            ]
          },
          "DireccionModificada": {
            "description": "Direccion modificada",
            "type": [
              "string",
              "null"
            ]
          },
          "DireccionRegional": {
            "description": "Direccion regional (Leida desde el SII)",
            "type": [
              "string",
              "null"
            ]
          },
          "DireccionRegionalModificada": {
            "description": "Direccion regional modificada",
            "type": [
              "string",
              "null"
            ]
          },
          "Estado": {
            "$ref": "#/components/schemas/EstadoCertificacion",
            "description": "Estado actual de la certificación."
          },
          "Etapa": {
            "$ref": "#/components/schemas/EtapaCertificacion",
            "description": "Etapa en que se encuentra la certificación."
          },
          "Fecha": {
            "description": "Fecha de creacion.",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "FechaEstado": {
            "description": "Fecha del estado.",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "Giro": {
            "description": "Giro comercial (Leida desde el SII)",
            "type": [
              "string",
              "null"
            ]
          },
          "GiroModificado": {
            "description": "Giro comercial modificada",
            "type": [
              "string",
              "null"
            ]
          },
          "HorasEnEstado": {
            "description": "Horas completas (unidad: horas; se trunca hacia abajo: 3 h 59 min son 3) que la certificación lleva sin que cambie nada de lo que se ve en esta respuesta. Se mide desde la más reciente entre `FechaEstado` y la fecha del último `CodigoError`, en hora de Chile. Un desfase de reloj devuelve 0; `null` significa que la certificación no tiene ninguna fecha de referencia. Un cambio de `PasoEnSII` que no mueva el estado interno de la certificación no lo reinicia.",
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          },
          "PasoEnSII": {
            "$ref": "#/components/schemas/PasoCertificacion",
            "description": "Paso en que se encuentra la certificación cuando su `Etapa` es `ConfiguracionSII` (2)."
          },
          "Productos": {
            "description": "Listado de productos.",
            "items": {
              "$ref": "#/components/schemas/Producto"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "RUT": {
            "description": "RUT de la empresa que se certifica.",
            "type": [
              "string",
              "null"
            ]
          },
          "RazonSocial": {
            "description": "Razon social (Leida desde el SII)",
            "type": [
              "string",
              "null"
            ]
          },
          "RazonSocialModificada": {
            "description": "Razon social modificada",
            "type": [
              "string",
              "null"
            ]
          },
          "Reinicios": {
            "description": "Cuántas veces se reinició esta certificación a pedido de alguien (unidad: veces; entero mayor o igual a 0, nunca `null`). Cuenta los reinicios por la API y los del portal de administración; no cuenta los reintentos automáticos del proceso. El contador es por certificación y arranca en 0.",
            "format": "int32",
            "type": "integer"
          },
          "Servicios": {
            "description": "Listado de servicios.",
            "items": {
              "$ref": "#/components/schemas/Servicio"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "Sets": {
            "description": "SETs para certificar.",
            "items": {
              "$ref": "#/components/schemas/Set"
            },
            "type": [
              "array",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "Certificado": {
        "description": "Datos del certificado digital.",
        "properties": {
          "Contrasenna": {
            "description": "Contraseñ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.",
            "type": "string",
            "writeOnly": true
          },
          "Data": {
            "description": "PFX del certificado, en base64. Dato sensible: no se registra en logs del integrador.",
            "format": "byte",
            "type": "string",
            "writeOnly": true
          }
        },
        "required": [
          "Data",
          "Contrasenna"
        ],
        "type": "object"
      },
      "ClasificacionError": {
        "description": "Clasificaciones de los tipos de errores.",
        "enum": [
          0,
          1,
          2,
          3
        ],
        "format": "int32",
        "type": "integer",
        "x-enum-descriptions": [
          "No se encuentra en error.",
          "Error del sistema. Este debe resolverse en enrolamiento.",
          "El usuario de la plataforma de enrolamiento puede resolver el problema.",
          "El cliente debe resolver la situación."
        ],
        "x-enum-varnames": [
          "Ninguno",
          "Sistema",
          "Admin",
          "Cliente"
        ]
      },
      "ConsultaMasivaRestultadoCAF": {
        "description": "Un CAF emitido para el RUT y el tipo de documento consultados: su rango de folios, la fecha y quién lo pidió.",
        "properties": {
          "Cantidad": {
            "description": "Cantidad de folios en el CAF.",
            "format": "int64",
            "type": "integer"
          },
          "Dueno": {
            "description": "Persona que lo genero.",
            "type": [
              "string",
              "null"
            ]
          },
          "Fecha": {
            "description": "Fecha generacion. (dd-mm-aaaa)",
            "type": [
              "string",
              "null"
            ]
          },
          "FolioFinal": {
            "description": "Folio final del CAF.",
            "format": "int64",
            "type": "integer"
          },
          "FolioInicial": {
            "description": "Folio inicial del CAF.",
            "format": "int64",
            "type": "integer"
          },
          "RUTDueno": {
            "description": "RUT de la persona que lo genero.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "ConsultaMasivaRestultadoListar": {
        "description": "Resultado de la consulta de folios para anulación masiva.",
        "properties": {
          "Cafs": {
            "description": "Listado de CAfs generados.",
            "items": {
              "$ref": "#/components/schemas/ConsultaMasivaRestultadoCAF"
            },
            "type": [
              "array",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "CrearCertificacion": {
        "description": "Datos para crear una certificación: el certificado digital (PFX en base64 y su contraseña) y los sets a certificar.",
        "properties": {
          "CertData": {
            "description": "PFX del certificado, en base64. Dato sensible: no se registra en logs del integrador.",
            "format": "byte",
            "type": "string",
            "writeOnly": true
          },
          "Contrasenna": {
            "description": "Contraseñ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.",
            "type": "string",
            "writeOnly": true
          },
          "Sets": {
            "description": "Listado de sets a certificar.",
            "items": {
              "$ref": "#/components/schemas/Set"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "TodosSets": {
            "description": "Certificar todos los sets posibles según el SII. Si es `true`, `Sets` se ignora.",
            "type": "boolean"
          }
        },
        "required": [
          "CertData",
          "Contrasenna"
        ],
        "type": "object"
      },
      "DatosReiniciar": {
        "description": "Reinicia la certificación y, opcionalmente, actualiza sus datos.",
        "properties": {
          "Certificado": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Certificado"
              },
              {
                "type": "null"
              }
            ],
            "description": "Actualizar los datos del certificado. (v2+)"
          },
          "Direccion": {
            "description": "Direccion",
            "type": [
              "string",
              "null"
            ]
          },
          "DireccionRegional": {
            "description": "Direccion regional",
            "type": [
              "string",
              "null"
            ]
          },
          "Giro": {
            "description": "Giro comercial",
            "type": [
              "string",
              "null"
            ]
          },
          "Motivo": {
            "description": "Motivo por el cual se reinicia la certificación.",
            "type": [
              "string",
              "null"
            ]
          },
          "Paso": {
            "$ref": "#/components/schemas/ReiniciarProceso"
          },
          "Productos": {
            "description": "Listado de productos. (nombre;precio)",
            "items": {
              "$ref": "#/components/schemas/Producto"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "RazonSocial": {
            "description": "Razon social",
            "type": [
              "string",
              "null"
            ]
          },
          "Referencia": {
            "description": "Referencia",
            "type": [
              "string",
              "null"
            ]
          },
          "Servicios": {
            "description": "Listado de servicios. (nombre;precio)",
            "items": {
              "$ref": "#/components/schemas/Servicio"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "Sets": {
            "description": "Sets a certificar.",
            "items": {
              "$ref": "#/components/schemas/Set"
            },
            "type": [
              "array",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "DescargaCertificado": {
        "description": "Datos para descargar un certificado.",
        "properties": {
          "Contrasenna": {
            "description": "Contraseña de la cuenta en E-Cert. Dato sensible: no se registra en logs del integrador.",
            "type": [
              "string",
              "null"
            ],
            "writeOnly": true
          },
          "ContrasennaPfx": {
            "description": "Contraseña con la que E-Cert protege el PFX descargado. Dato sensible: no se registra en logs del integrador.",
            "type": [
              "string",
              "null"
            ],
            "writeOnly": true
          },
          "Usuario": {
            "description": "Usuario que viene en el correo de E-cert de descarga.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "Documento": {
        "description": "Información de los documento permitidos/denegados en el SII.",
        "properties": {
          "Codigo": {
            "description": "Codigo del tipo de documento.",
            "type": [
              "string",
              "null"
            ]
          },
          "FechaDenegado": {
            "description": "Denegado desde.",
            "type": [
              "string",
              "null"
            ]
          },
          "FechaPermitido": {
            "description": "Permitido desde.",
            "type": [
              "string",
              "null"
            ]
          },
          "Nombre": {
            "description": "Nombre del documento.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "Empresa": {
        "description": "Datos de la empresa.",
        "properties": {
          "Area": {
            "description": "Area, departamento o giro.",
            "type": [
              "string",
              "null"
            ]
          },
          "Ciudad": {
            "description": "Ciudad.",
            "type": "string"
          },
          "Comuna": {
            "description": "Comuna.",
            "type": "string"
          },
          "Direccion": {
            "description": "Direccion.",
            "type": "string"
          },
          "Nombre": {
            "description": "Nombre de la empresa.",
            "type": "string"
          },
          "Region": {
            "description": "Región, con el nombre exacto de la lista de la API: la comparación es literal y casi todos los nombres terminan en un espacio (p. ej. «METROPOLITANA DE SANTIAGO »).",
            "type": "string"
          },
          "Rut": {
            "description": "Cedula de identidad (RUT).",
            "type": "string"
          }
        },
        "required": [
          "Nombre",
          "Rut",
          "Direccion",
          "Region",
          "Ciudad",
          "Comuna"
        ],
        "type": "object"
      },
      "EmpresaInfo": {
        "description": "Informacion de una empresa.",
        "properties": {
          "Actecos": {
            "description": "Activiades economicas.",
            "items": {
              "$ref": "#/components/schemas/Acteco"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "Direccion": {
            "description": "Direccion (Leida desde el SII)",
            "type": [
              "string",
              "null"
            ]
          },
          "DireccionRegional": {
            "description": "Direccion regional (Leida desde el SII)",
            "type": [
              "string",
              "null"
            ]
          },
          "DocumentosHomo": {
            "description": "Documentos registrados en el SII (Homologación).",
            "items": {
              "$ref": "#/components/schemas/Documento"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "DocumentosProd": {
            "description": "Documentos registrados en el SII (Producíón).",
            "items": {
              "$ref": "#/components/schemas/Documento"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "FechaResolucion": {
            "description": "Fecha de resolución.",
            "type": [
              "string",
              "null"
            ]
          },
          "Giro": {
            "description": "Giro comercial (Leida desde el SII)",
            "type": [
              "string",
              "null"
            ]
          },
          "NumeroResolucion": {
            "description": "Número de resolución.",
            "format": "int32",
            "type": "integer"
          },
          "RUT": {
            "description": "RUT de la empresa consultada, normalizado por la API.",
            "type": [
              "string",
              "null"
            ]
          },
          "RazonSocial": {
            "description": "Razon social (Leida desde el SII)",
            "type": [
              "string",
              "null"
            ]
          },
          "Sucursales": {
            "description": "Sucursales registradas en el SII.",
            "items": {
              "$ref": "#/components/schemas/Sucursal"
            },
            "type": [
              "array",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "ErrorFramework": {
        "description": "Error de ASP.NET Web API: verbo incorrecto, media type no soportado, parámetro de query obligatorio ausente (404), parámetro que no convierte (400), request sin credenciales (401) o excepción no controlada. Una URL que no corresponde a ninguna operación en general no llega a la API y no responde con este objeto, sino con una página HTML del servidor web (inferido del código, no verificado contra el servidor desplegado).",
        "properties": {
          "ExceptionMessage": {
            "type": "string"
          },
          "ExceptionType": {
            "type": "string"
          },
          "Message": {
            "type": "string"
          },
          "MessageDetail": {
            "type": "string"
          },
          "StackTrace": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "Message"
        ],
        "type": "object"
      },
      "ErrorTextoPlano": {
        "description": "`CODIGO:mensaje`, `CODIGO:SUBCODIGO:mensaje -- excepción`, o el mensaje solo (403, 404, 410, 501).",
        "type": "string"
      },
      "Estadisticas": {
        "description": "Estadisticas de las certificaciones.",
        "properties": {
          "PorEstado": {
            "additionalProperties": {
              "format": "int32",
              "type": "integer"
            },
            "description": "Certificaciones en cada estado.",
            "propertyNames": {
              "enum": [
                "Creada",
                "EnProgreso",
                "Completada",
                "Error"
              ]
            },
            "type": [
              "object",
              "null"
            ]
          },
          "PorEtapa": {
            "additionalProperties": {
              "format": "int32",
              "type": "integer"
            },
            "description": "Certificaciones en cada etapa.",
            "propertyNames": {
              "enum": [
                "VerificacionSII",
                "IngresoDatos",
                "ConfiguracionSII",
                "DeclaracionFinal",
                "Completada"
              ]
            },
            "type": [
              "object",
              "null"
            ]
          },
          "PorPasoEnSII": {
            "additionalProperties": {
              "format": "int32",
              "type": "integer"
            },
            "description": "Certificaciones en cada paso.",
            "propertyNames": {
              "enum": [
                "Ninguno",
                "Postulacion",
                "Prueba",
                "Simulacion",
                "Intercambio",
                "MuestrasImpresas"
              ]
            },
            "type": [
              "object",
              "null"
            ]
          },
          "Total": {
            "description": "Total de certificaciones.",
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "EstadoCertificacion": {
        "description": "Posible estados de la certificación.",
        "enum": [
          0,
          1,
          2,
          3
        ],
        "format": "int32",
        "type": "integer",
        "x-enum-descriptions": [
          "Creada, pero no comenzada aún.",
          "En progreso.",
          "Finalizada.",
          "Con error"
        ],
        "x-enum-varnames": [
          "Creada",
          "EnProgreso",
          "Completada",
          "Error"
        ]
      },
      "EtapaCertificacion": {
        "description": "Etapas por las que transita la certificación.",
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "format": "int32",
        "type": "integer",
        "x-enum-descriptions": [
          "En verificación del SII. Usualmente el representante legal puede tener situaciones pendientes en el SII.",
          "Ingreso de datos.",
          "Proceso en el SII.",
          "Declaración final.",
          "Finalizada"
        ],
        "x-enum-varnames": [
          "VerificacionSII",
          "IngresoDatos",
          "ConfiguracionSII",
          "DeclaracionFinal",
          "Completada"
        ]
      },
      "PasoCertificacion": {
        "description": "Pasos por los que transita la certificación en el SII.",
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5
        ],
        "format": "int32",
        "type": "integer",
        "x-enum-descriptions": [
          "Aún no comienza el proceso.",
          "Postulación.",
          "Set de prueba.",
          "Set de simulación.",
          "Set de intercambio.",
          "Muestras impresas."
        ],
        "x-enum-varnames": [
          "Ninguno",
          "Postulacion",
          "Prueba",
          "Simulacion",
          "Intercambio",
          "MuestrasImpresas"
        ]
      },
      "Producto": {
        "description": "Datos del producto.",
        "properties": {
          "Nombre": {
            "description": "Nombre del producto.",
            "type": [
              "string",
              "null"
            ]
          },
          "Precio": {
            "description": "Precio del producto.",
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "RangoFolioAnulado": {
        "description": "Un rango de folios anulados.",
        "properties": {
          "Cantidad": {
            "description": "Cantidad de folios del rango, con los dos extremos incluidos: FolioFinal - FolioInicial + 1 (de 1667 a 2166 son 500; de 900 a 950, 51). Es de solo lectura: la calcula la API.",
            "format": "int64",
            "type": "integer"
          },
          "FolioFinal": {
            "description": "Ultimo folio anulado del rango, incluido.",
            "format": "int64",
            "type": "integer"
          },
          "FolioInicial": {
            "description": "Primer folio anulado del rango.",
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "ReiniciarProceso": {
        "description": "Procesos que se pueden reiniciar de la certificación.",
        "enum": [
          0,
          1,
          2
        ],
        "format": "int32",
        "type": "integer",
        "x-enum-descriptions": [
          "Reiniciar la certificación para que comience desde el set de prueba nuevamente.",
          "Rehacer solo las muestras impresas y enviarlas al SII.",
          "Continuar la certificación que estaba en verificación SII."
        ],
        "x-enum-varnames": [
          "Certificacion",
          "MuestrasImpresas",
          "VerificacionSII"
        ]
      },
      "RestultadoConsultaFolios": {
        "description": "Resultado de la consulta de uso folios.",
        "properties": {
          "UltimoAnulado": {
            "description": "Ultimo folio anulado. (Puede ser nulo si ocurre algun error)",
            "format": "int64",
            "type": [
              "integer",
              "null"
            ]
          },
          "UltimoAnuladoEstado": {
            "description": "Posibles estados: `OK`; `CODE_ERROR_ENTERPRISE_IS_MYPYME` (la empresa usa el sistema de facturación del SII y no es posible ver los folios anulados); `CODE_ERROR_CERTIFICATE_PERM` (el titular del certificado no tiene permisos para ver los documentos emitidos); `ERROR` (error no controlado).",
            "type": [
              "string",
              "null"
            ]
          },
          "UltimoEnviado": {
            "description": "Ultimo folio enviado. (Puede ser nulo si ocurre algun error)",
            "format": "int64",
            "type": [
              "integer",
              "null"
            ]
          },
          "UltimoEnviadoEstado": {
            "description": "Posibles estados: `OK`; `NO_FOLIO_IN_6_MONTHS` (no se encontraron documentos en los últimos 6 meses); `CODE_ERROR_CERTIFICATE_PERM` (el titular del certificado no tiene permisos para ver los documentos emitidos); `ERROR` (error no controlado).",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "RestultadoFoliosAnulados": {
        "description": "Resultado de la consulta de rangos de folios anulados. El nombre del esquema conserva la grafía histórica («Restultado»), igual que RestultadoConsultaFolios y AnulacionMasivaRestultadoAnular.",
        "properties": {
          "Estado": {
            "description": "Posibles estados: `OK`; `CODE_ERROR_ENTERPRISE_IS_MYPYME` (la empresa usa el sistema de facturación del SII y no es posible ver sus folios anulados); `CODE_ERROR_CERTIFICATE_PERM` (el titular del certificado no tiene permisos para ver los documentos emitidos). Una falla no controlada no llega en este campo: sale como HTTP 500 con el código `UKN`. La respuesta viaja con HTTP 200 aunque este campo traiga un `CODE_ERROR_*`, igual que en la consulta de uso de folios: un 200 no significa éxito; revise `Estado`.",
            "type": [
              "string",
              "null"
            ]
          },
          "Rangos": {
            "description": "Rangos de folios anulados, uno por fila de la tabla del SII y en el orden en que el SII los envía. Lista vacía cuando la empresa no registra folios anulados para el documento, y también cuando `Estado` trae un error. Nunca viene nula.",
            "items": {
              "$ref": "#/components/schemas/RangoFolioAnulado"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "Rut": {
            "description": "RUT de la empresa consultada, normalizado con guion y digito verificador.",
            "type": [
              "string",
              "null"
            ]
          },
          "TipoDocumento": {
            "description": "Tipo del documento DTE consultado.",
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "Servicio": {
        "description": "Datos del servicio.",
        "properties": {
          "Nombre": {
            "description": "Nombre del servicio.",
            "type": [
              "string",
              "null"
            ]
          },
          "Precio": {
            "description": "Precio del servicio.",
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "Set": {
        "description": "Sets posibles a certificar.",
        "enum": [
          33,
          34,
          39,
          41,
          43,
          46,
          52,
          110
        ],
        "format": "int32",
        "type": "integer",
        "x-enum-descriptions": [
          "SET Básico (33, 56, 61)",
          "SET Factura Exento (34, 56, 61)",
          "SET Boleta Afecta (39, 61)",
          "SET Boleta Exenta. (41, 61)",
          "Set Liquidación (43)",
          "Set Factura Compra (46, 56, 61)",
          "SET Guía de despacho (52)",
          "SET Exportación (110, 111, 112)"
        ],
        "x-enum-varnames": [
          "SetBasico",
          "SetExento",
          "SetBoletaAfecta",
          "SetBoletaExenta",
          "SetLiquidacion",
          "SetFacturaCompra",
          "SetGuiaDespacho",
          "SetExportacion"
        ]
      },
      "SolicitudCertificado": {
        "description": "Solicitud de certificado.",
        "properties": {
          "Empresa": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Empresa"
              },
              {
                "type": "null"
              }
            ],
            "description": "Datos de la empresa."
          },
          "Subscriptor": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Subscriptor"
              },
              {
                "type": "null"
              }
            ],
            "description": "Datos del representante legal."
          }
        },
        "type": "object"
      },
      "Subscriptor": {
        "description": "Datos del subscriptor",
        "properties": {
          "ApeMaterno": {
            "description": "Apellido materno.",
            "type": [
              "string",
              "null"
            ]
          },
          "ApePaterno": {
            "description": "Apellido paterno.",
            "type": "string"
          },
          "Ciudad": {
            "description": "Ciudad.",
            "type": "string"
          },
          "Comuna": {
            "description": "Comuna.",
            "type": "string"
          },
          "CopiaCedula": {
            "description": "Fotocopia de la cédula de identidad, en PDF codificado en base64, de hasta 2 MB.",
            "type": "string"
          },
          "Correo": {
            "description": "Correo electrónico.",
            "type": "string"
          },
          "Direccion": {
            "description": "Direccion.",
            "type": "string"
          },
          "Nombre": {
            "description": "Nombre del titular.",
            "type": "string"
          },
          "Region": {
            "description": "Región, con el nombre exacto de la lista de la API: la comparación es literal y casi todos los nombres terminan en un espacio (p. ej. «METROPOLITANA DE SANTIAGO »).",
            "type": "string"
          },
          "Rut": {
            "description": "Cedula de identidad (RUT).",
            "type": "string"
          },
          "Serie": {
            "description": "Número de serie de la cédula de identidad o número de documento.",
            "type": "string"
          },
          "Telefono": {
            "description": "Telefono.",
            "type": "string"
          }
        },
        "required": [
          "Nombre",
          "ApePaterno",
          "Rut",
          "Serie",
          "Direccion",
          "Region",
          "Ciudad",
          "Comuna",
          "Correo",
          "Telefono",
          "CopiaCedula"
        ],
        "type": "object"
      },
      "Sucursal": {
        "description": "Información de la sucursal.",
        "properties": {
          "Codigo": {
            "description": "Codigo de la sucursal.",
            "type": [
              "string",
              "null"
            ]
          },
          "Direccion": {
            "description": "Dirección.",
            "type": [
              "string",
              "null"
            ]
          },
          "TipoDireccion": {
            "description": "Tipo de dirección.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      }
    },
    "securitySchemes": {
      "basic": {
        "scheme": "basic",
        "type": "http"
      }
    }
  },
  "info": {
    "contact": {
      "email": "soporte@enrolamiento.cl",
      "name": "Soporte de Enrolamiento"
    },
    "description": "API de Enrolamiento: certificación de emisores de documentos tributarios electrónicos ante el\nSII, folios (CAF), certificados digitales y datos de empresas.\n\n## Autenticación\n\nHTTP Basic en cada request: el usuario es el `UserName` del cliente y la contraseña, su `APIKey`.\nSin el header, la API responde **401** con `{\"Message\": …}` en JSON; con otro esquema o con\ncredenciales inválidas, **401** sin cuerpo. En los dos casos manda `WWW-Authenticate: Basic`.\n\n## Formatos\n\nJSON. Mande siempre `Accept: application/json` y, en todo request con cuerpo,\n`Content-Type: application/json`: sin ese header el cuerpo no se lee como JSON, y qué hace la\nAPI en ese caso no está verificado. La API también negocia XML (`application/xml`, `text/xml`)\ncomo legado; este contrato documenta solo JSON.\n\nVarias lecturas son POST (las consultas de CAF y de empresa) porque el certificado viaja en el\ncuerpo.\n\n## Errores: cuatro familias\n\n- **Negocio** (`text/plain`): casi siempre **HTTP 500**, también para rechazos que no son fallas\n  (`INSUFICIENTE_SALDO`, `CERT_REQUERIDO`). El cuerpo es `CODIGO:mensaje` o\n  `CODIGO:SUBCODIGO:mensaje -- excepción`. Un 404 de negocio trae solo el mensaje («No existe una\n  certificación…»), igual que el 403. **El status no sirve para decidir un reintento; el código\n  sí**: cada código está clasificado en `x-errores` (raíz), y cada operación lista en\n  `x-reintentable` qué se reintenta solo, qué con cuidado y qué nunca, para los códigos de su\n  catálogo (`x-error-codes`). Esa lista no es completa: los códigos que se arman en tiempo de\n  ejecución no figuran en ninguna operación.\n  **Regla de respaldo:** un código que no figura en `x-reintentable` de la operación se resuelve con\n  `x-errores` aplicando la misma regla de idempotencia de la operación (`si` y\n  `x-idempotente: true` → automático; `si` sin eso, o `desconocido` → manual; `no` → nunca).\n  Desde la versión 1.1, cada error de negocio con código trae además `X-Codigo-Error` y\n  `X-Reintentable` (el valor de `x-errores` para ese código), y `Retry-After` cuando vale\n  reintentar.\n- **Framework** (`application/json`): verbo incorrecto, parámetro de query obligatorio ausente,\n  parámetro numérico de la ruta que no convierte (**400**) o excepción no controlada. Cuerpo\n  `{\"Message\": …}`; puede traer además el detalle (`MessageDetail` y, en un 500,\n  `ExceptionMessage`, `ExceptionType` y `StackTrace`), según la configuración del servidor.\n  No dependa del detalle. Desde la versión 1.1, una excepción no controlada de un tipo que la\n  API reconoce (las de negocio y las del certificado) ya no sale acá: sale como error de\n  negocio, `text/plain` con su código.\n- **Autenticación**: 401; con cuerpo JSON solo si falta el header `Authorization`.\n- **Rate limit**: 409, abajo.\n\nUna URL que no corresponde a ninguna operación (una ruta mal escrita, un segmento de más o de\nmenos) en general no llega a la API: el 404 lo responde el servidor web con una página HTML, no\ncon JSON. Esto se infiere del código y no está verificado contra el servidor desplegado. Para\nclasificar un 404, reconozca en positivo el de negocio: texto plano que empieza con «No existe\nuna certificación…». Cualquier otro 404 es una URL que no corresponde a ninguna operación: un\nJSON con `Message` o una página HTML del servidor.\n\n## Rate limit\n\nLa API limita a **120 requests por minuto**. El límite no se cuenta por credencial: se cuenta\npor la dirección de red desde la que la conexión llega al servidor de la aplicación, que\ndetrás de la infraestructura actual es la de un intermediario de red, y no la del cliente. El\ncupo podría entonces compartirse con otros clientes, y un cliente podría recibir el rechazo sin\nhaber hecho 120 requests propios. Esto no está verificado contra el servidor desplegado, que\npodría contar por cliente. No asuma un cupo propio de 120 por minuto.\n\nEl rechazo es **`409 Conflict`** —no `429`— con el cuerpo de texto\n`The allowed number of requests has been exceeded.` (no es JSON). El código de la API lo emite\ncon `Content-Type: text/plain; charset=utf-8`; que ninguna capa intermedia lo cambie no está\nverificado contra el servidor desplegado, así que lea el cuerpo como texto sin depender del\nheader.\n\nToda respuesta de la API trae `RateLimit-Limit` (hoy `120`) y `RateLimit-Remaining` (en un 409,\n`0`). **No hay `Retry-After`.** La ventana es fija, de 60 segundos desde el primer request que\nla abrió; los requests rechazados también cuentan. El contador vive en la memoria del proceso\nde la aplicación y vuelve a cero cuando ese proceso se recicla. Ante un 409, esperar al menos\n60 segundos antes de reintentar.",
    "title": "API de Enrolamiento",
    "version": "1.1.0"
  },
  "openapi": "3.1.0",
  "paths": {
    "/v1/caf/{rut}/anulacion-masiva/{tipoDocumento}/anular/{folioInicial}/{folioFinal}": {
      "post": {
        "description": "Anula en forma masiva los folios emitidos de un CAF. **Irreversible.** Opera siempre en el SII de producción: la ruta no recibe ambiente y un `?ambiente=0` se ignora. Para probar sin tocar el SII, usar el RUT 1-9 o un RUT de prueba del cliente.",
        "operationId": "caf_v1_anulacion_masiva_anular",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Tipo del documento DTE.",
            "in": "path",
            "name": "tipoDocumento",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Folio inicial del CAF",
            "in": "path",
            "name": "folioInicial",
            "required": true,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Folio final del CAF",
            "in": "path",
            "name": "folioFinal",
            "required": true,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Mensaje de annulacion. (por defecto: ANTIGUOS)",
            "in": "query",
            "name": "mensaje",
            "required": false,
            "schema": {
              "default": "ANTIGUOS",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Datos del certificado.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "Anulados": 10
                },
                "schema": {
                  "$ref": "#/components/schemas/AnulacionMasivaRestultadoAnular"
                }
              }
            },
            "description": "Estado 200: Devuelve la cantidad de folios anulados. ----\n\nEstado 500: En caso de no tener permiso la empresa, el siguiente mensaje: \"CONTRIBUYENTE_SIN_PERMISO:Error consultado folios en el SII. El contribuyente Rut xxxxxxx-x, no está habilitado para ingresar a esta opción\"",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ParametroInvalido"
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Anular folios emitidos de forma masiva para un CAF.",
        "tags": [
          "CAF"
        ],
        "x-ambiente-fijo": "produccion",
        "x-error-codes": [
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "SII_CALL_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": "desconocido",
        "x-irreversible": true,
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL",
            "SII_CALL_ERROR",
            "SII_ERROR_CXN"
          ],
          "nunca": [
            "CERT_REQUERIDO"
          ]
        },
        "x-sdk-group": "caf",
        "x-sdk-name": "anulacion_masiva.anular",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "# IRREVERSIBLE: opera siempre en producción\ncurl --request POST \\\n  --url https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/anular/1/1 \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "// IRREVERSIBLE: opera siempre en producción\nusing System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/anular/1/1\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n// IRREVERSIBLE: opera siempre en producción\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/anular/1/1', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "// IRREVERSIBLE: opera siempre en producción\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/anular/1/1\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "# IRREVERSIBLE: opera siempre en producción\nimport requests\n\nurl = \"https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/anular/1/1\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "// IRREVERSIBLE: opera siempre en producción\nconst options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/anular/1/1', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/caf/{rut}/anulacion-masiva/{tipoDocumento}/listar": {
      "post": {
        "description": "Lista los CAF emitidos que se pueden anular en forma masiva. Opera siempre en el SII de producción: la ruta no recibe ambiente y un `?ambiente=0` se ignora. Para probar sin tocar el SII, usar el RUT 1-9 o un RUT de prueba del cliente.",
        "operationId": "caf_v1_anulacion_masiva_listar",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Tipo del documento DTE.",
            "in": "path",
            "name": "tipoDocumento",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Datos del certificado.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "Cafs": [
                    {
                      "Cantidad": 100,
                      "Dueno": "Comercial Ejemplo SpA",
                      "Fecha": "05-01-2026",
                      "FolioFinal": 1100,
                      "FolioInicial": 1001,
                      "RUTDueno": "11111111-1"
                    }
                  ]
                },
                "schema": {
                  "$ref": "#/components/schemas/ConsultaMasivaRestultadoListar"
                }
              }
            },
            "description": "Estado 200: Listado de CAFs emitidos que pueden ser anulados. ---\n\nEstado 500: En caso de no tener permiso la empresa, el siguiente mensaje: \"CONTRIBUYENTE_SIN_PERMISO:Error consultado folios en el SII. El contribuyente Rut xxxxxxx-x, no está habilitado para ingresar a esta opción\"",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ParametroInvalido"
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Consultar el listado de folios emitidos para anulación masiva.",
        "tags": [
          "CAF"
        ],
        "x-ambiente-fijo": "produccion",
        "x-error-codes": [
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "SII_CALL_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": true,
        "x-reintentable": {
          "automatico": [
            "409",
            "SII_ERROR_CXN"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL",
            "SII_CALL_ERROR"
          ],
          "nunca": [
            "CERT_REQUERIDO"
          ]
        },
        "x-sdk-group": "caf",
        "x-sdk-name": "anulacion_masiva.listar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "# Opera siempre en producción\ncurl --request POST \\\n  --url https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/listar \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "// Opera siempre en producción\nusing System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/listar\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n// Opera siempre en producción\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/listar', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "// Opera siempre en producción\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/listar\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "# Opera siempre en producción\nimport requests\n\nurl = \"https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/listar\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "// Opera siempre en producción\nconst options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/caf/1-9/anulacion-masiva/1/listar', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/caf/{rut}/anulados/{tipoDocumento}": {
      "post": {
        "description": "Consultar los rangos de folios anulados para el tipo de documento.",
        "operationId": "caf_v1_anulados",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Tipo del documento DTE.",
            "in": "path",
            "name": "tipoDocumento",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Ambiente 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.",
            "example": 0,
            "in": "query",
            "name": "ambiente",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Ambiente",
              "default": 1
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Datos del certificado.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "Estado": "OK",
                  "Rangos": [
                    {
                      "Cantidad": 10,
                      "FolioFinal": 110,
                      "FolioInicial": 101
                    }
                  ],
                  "Rut": "11111111-1",
                  "TipoDocumento": 33
                },
                "schema": {
                  "$ref": "#/components/schemas/RestultadoFoliosAnulados"
                }
              }
            },
            "description": "Antes que nada, el parámetro `ambiente`: si no se envía, se consulta el SII de producción y el\ncertificado se valida también contra producción. Un certificado habilitado solo en el ambiente de\ncertificación del SII queda rechazado ahí, y el error que vuelve habla del certificado y no de los\nfolios anulados: antes de revisar el PFX, la contraseña o los permisos, verifique que envió\n`ambiente=0`.\n\nEstado 200: `Rut`, `TipoDocumento`, `Estado` y `Rangos`, con una entrada en `Rangos` por cada fila\nde la tabla del SII y en el mismo orden en que el SII las envía. Cada rango trae `FolioInicial`,\n`FolioFinal` y `Cantidad`, donde `Cantidad` = `FolioFinal` - `FolioInicial` + 1, con los dos\nextremos incluidos. `Rangos` nunca viene nula: es una lista vacía cuando la empresa no registra\nfolios anulados. Para el RUT 1-9 y para los RUT de integración del perfil del cliente no se\nconsulta al SII y la respuesta es siempre `Estado` \"OK\" con `Rangos` vacía, lo mismo que devuelve\nuna empresa real sin folios anulados. **Un 200 no significa éxito.** Los rechazos conocidos del\nSII también vuelven con HTTP 200, con el código en `Estado` y `Rangos` vacía; los valores\nposibles de `Estado` son \"OK\", \"CODE_ERROR_CERTIFICATE_PERM\" (el titular del certificado no tiene\npermisos para ver los documentos emitidos) y \"CODE_ERROR_ENTERPRISE_IS_MYPYME\" (la empresa usa el\nsistema de facturación del SII y no es posible ver sus folios anulados). Hay que mirar `Estado`,\nno solo el código HTTP.\n\nEstado 500: el cuerpo trae el código y el mensaje separados por dos puntos. Si no viene el cuerpo\ndel POST, o viene sin `Data` o sin `Contrasenna`: \"CERT_REQUERIDO:Los datos del certificado son\nrequeridos.\". Si el certificado no se puede validar, se propaga el error de la validación tal\ncual, con su propio código. Para cualquier otra falla consultando el SII: \"UKN:Error consultado\nfolios anulados en el SII.\" seguido del detalle del error.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ParametroInvalido"
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Consultar los rangos de folios anulados para el tipo de documento.",
        "tags": [
          "CAF"
        ],
        "x-error-codes": [
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": true,
        "x-reintentable": {
          "automatico": [
            "409",
            "SII_ERROR_CXN"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL"
          ],
          "nunca": [
            "CERT_REQUERIDO"
          ]
        },
        "x-sdk-group": "caf",
        "x-sdk-name": "anulados",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url 'https://api.enrolamiento.cl/v1/caf/1-9/anulados/1?ambiente=0' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/caf/1-9/anulados/1?ambiente=0\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/caf/1-9/anulados/1?ambiente=0', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/caf/1-9/anulados/1?ambiente=0\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/caf/1-9/anulados/1?ambiente=0\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/caf/1-9/anulados/1?ambiente=0', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/caf/{rut}/anular/{tipoDocumento}/{inicio}/{fin}": {
      "post": {
        "description": "Anula un rango de folios en el SII, en el ambiente que diga `ambiente` (si se omite, producción). **Irreversible.** Repetirla con el mismo rango es seguro: si ya estaba anulado, el SII responde que la anulación ya se efectuó y la API lo toma como éxito. Una anulación que falla a mitad puede haber anulado igual.",
        "operationId": "caf_v1_anular",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Tipo del documento DTE.",
            "in": "path",
            "name": "tipoDocumento",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Folio inicial.",
            "in": "path",
            "name": "inicio",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Folio final.",
            "in": "path",
            "name": "fin",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Ambiente 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 tampoco da error y también corre en producción.",
            "example": 0,
            "in": "query",
            "name": "ambiente",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Ambiente",
              "default": 1
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Datos del certificado.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": true,
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "description": "true si el rango quedó anulado. Si ya hay una solicitud de folios en curso para este RUT y tipo de documento, responde 429 (CAF_REQUEST_IN_PROGRESS) con el header Retry-After.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ParametroInvalido"
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "429": {
            "content": {
              "text/plain": {
                "example": "CAF_REQUEST_IN_PROGRESS:Ya existe una solicitud de folios en curso para este RUT y tipo de documento. Reintente en 30 segundos.",
                "schema": {
                  "$ref": "#/components/schemas/ErrorTextoPlano"
                }
              }
            },
            "description": "Ya hay una solicitud de folios en curso para este RUT y tipo de documento. Solo ocurre si su cuenta tiene habilitado el control de solicitudes concurrentes de CAF: la API espera primero a que la otra termine (por omisión, hasta 60 segundos). El request no se ejecutó.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de reintentar.",
                "schema": {
                  "example": 30,
                  "format": "int32",
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Anular un rango de folios en el SII.",
        "tags": [
          "CAF"
        ],
        "x-error-codes": [
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": true,
        "x-irreversible": true,
        "x-reintentable": {
          "automatico": [
            "409",
            "429",
            "SII_ERROR_CXN"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL"
          ],
          "nunca": [
            "CERT_REQUERIDO"
          ]
        },
        "x-sdk-ambiente-obligatorio": true,
        "x-sdk-group": "caf",
        "x-sdk-name": "anular",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "# IRREVERSIBLE\ncurl --request POST \\\n  --url 'https://api.enrolamiento.cl/v1/caf/1-9/anular/1/1/1?ambiente=0' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "// IRREVERSIBLE\nusing System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/caf/1-9/anular/1/1/1?ambiente=0\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n// IRREVERSIBLE\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/caf/1-9/anular/1/1/1?ambiente=0', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "// IRREVERSIBLE\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/caf/1-9/anular/1/1/1?ambiente=0\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "# IRREVERSIBLE\nimport requests\n\nurl = \"https://api.enrolamiento.cl/v1/caf/1-9/anular/1/1/1?ambiente=0\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "// IRREVERSIBLE\nconst options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/caf/1-9/anular/1/1/1?ambiente=0', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/caf/{rut}/consulta/{tipoDocumento}": {
      "post": {
        "description": "Consultar el último folio emitido para el tipo de documento.",
        "operationId": "caf_v1_consulta",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Tipo del documento DTE.",
            "in": "path",
            "name": "tipoDocumento",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Ambiente 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.",
            "example": 0,
            "in": "query",
            "name": "ambiente",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Ambiente",
              "default": 1
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Datos del certificado.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "UltimoAnulado": 1200,
                  "UltimoAnuladoEstado": "OK",
                  "UltimoEnviado": 1500,
                  "UltimoEnviadoEstado": "OK"
                },
                "schema": {
                  "$ref": "#/components/schemas/RestultadoConsultaFolios"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ParametroInvalido"
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Consultar el último folio emitido para el tipo de documento.",
        "tags": [
          "CAF"
        ],
        "x-error-codes": [
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": true,
        "x-reintentable": {
          "automatico": [
            "409",
            "SII_ERROR_CXN"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL"
          ],
          "nunca": [
            "CERT_REQUERIDO"
          ]
        },
        "x-sdk-group": "caf",
        "x-sdk-name": "consulta",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url 'https://api.enrolamiento.cl/v1/caf/1-9/consulta/1?ambiente=0' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/caf/1-9/consulta/1?ambiente=0\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/caf/1-9/consulta/1?ambiente=0', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/caf/1-9/consulta/1?ambiente=0\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/caf/1-9/consulta/1?ambiente=0\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/caf/1-9/consulta/1?ambiente=0', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/caf/{rut}/descargar/{tipoDocumento}/{cantidad}": {
      "post": {
        "description": "Pide un CAF nuevo al SII, en el ambiente que diga `ambiente` (si se omite, producción). **No es idempotente:** cada llamada timbra folios nuevos. Ante un error dudoso, consultar el último folio (caf_v1_consulta) o reobtener (caf_v1_reobtener) antes de volver a pedir. El certificado se valida siempre contra el SII de producción, aunque el CAF se pida con `ambiente=0`: un certificado habilitado solo en el ambiente de certificación del SII queda rechazado, y el error habla del certificado y no del ambiente.",
        "operationId": "caf_v1_descargar",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Tipo del documento DTE.",
            "in": "path",
            "name": "tipoDocumento",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Cantidad de folios a descargar.",
            "in": "path",
            "name": "cantidad",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Último folio generado por el SII. (El sistema devolverá un CAF que comience mínimo en {ultimoFolio}+1)",
            "in": "query",
            "name": "ultimoFolio",
            "required": false,
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Ambiente 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 tampoco da error y también corre en producción.",
            "example": 0,
            "in": "query",
            "name": "ambiente",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Ambiente",
              "default": 1
            }
          },
          {
            "description": "Si se desea descargar CAF con más de 3 meses de antigüedad. Por omisión solo se devuelven CAF recientes.",
            "in": "query",
            "name": "descargarCafAntiguos",
            "required": false,
            "schema": {
              "default": false,
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Datos del certificado.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": "RWplbXBsbzogbm8gZXMgdW4gQ0FGIHJlYWwu",
                "schema": {
                  "format": "byte",
                  "type": "string"
                }
              }
            },
            "description": "Los bytes del CAF. Si ya hay una solicitud de folios en curso para este RUT y tipo de documento, responde 429 (CAF_REQUEST_IN_PROGRESS) con el header Retry-After: reintentar pasados esos segundos.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ParametroInvalido"
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "429": {
            "content": {
              "text/plain": {
                "example": "CAF_REQUEST_IN_PROGRESS:Ya existe una solicitud de folios en curso para este RUT y tipo de documento. Reintente en 30 segundos.",
                "schema": {
                  "$ref": "#/components/schemas/ErrorTextoPlano"
                }
              }
            },
            "description": "Ya hay una solicitud de folios en curso para este RUT y tipo de documento. Solo ocurre si su cuenta tiene habilitado el control de solicitudes concurrentes de CAF: la API espera primero a que la otra termine (por omisión, hasta 60 segundos). El request no se ejecutó. Si el 429 llega al reintentar una descarga propia cuya respuesta no recibió, la solicitud en curso puede ser esa misma: antes de repetir, consulte con caf_v1_consulta o recupere con caf_v1_reobtener si el CAF quedó timbrado.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de reintentar.",
                "schema": {
                  "example": 30,
                  "format": "int32",
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Descargar un CAF desde el SII.",
        "tags": [
          "CAF"
        ],
        "x-error-codes": [
          {
            "codigo": "AUT_COMP_ACTIVITIES_VERIFICATION",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "AUT_COMP_OR_REP_SITUATION",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "AUT_DOCTYPE_NOT_AUTHORIZED",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "CAF_DENIED_SII_EXCEED",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "CAF_DENIED_SII_NOTENOUGH",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "CAF_UNKNOWN",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "CERT_AUTH_NOT_CONFIGURED",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "CERT_REVOCADO",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "CNX_HTTP_ERROR_500",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "CNX_HTTP_ERROR_CLOSED",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "CNX_HTTP_ERROR_REMOTE",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "CNX_HTTP_ERROR_RETRY",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "CNX_HTTP_ERROR_SSLTLS",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "CNX_HTTP_ERROR_TIMEOUT",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "RESP_HTTP_ERROR",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "SEC_CERT_NOT_AUTHORIZED",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "SEC_EMP_NOT_AUTHORIZED",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "SEC_USER_BOLSII",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "SEC_USER_NOT_AUTHENTICATED",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          },
          {
            "codigo": "UKN",
            "familia": "negocio-dinamico",
            "mensaje": "EL SII no autoriza timbraje, es posible que ya usted tenga suficientes folios para emitir facturas. En caso contrario contacte el SII.",
            "status": 500
          }
        ],
        "x-idempotente": false,
        "x-reintentable": {
          "automatico": [
            "409",
            "429"
          ],
          "manual": [
            "CAF_UNKNOWN",
            "CNX_HTTP_ERROR_500",
            "CNX_HTTP_ERROR_CLOSED",
            "CNX_HTTP_ERROR_REMOTE",
            "CNX_HTTP_ERROR_RETRY",
            "CNX_HTTP_ERROR_SSLTLS",
            "CNX_HTTP_ERROR_TIMEOUT",
            "ERROR_GENERAL",
            "RESP_HTTP_ERROR",
            "SEC_USER_NOT_AUTHENTICATED",
            "UKN"
          ],
          "nunca": [
            "AUT_COMP_ACTIVITIES_VERIFICATION",
            "AUT_COMP_OR_REP_SITUATION",
            "AUT_DOCTYPE_NOT_AUTHORIZED",
            "CAF_DENIED_SII_EXCEED",
            "CAF_DENIED_SII_NOTENOUGH",
            "CERT_AUTH_NOT_CONFIGURED",
            "CERT_REVOCADO",
            "SEC_CERT_NOT_AUTHORIZED",
            "SEC_EMP_NOT_AUTHORIZED",
            "SEC_USER_BOLSII"
          ]
        },
        "x-sdk-ambiente-obligatorio": true,
        "x-sdk-group": "caf",
        "x-sdk-name": "descargar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url 'https://api.enrolamiento.cl/v1/caf/1-9/descargar/1/1?ambiente=0' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/caf/1-9/descargar/1/1?ambiente=0\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/caf/1-9/descargar/1/1?ambiente=0', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/caf/1-9/descargar/1/1?ambiente=0\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/caf/1-9/descargar/1/1?ambiente=0\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/caf/1-9/descargar/1/1?ambiente=0', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/caf/{rut}/reobtener/{tipoDocumento}": {
      "post": {
        "description": "Reobtener el último CAF desde el SII para el ambiente indicado. El certificado se valida siempre contra el SII de producción, aunque el CAF se pida con `ambiente=0`: un certificado habilitado solo en el ambiente de certificación del SII queda rechazado, y el error habla del certificado y no del ambiente.",
        "operationId": "caf_v1_reobtener",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Tipo del documento DTE.",
            "in": "path",
            "name": "tipoDocumento",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "description": "Ambiente 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 tampoco da error y también corre en producción.",
            "example": 0,
            "in": "query",
            "name": "ambiente",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Ambiente",
              "default": 1
            }
          },
          {
            "description": "Si se desea descargar CAF con más de 3 meses de antigüedad. Por omisión solo se devuelven CAF recientes.",
            "in": "query",
            "name": "descargarCafAntiguos",
            "required": false,
            "schema": {
              "default": false,
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Datos del certificado.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": "RWplbXBsbzogbm8gZXMgdW4gQ0FGIHJlYWwu",
                "schema": {
                  "format": "byte",
                  "type": "string"
                }
              }
            },
            "description": "Los bytes del CAF reobtenido. Si ya hay una solicitud de folios en curso para este RUT y tipo de documento, responde 429 (CAF_REQUEST_IN_PROGRESS) con el header Retry-After: reintentar pasados esos segundos.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ParametroInvalido"
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "429": {
            "content": {
              "text/plain": {
                "example": "CAF_REQUEST_IN_PROGRESS:Ya existe una solicitud de folios en curso para este RUT y tipo de documento. Reintente en 30 segundos.",
                "schema": {
                  "$ref": "#/components/schemas/ErrorTextoPlano"
                }
              }
            },
            "description": "Ya hay una solicitud de folios en curso para este RUT y tipo de documento. Solo ocurre si su cuenta tiene habilitado el control de solicitudes concurrentes de CAF: la API espera primero a que la otra termine (por omisión, hasta 60 segundos). El request no se ejecutó.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "Retry-After": {
                "description": "Segundos a esperar antes de reintentar.",
                "schema": {
                  "example": 30,
                  "format": "int32",
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Reobtener el último CAF desde el SII para el ambiente indicado.",
        "tags": [
          "CAF"
        ],
        "x-error-codes": [
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": true,
        "x-reintentable": {
          "automatico": [
            "409",
            "429",
            "SII_ERROR_CXN"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL"
          ],
          "nunca": [
            "CERT_REQUERIDO"
          ]
        },
        "x-sdk-group": "caf",
        "x-sdk-name": "reobtener",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url 'https://api.enrolamiento.cl/v1/caf/1-9/reobtener/1?ambiente=0' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/caf/1-9/reobtener/1?ambiente=0\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/caf/1-9/reobtener/1?ambiente=0', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/caf/1-9/reobtener/1?ambiente=0\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/caf/1-9/reobtener/1?ambiente=0\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/caf/1-9/reobtener/1?ambiente=0', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificaciones/buscar/{pagina}/{cantidadPorPagina}": {
      "get": {
        "description": "Lista las certificaciones del cliente, de la más reciente a la más antigua (por número de\ncertificación, descendente), de a `cantidadPorPagina` por página. La respuesta es un array, sin\ntotal.\n\nFiltros por query string. El nombre distingue mayúsculas (`estado` se ignora) y un valor vacío\nse ignora:\n\n- `Fecha` y `RUT` se aplican **antes** de paginar.\n- `Estado`, `Estapa` y `PasoEnSII` se aplican **después de paginar**, sobre la página ya\n  cortada: una página puede traer menos filas que `cantidadPorPagina`, o ninguna, aunque haya\n  coincidencias en otras páginas. Para filtrar por esos campos sin perder filas, pida las páginas\n  sin ellos y filtre del lado del cliente.\n\n`cantidadPorPagina` no tiene tope en la API; se recomienda no pasar de 100. `pagina` menor que 1\nproduce un 500.",
        "operationId": "certificaciones_v1_buscar",
        "parameters": [
          {
            "description": "Página, desde 1. Menor que 1 produce un 500.",
            "in": "path",
            "name": "pagina",
            "required": true,
            "schema": {
              "format": "int32",
              "minimum": 1,
              "type": "integer"
            },
            "x-default-en-ruta": 1,
            "x-restriccion-en-ruta": "int"
          },
          {
            "description": "Filas por página. La API no impone tope; se recomienda no pasar de 100.",
            "in": "path",
            "name": "cantidadPorPagina",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            },
            "x-default-en-ruta": 20,
            "x-restriccion-en-ruta": "int"
          },
          {
            "description": "`aaaammdd-aaaammdd`: certificaciones con algún cambio de estado en el rango. Sin fin, hasta ahora. El fin cuenta desde las 00:00 de ese día, así que el día final queda prácticamente afuera. Se aplica antes de paginar. Formato inválido → 500 del framework.",
            "example": "20260901-20260930",
            "in": "query",
            "name": "Fecha",
            "required": false,
            "schema": {
              "pattern": "^\\d{8}(-\\d{8})?$",
              "type": "string"
            }
          },
          {
            "description": "RUT de la empresa, comparado tal cual, sin normalizar: sin puntos, con guion y la K en mayúscula. Se aplica antes de paginar.",
            "example": "11111111-1",
            "in": "query",
            "name": "RUT",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Nombre o número de `EstadoCertificacion` (Creada, EnProgreso, Completada, Error), sensible a mayúsculas; inválido → 500 del framework. Se aplica **después de paginar**.",
            "example": "Error",
            "in": "query",
            "name": "Estado",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Nombre o número de `EtapaCertificacion` (VerificacionSII, IngresoDatos, ConfiguracionSII, DeclaracionFinal, Completada), sensible a mayúsculas; inválido → 500 del framework. **Así se llama**: `Etapa` se ignora sin aviso. Se aplica **después de paginar**.",
            "example": "ConfiguracionSII",
            "in": "query",
            "name": "Estapa",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Nombre o número de `PasoCertificacion` (Ninguno, Postulacion, Prueba, Simulacion, Intercambio, MuestrasImpresas), sensible a mayúsculas; inválido → 500 del framework. Se aplica **después de paginar**.",
            "example": "Prueba",
            "in": "query",
            "name": "PasoEnSII",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": [
                  {
                    "Actecos": [
                      {
                        "AffectoIva": "SI",
                        "Codigo": "620200",
                        "Nombre": "Actividades de consultoría informática"
                      }
                    ],
                    "ClasificacionError": 0,
                    "CodigoError": null,
                    "Comentario": "Set de prueba enviado al SII.",
                    "Direccion": "Calle Ejemplo 123, Santiago",
                    "DireccionModificada": "Calle Ejemplo 123, Santiago",
                    "DireccionRegional": "Santiago Centro",
                    "DireccionRegionalModificada": "Santiago Centro",
                    "Estado": 1,
                    "Etapa": 2,
                    "Fecha": "2026-09-30T10:09:00",
                    "FechaEstado": "2026-10-01T09:12:00",
                    "Giro": "Desarrollo de software",
                    "GiroModificado": "Desarrollo de software",
                    "HorasEnEstado": 23,
                    "PasoEnSII": 2,
                    "Productos": [
                      {
                        "Nombre": "Licencia mensual",
                        "Precio": 10000
                      }
                    ],
                    "RUT": "11111111-1",
                    "RazonSocial": "Comercial Ejemplo SpA",
                    "RazonSocialModificada": "Comercial Ejemplo SpA",
                    "Reinicios": 0,
                    "Servicios": [
                      {
                        "Nombre": "Implementación",
                        "Precio": 100000
                      }
                    ],
                    "Sets": [
                      110
                    ]
                  },
                  {
                    "Actecos": [
                      {
                        "AffectoIva": "SI",
                        "Codigo": "473000",
                        "Nombre": "Venta al por menor de combustibles"
                      }
                    ],
                    "ClasificacionError": 0,
                    "CodigoError": null,
                    "Comentario": "Certificación completada.",
                    "Direccion": "Avenida Prueba 456, Valparaíso",
                    "DireccionModificada": "Avenida Prueba 456, Valparaíso",
                    "DireccionRegional": "Valparaíso",
                    "DireccionRegionalModificada": "Valparaíso",
                    "Estado": 2,
                    "Etapa": 4,
                    "Fecha": "2026-09-28T15:12:00",
                    "FechaEstado": "2026-10-05T16:40:00",
                    "Giro": "Venta al por menor",
                    "GiroModificado": "Venta al por menor",
                    "HorasEnEstado": null,
                    "PasoEnSII": 5,
                    "Productos": [
                      {
                        "Nombre": "Producto de ejemplo",
                        "Precio": 1000
                      }
                    ],
                    "RUT": "22222222-2",
                    "RazonSocial": "Distribuidora Ejemplo Ltda.",
                    "RazonSocialModificada": "Distribuidora Ejemplo Ltda.",
                    "Reinicios": 1,
                    "Servicios": [
                      {
                        "Nombre": "Servicio de ejemplo",
                        "Precio": 150000
                      }
                    ],
                    "Sets": [
                      33,
                      34,
                      46,
                      43,
                      52,
                      110
                    ]
                  }
                ],
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/Certificacion"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Listado de certificaciones.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Buscar certificación, especificando un set de filtros.",
        "tags": [
          "Certificaciones v1"
        ],
        "x-error-codes": [],
        "x-idempotente": true,
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [],
          "nunca": []
        },
        "x-sdk-group": "certificaciones.v1",
        "x-sdk-name": "buscar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request GET \\\n  --url https://api.enrolamiento.cl/v1/certificaciones/buscar/1/1 \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Get,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificaciones/buscar/1/1\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('GET', 'https://api.enrolamiento.cl/v1/certificaciones/buscar/1/1', [\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificaciones/buscar/1/1\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .method(\"GET\", HttpRequest.BodyPublishers.noBody())\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificaciones/buscar/1/1\"\n\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\"\n}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'GET',\n  headers: {Accept: 'application/json', Authorization: 'Basic <base64 de usuario:apikey>'}\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificaciones/buscar/1/1', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificaciones/stats": {
      "get": {
        "description": "Muestra estadisticas de las certificaciones.\n\nEj: Cantidad en proceso, completadas o error. Cantidad por paso o etapa.",
        "operationId": "certificaciones_v1_stats",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "PorEstado": {
                    "Completada": 3300,
                    "Creada": 120,
                    "EnProgreso": 410,
                    "Error": 140
                  },
                  "PorEtapa": {
                    "Completada": 3300,
                    "ConfiguracionSII": 380,
                    "DeclaracionFinal": 80,
                    "IngresoDatos": 150,
                    "VerificacionSII": 60
                  },
                  "PorPasoEnSII": {
                    "Intercambio": 60,
                    "MuestrasImpresas": 3300,
                    "Ninguno": 330,
                    "Postulacion": 40,
                    "Prueba": 150,
                    "Simulacion": 90
                  },
                  "Total": 3970
                },
                "schema": {
                  "$ref": "#/components/schemas/Estadisticas"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Muestra estadisticas de las certificaciones.",
        "tags": [
          "Certificaciones v1"
        ],
        "x-error-codes": [],
        "x-idempotente": true,
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [],
          "nunca": []
        },
        "x-sdk-group": "certificaciones.v1",
        "x-sdk-name": "stats",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request GET \\\n  --url https://api.enrolamiento.cl/v1/certificaciones/stats \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Get,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificaciones/stats\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('GET', 'https://api.enrolamiento.cl/v1/certificaciones/stats', [\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificaciones/stats\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .method(\"GET\", HttpRequest.BodyPublishers.noBody())\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificaciones/stats\"\n\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\"\n}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'GET',\n  headers: {Accept: 'application/json', Authorization: 'Basic <base64 de usuario:apikey>'}\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificaciones/stats', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificaciones/{rut}/actualizar": {
      "post": {
        "description": "Actualizar los datos de una certificación.",
        "operationId": "certificaciones_v1_actualizar",
        "parameters": [
          {
            "description": "RUT de la empresa",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Direccion": "Calle Ejemplo 123, Santiago",
                "Giro": "Desarrollo de software",
                "Productos": [
                  {
                    "Nombre": "Licencia mensual",
                    "Precio": 10000
                  }
                ],
                "RazonSocial": "Comercial Ejemplo SpA",
                "Referencia": "Pedido 42",
                "Servicios": [
                  {
                    "Nombre": "Implementación",
                    "Precio": 100000
                  }
                ],
                "Sets": [
                  33
                ]
              },
              "schema": {
                "$ref": "#/components/schemas/ActualizarCertificacion"
              }
            }
          },
          "description": "Datos de la certificación para actualizarlos. (No requerido)",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": true,
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Actualizar los datos de una certificación.",
        "tags": [
          "Certificaciones v1"
        ],
        "x-error-codes": [
          {
            "familia": "negocio",
            "status": 404
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "SET_AMBAS_BOLETAS_JUNTAS",
            "familia": "negocio",
            "mensaje": "No se puede certificar ambos SET de Boleta (Afecta y Exenta) en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_DTE_BOLETA_JUNTOS",
            "familia": "negocio",
            "mensaje": "No se pueden certificar SET de DTE y Boletas en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe especificar al menos un SET para certificar.",
            "status": 500
          },
          {
            "codigo": "VALOR_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Se debe espeficiar al menos un valor a actualizar.",
            "status": 500
          }
        ],
        "x-idempotente": true,
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "ERROR_GENERAL"
          ],
          "nunca": [
            "SET_AMBAS_BOLETAS_JUNTAS",
            "SET_DTE_BOLETA_JUNTOS",
            "SET_REQUERIDO",
            "VALOR_REQUERIDO"
          ]
        },
        "x-sdk-group": "certificaciones.v1",
        "x-sdk-name": "actualizar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Direccion\": \"Calle Ejemplo 123, Santiago\",\n  \"Giro\": \"Desarrollo de software\",\n  \"Productos\": [\n    {\n      \"Nombre\": \"Licencia mensual\",\n      \"Precio\": 10000\n    }\n  ],\n  \"RazonSocial\": \"Comercial Ejemplo SpA\",\n  \"Referencia\": \"Pedido 42\",\n  \"Servicios\": [\n    {\n      \"Nombre\": \"Implementación\",\n      \"Precio\": 100000\n    }\n  ],\n  \"Sets\": [\n    33\n  ]\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Direccion\\\":\\\"Calle Ejemplo 123, Santiago\\\",\\\"Giro\\\":\\\"Desarrollo de software\\\",\\\"Productos\\\":[{\\\"Nombre\\\":\\\"Licencia mensual\\\",\\\"Precio\\\":10000}],\\\"RazonSocial\\\":\\\"Comercial Ejemplo SpA\\\",\\\"Referencia\\\":\\\"Pedido 42\\\",\\\"Servicios\\\":[{\\\"Nombre\\\":\\\"Implementación\\\",\\\"Precio\\\":100000}],\\\"Sets\\\":[33]}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar', [\n  'body' => '{\"Direccion\":\"Calle Ejemplo 123, Santiago\",\"Giro\":\"Desarrollo de software\",\"Productos\":[{\"Nombre\":\"Licencia mensual\",\"Precio\":10000}],\"RazonSocial\":\"Comercial Ejemplo SpA\",\"Referencia\":\"Pedido 42\",\"Servicios\":[{\"Nombre\":\"Implementación\",\"Precio\":100000}],\"Sets\":[33]}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Direccion\\\":\\\"Calle Ejemplo 123, Santiago\\\",\\\"Giro\\\":\\\"Desarrollo de software\\\",\\\"Productos\\\":[{\\\"Nombre\\\":\\\"Licencia mensual\\\",\\\"Precio\\\":10000}],\\\"RazonSocial\\\":\\\"Comercial Ejemplo SpA\\\",\\\"Referencia\\\":\\\"Pedido 42\\\",\\\"Servicios\\\":[{\\\"Nombre\\\":\\\"Implementación\\\",\\\"Precio\\\":100000}],\\\"Sets\\\":[33]}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar\"\n\npayload = {\n  \"Direccion\": \"Calle Ejemplo 123, Santiago\",\n  \"Giro\": \"Desarrollo de software\",\n  \"Productos\": [\n    {\n      \"Nombre\": \"Licencia mensual\",\n      \"Precio\": 10000\n    }\n  ],\n  \"RazonSocial\": \"Comercial Ejemplo SpA\",\n  \"Referencia\": \"Pedido 42\",\n  \"Servicios\": [\n    {\n      \"Nombre\": \"Implementación\",\n      \"Precio\": 100000\n    }\n  ],\n  \"Sets\": [33]\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({\n    Direccion: 'Calle Ejemplo 123, Santiago',\n    Giro: 'Desarrollo de software',\n    Productos: [{Nombre: 'Licencia mensual', Precio: 10000}],\n    RazonSocial: 'Comercial Ejemplo SpA',\n    Referencia: 'Pedido 42',\n    Servicios: [{Nombre: 'Implementación', Precio: 100000}],\n    Sets: [33]\n  })\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificaciones/{rut}/actualizar-casillas-intercambio": {
      "post": {
        "description": "Actualiza casillas de intercambio en el SII para la empresa en el ambiente de producción.",
        "operationId": "certificaciones_v1_actualizar_casillas_intercambio",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Correo de contacto con el SII. Obligatorio: si falta en la query string, la API responde 404 (no 400), antes de validar la credencial.",
            "example": "contacto-sii@example.com",
            "in": "query",
            "name": "correoContactoSii",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Correo de contacto entre empresas. Obligatorio: si falta en la query string, la API responde 404 (no 400), antes de validar la credencial.",
            "example": "intercambio@example.com",
            "in": "query",
            "name": "correoContactoEmpresa",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Ambiente 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 tampoco da error y también corre en producción.",
            "example": 0,
            "in": "query",
            "name": "ambiente",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Ambiente",
              "default": 1
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Datos del certificado digital a usar. (requerido)",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": true,
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "content": {
              "application/json": {
                "example": {
                  "Message": "No HTTP resource was found that matches the request URI '<URI del request>'.",
                  "MessageDetail": "No action was found on the controller 'CertificationV1' that matches the request."
                },
                "schema": {
                  "properties": {
                    "Message": {
                      "description": "Siempre viene.",
                      "type": "string"
                    },
                    "MessageDetail": {
                      "description": "Opcional: viene o no según la configuración de errores del servidor. No dependa de él.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "Message"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Falta `correoContactoSii` o `correoContactoEmpresa` en la query string.\nEs un error del framework, no un 400, y sale **antes de validar la credencial**: llega aunque\nel token falte o sea inválido. Basta con que el nombre esté (sin distinguir mayúsculas); un\nvalor vacío no produce el 404.\n\nLa URI que aparece en `Message` es la que vio el servidor y puede no coincidir con la que mandó\nel cliente (esquema, puerto).",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Actualiza casillas de intercambio en el SII para la empresa en el ambiente de producción.",
        "tags": [
          "Certificaciones v1"
        ],
        "x-error-codes": [
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "CERT_REQUIRED",
            "familia": "negocio",
            "mensaje": "El certificado es requerido",
            "status": 500
          },
          {
            "codigo": "ERROR_ACTUALIZANDO_CASILLAS",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "ERROR_MODALIDAD_CLIENTE",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": "desconocido",
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_ACTUALIZANDO_CASILLAS",
            "ERROR_GENERAL",
            "SII_ERROR_CXN"
          ],
          "nunca": [
            "CERT_REQUERIDO",
            "CERT_REQUIRED",
            "ERROR_MODALIDAD_CLIENTE"
          ]
        },
        "x-sdk-group": "certificaciones.v1",
        "x-sdk-name": "actualizar_casillas_intercambio",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url 'https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar-casillas-intercambio?correoContactoSii=contacto-sii%40example.com&correoContactoEmpresa=intercambio%40example.com&ambiente=0' \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar-casillas-intercambio?correoContactoSii=contacto-sii%40example.com&correoContactoEmpresa=intercambio%40example.com&ambiente=0\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar-casillas-intercambio?correoContactoSii=contacto-sii%40example.com&correoContactoEmpresa=intercambio%40example.com&ambiente=0', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar-casillas-intercambio?correoContactoSii=contacto-sii%40example.com&correoContactoEmpresa=intercambio%40example.com&ambiente=0\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar-casillas-intercambio?correoContactoSii=contacto-sii%40example.com&correoContactoEmpresa=intercambio%40example.com&ambiente=0\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificaciones/1-9/actualizar-casillas-intercambio?correoContactoSii=contacto-sii%40example.com&correoContactoEmpresa=intercambio%40example.com&ambiente=0', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificaciones/{rut}/consultar": {
      "get": {
        "description": "Obtener los datos de una certificación, dado el RUT de la empresa.",
        "operationId": "certificaciones_v1_consultar",
        "parameters": [
          {
            "description": "RUT de la empresa",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "Actecos": [
                    {
                      "AffectoIva": "SI",
                      "Codigo": "620200",
                      "Nombre": "Actividades de consultoría informática"
                    }
                  ],
                  "ClasificacionError": 0,
                  "CodigoError": null,
                  "Comentario": "Set de prueba enviado al SII.",
                  "Direccion": "Calle Ejemplo 123, Santiago",
                  "DireccionModificada": "Calle Ejemplo 123, Santiago",
                  "DireccionRegional": "Santiago Centro",
                  "DireccionRegionalModificada": "Santiago Centro",
                  "Estado": 1,
                  "Etapa": 2,
                  "Fecha": "2026-09-30T11:06:00",
                  "FechaEstado": "2026-10-01T09:12:00",
                  "Giro": "Desarrollo de software",
                  "GiroModificado": "Desarrollo de software",
                  "HorasEnEstado": 23,
                  "PasoEnSII": 2,
                  "Productos": [
                    {
                      "Nombre": "Licencia mensual",
                      "Precio": 10000
                    },
                    {
                      "Nombre": "Licencia anual",
                      "Precio": 200000
                    }
                  ],
                  "RUT": "11111111-1",
                  "RazonSocial": "Comercial Ejemplo SpA",
                  "RazonSocialModificada": "Comercial Ejemplo SpA",
                  "Reinicios": 0,
                  "Servicios": [
                    {
                      "Nombre": "Implementación",
                      "Precio": 100000
                    }
                  ],
                  "Sets": [
                    110
                  ]
                },
                "schema": {
                  "$ref": "#/components/schemas/Certificacion"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Obtener los datos de una certificación, dado el RUT de la empresa.",
        "tags": [
          "Certificaciones v1"
        ],
        "x-error-codes": [
          {
            "familia": "negocio",
            "status": 404
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          }
        ],
        "x-idempotente": true,
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "ERROR_GENERAL"
          ],
          "nunca": []
        },
        "x-sdk-group": "certificaciones.v1",
        "x-sdk-name": "consultar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request GET \\\n  --url https://api.enrolamiento.cl/v1/certificaciones/1-9/consultar \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Get,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/consultar\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('GET', 'https://api.enrolamiento.cl/v1/certificaciones/1-9/consultar', [\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/consultar\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .method(\"GET\", HttpRequest.BodyPublishers.noBody())\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificaciones/1-9/consultar\"\n\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\"\n}\n\nresponse = requests.get(url, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'GET',\n  headers: {Accept: 'application/json', Authorization: 'Basic <base64 de usuario:apikey>'}\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificaciones/1-9/consultar', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificaciones/{rut}/crear": {
      "post": {
        "description": "Crear una nueva certificación.",
        "operationId": "certificaciones_v1_crear",
        "parameters": [
          {
            "description": "RUT de la empresa",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "CertData": "MIIC",
                "Contrasenna": "********",
                "Sets": [
                  33,
                  34
                ],
                "TodosSets": false
              },
              "schema": {
                "$ref": "#/components/schemas/CrearCertificacion"
              }
            }
          },
          "description": "Datos iniciales de la certificación. Datos del certificado digital y de los SETs a certificar.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "Actecos": [
                    {
                      "AffectoIva": "SI",
                      "Codigo": "620200",
                      "Nombre": "Actividades de consultoría informática"
                    }
                  ],
                  "ClasificacionError": 0,
                  "CodigoError": null,
                  "Comentario": "API",
                  "Direccion": "Calle Ejemplo 123, Santiago",
                  "DireccionModificada": null,
                  "DireccionRegional": "Santiago Centro",
                  "DireccionRegionalModificada": null,
                  "Estado": 1,
                  "Etapa": 1,
                  "Fecha": "2026-10-07T10:15:00",
                  "FechaEstado": "2026-10-07T10:15:00",
                  "Giro": "Desarrollo de software",
                  "GiroModificado": null,
                  "HorasEnEstado": 0,
                  "PasoEnSII": 0,
                  "Productos": [],
                  "RUT": "11111111-1",
                  "RazonSocial": "Comercial Ejemplo SpA",
                  "RazonSocialModificada": null,
                  "Reinicios": 0,
                  "Servicios": [],
                  "Sets": [
                    33,
                    34
                  ]
                },
                "schema": {
                  "$ref": "#/components/schemas/Certificacion"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "403": {
            "content": {
              "text/plain": {
                "example": "La llave maestra no puede crear certificaciones. RUT del intento: 11111111-1.",
                "schema": {
                  "$ref": "#/components/schemas/ErrorTextoPlano"
                }
              }
            },
            "description": "La operación no está disponible para esta credencial. El cuerpo es el texto literal que devuelve la API, con el RUT del intento.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Crear una nueva certificación.",
        "tags": [
          "Certificaciones v1"
        ],
        "x-error-codes": [
          {
            "codigo": "CERTIFICACION_EXISTE_EN_OTRO_CLIENTE",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "DATOS_REQUERIDOS",
            "familia": "negocio",
            "mensaje": "Los datos para crear la certificacion son requeridos.",
            "status": 500
          },
          {
            "codigo": "EMPRESA_VERIFICACION_ACTIVIDADES_SII",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "INSUFICIENTE_SALDO",
            "familia": "negocio",
            "mensaje": "No es posible crear la certificación en estos momentos, por favor verifique su saldo e intente nuevamente.",
            "status": 500
          },
          {
            "codigo": "SET_AMBAS_BOLETAS_JUNTAS",
            "familia": "negocio",
            "mensaje": "No se puede certificar ambos SET de Boleta (Afecta y Exenta) en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_DTE_BOLETA_JUNTOS",
            "familia": "negocio",
            "mensaje": "No se pueden certificar SET de DTE y Boletas en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe especificar al menos un SET para certificar.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          },
          {
            "codigo": "SITUACION_SII_EMPRESA_REP_LEGAL",
            "familia": "negocio",
            "status": 500
          }
        ],
        "x-idempotente": false,
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL",
            "SII_ERROR_CXN"
          ],
          "nunca": [
            "CERTIFICACION_EXISTE_EN_OTRO_CLIENTE",
            "CERT_REQUERIDO",
            "DATOS_REQUERIDOS",
            "EMPRESA_VERIFICACION_ACTIVIDADES_SII",
            "INSUFICIENTE_SALDO",
            "SET_AMBAS_BOLETAS_JUNTAS",
            "SET_DTE_BOLETA_JUNTOS",
            "SET_REQUERIDO",
            "SITUACION_SII_EMPRESA_REP_LEGAL"
          ]
        },
        "x-sdk-group": "certificaciones.v1",
        "x-sdk-name": "crear",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v1/certificaciones/1-9/crear \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"CertData\": \"MIIC\",\n  \"Contrasenna\": \"********\",\n  \"Sets\": [\n    33,\n    34\n  ],\n  \"TodosSets\": false\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/crear\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"CertData\\\":\\\"MIIC\\\",\\\"Contrasenna\\\":\\\"********\\\",\\\"Sets\\\":[33,34],\\\"TodosSets\\\":false}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/certificaciones/1-9/crear', [\n  'body' => '{\"CertData\":\"MIIC\",\"Contrasenna\":\"********\",\"Sets\":[33,34],\"TodosSets\":false}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/crear\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"CertData\\\":\\\"MIIC\\\",\\\"Contrasenna\\\":\\\"********\\\",\\\"Sets\\\":[33,34],\\\"TodosSets\\\":false}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificaciones/1-9/crear\"\n\npayload = {\n  \"CertData\": \"MIIC\",\n  \"Contrasenna\": \"********\",\n  \"Sets\": [33, 34],\n  \"TodosSets\": False\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({CertData: 'MIIC', Contrasenna: '********', Sets: [33, 34], TodosSets: false})\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificaciones/1-9/crear', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificaciones/{rut}/declarar-cumplimiento": {
      "post": {
        "description": "Declarar cumplimiento a la certificación en curso. Solo corre cuando la certificación está en `Etapa` = `DeclaracionFinal` (3): en otra etapa responde `ERROR_GENERAL` con el mensaje «La certificación para el RUT … no se encuentra en el paso de muestras impresas aprobadas.».",
        "operationId": "certificaciones_v1_declarar_cumplimiento",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Correo de contacto SII. (opcional)",
            "in": "query",
            "name": "correoContactoSii",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Correo de contacto entre empresas. (opcional)",
            "in": "query",
            "name": "correoContactoEmpresa",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Datos del certificado digital a usar.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": true,
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Declarar cumplimiento a la certificación en curso.",
        "tags": [
          "Certificaciones v1"
        ],
        "x-error-codes": [
          {
            "familia": "negocio",
            "status": 404
          },
          {
            "codigo": "ERROR_DECLARANDO_CUMPLIMENTO",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          }
        ],
        "x-idempotente": false,
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "ERROR_DECLARANDO_CUMPLIMENTO",
            "ERROR_GENERAL"
          ],
          "nunca": []
        },
        "x-sdk-group": "certificaciones.v1",
        "x-sdk-name": "declarar_cumplimiento",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v1/certificaciones/1-9/declarar-cumplimiento \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/declarar-cumplimiento\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/certificaciones/1-9/declarar-cumplimiento', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/declarar-cumplimiento\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificaciones/1-9/declarar-cumplimiento\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificaciones/1-9/declarar-cumplimiento', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificaciones/{rut}/iniciar": {
      "post": {
        "description": "Inicia el proceso de certificación. Repetirlo es seguro: si la certificación ya pasó por la carga de datos, responde true sin hacer nada.",
        "operationId": "certificaciones_v1_iniciar",
        "parameters": [
          {
            "description": "RUT de la empresa",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Productos": [
                  {
                    "Nombre": "Licencia mensual",
                    "Precio": 10000
                  }
                ],
                "Servicios": [
                  {
                    "Nombre": "Implementación",
                    "Precio": 100000
                  }
                ],
                "Sets": [
                  33
                ]
              },
              "schema": {
                "$ref": "#/components/schemas/ActualizarCertificacion"
              }
            }
          },
          "description": "Datos de la certificación para actualizarlos.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": true,
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Iniciar el proceso de certificación.",
        "tags": [
          "Certificaciones v1"
        ],
        "x-error-codes": [
          {
            "familia": "negocio",
            "status": 404
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "PRODUCTO_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe configurar al menos un producto para continuar.",
            "status": 500
          },
          {
            "codigo": "SERVICIO_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe configurar al menos un servicio para continuar.",
            "status": 500
          },
          {
            "codigo": "SET_AMBAS_BOLETAS_JUNTAS",
            "familia": "negocio",
            "mensaje": "No se puede certificar ambos SET de Boleta (Afecta y Exenta) en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_DTE_BOLETA_JUNTOS",
            "familia": "negocio",
            "mensaje": "No se pueden certificar SET de DTE y Boletas en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe especificar al menos un SET para certificar.",
            "status": 500
          },
          {
            "codigo": "VALOR_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Se debe espeficiar al menos un valor a actualizar.",
            "status": 500
          }
        ],
        "x-idempotente": true,
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "ERROR_GENERAL"
          ],
          "nunca": [
            "PRODUCTO_REQUERIDO",
            "SERVICIO_REQUERIDO",
            "SET_AMBAS_BOLETAS_JUNTAS",
            "SET_DTE_BOLETA_JUNTOS",
            "SET_REQUERIDO",
            "VALOR_REQUERIDO"
          ]
        },
        "x-sdk-group": "certificaciones.v1",
        "x-sdk-name": "iniciar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v1/certificaciones/1-9/iniciar \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Productos\": [\n    {\n      \"Nombre\": \"Licencia mensual\",\n      \"Precio\": 10000\n    }\n  ],\n  \"Servicios\": [\n    {\n      \"Nombre\": \"Implementación\",\n      \"Precio\": 100000\n    }\n  ],\n  \"Sets\": [\n    33\n  ]\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/iniciar\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Productos\\\":[{\\\"Nombre\\\":\\\"Licencia mensual\\\",\\\"Precio\\\":10000}],\\\"Servicios\\\":[{\\\"Nombre\\\":\\\"Implementación\\\",\\\"Precio\\\":100000}],\\\"Sets\\\":[33]}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/certificaciones/1-9/iniciar', [\n  'body' => '{\"Productos\":[{\"Nombre\":\"Licencia mensual\",\"Precio\":10000}],\"Servicios\":[{\"Nombre\":\"Implementación\",\"Precio\":100000}],\"Sets\":[33]}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/iniciar\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Productos\\\":[{\\\"Nombre\\\":\\\"Licencia mensual\\\",\\\"Precio\\\":10000}],\\\"Servicios\\\":[{\\\"Nombre\\\":\\\"Implementación\\\",\\\"Precio\\\":100000}],\\\"Sets\\\":[33]}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificaciones/1-9/iniciar\"\n\npayload = {\n  \"Productos\": [\n    {\n      \"Nombre\": \"Licencia mensual\",\n      \"Precio\": 10000\n    }\n  ],\n  \"Servicios\": [\n    {\n      \"Nombre\": \"Implementación\",\n      \"Precio\": 100000\n    }\n  ],\n  \"Sets\": [33]\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({\n    Productos: [{Nombre: 'Licencia mensual', Precio: 10000}],\n    Servicios: [{Nombre: 'Implementación', Precio: 100000}],\n    Sets: [33]\n  })\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificaciones/1-9/iniciar', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificaciones/{rut}/reiniciar": {
      "post": {
        "description": "Reinicia la certificación, eliminando todos los datos generados para la misma. En `Etapa` = `DeclaracionFinal` (3) no se puede reiniciar: responde `ERROR_GENERAL` con el mensaje «La certificación para el RUT … no puede ser reiniciada.».",
        "operationId": "certificaciones_v1_reiniciar",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Motivo": "Rehacer el set de prueba",
                "Paso": 0
              },
              "schema": {
                "$ref": "#/components/schemas/DatosReiniciar"
              }
            }
          },
          "description": "Datos para el reinicio de la certificación.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": true,
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Reinicia la certificación, eliminando todos los datos generados para la misma.",
        "tags": [
          "Certificaciones v1"
        ],
        "x-error-codes": [
          {
            "familia": "negocio",
            "status": 404
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "SET_AMBAS_BOLETAS_JUNTAS",
            "familia": "negocio",
            "mensaje": "No se puede certificar ambos SET de Boleta (Afecta y Exenta) en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_DTE_BOLETA_JUNTOS",
            "familia": "negocio",
            "mensaje": "No se pueden certificar SET de DTE y Boletas en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe especificar al menos un SET para certificar.",
            "status": 500
          },
          {
            "codigo": "VALOR_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Se debe espeficiar al menos un valor a actualizar.",
            "status": 500
          }
        ],
        "x-idempotente": false,
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "ERROR_GENERAL"
          ],
          "nunca": [
            "SET_AMBAS_BOLETAS_JUNTAS",
            "SET_DTE_BOLETA_JUNTOS",
            "SET_REQUERIDO",
            "VALOR_REQUERIDO"
          ]
        },
        "x-sdk-group": "certificaciones.v1",
        "x-sdk-name": "reiniciar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v1/certificaciones/1-9/reiniciar \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Motivo\": \"Rehacer el set de prueba\",\n  \"Paso\": 0\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/reiniciar\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Motivo\\\":\\\"Rehacer el set de prueba\\\",\\\"Paso\\\":0}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/certificaciones/1-9/reiniciar', [\n  'body' => '{\"Motivo\":\"Rehacer el set de prueba\",\"Paso\":0}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificaciones/1-9/reiniciar\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Motivo\\\":\\\"Rehacer el set de prueba\\\",\\\"Paso\\\":0}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificaciones/1-9/reiniciar\"\n\npayload = {\n  \"Motivo\": \"Rehacer el set de prueba\",\n  \"Paso\": 0\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Motivo: 'Rehacer el set de prueba', Paso: 0})\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificaciones/1-9/reiniciar', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificado/descargar/e-cert": {
      "post": {
        "description": "Descargar un certificado desde E-Cert.",
        "operationId": "certificados_v1_descargar_e_cert",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "ContrasennaPfx": "********",
                "Usuario": "usuario-ecert"
              },
              "schema": {
                "$ref": "#/components/schemas/DescargaCertificado"
              }
            }
          },
          "description": "Datos para la descarga del certificado.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": "MIIC",
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Certificado en base64.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Descargar un certificado desde E-Cert.",
        "tags": [
          "Certificados"
        ],
        "x-error-codes": [
          {
            "codigo": "ERROR_DESCARGANDO_CERTIFICADO",
            "familia": "negocio",
            "status": 500
          }
        ],
        "x-idempotente": "desconocido",
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "ERROR_DESCARGANDO_CERTIFICADO"
          ],
          "nunca": []
        },
        "x-sdk-group": "certificados",
        "x-sdk-name": "descargar_e_cert",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v1/certificado/descargar/e-cert \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"ContrasennaPfx\": \"********\",\n  \"Usuario\": \"usuario-ecert\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificado/descargar/e-cert\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"ContrasennaPfx\\\":\\\"********\\\",\\\"Usuario\\\":\\\"usuario-ecert\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/certificado/descargar/e-cert', [\n  'body' => '{\"Contrasenna\":\"********\",\"ContrasennaPfx\":\"********\",\"Usuario\":\"usuario-ecert\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificado/descargar/e-cert\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"ContrasennaPfx\\\":\\\"********\\\",\\\"Usuario\\\":\\\"usuario-ecert\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificado/descargar/e-cert\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"ContrasennaPfx\": \"********\",\n  \"Usuario\": \"usuario-ecert\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', ContrasennaPfx: '********', Usuario: 'usuario-ecert'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificado/descargar/e-cert', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificado/solicitar": {
      "post": {
        "description": "Solicita un certificado.",
        "operationId": "certificados_v1_solicitar",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Empresa": {
                  "Area": "Tecnología",
                  "Ciudad": "Santiago",
                  "Comuna": "SANTIAGO",
                  "Direccion": "Calle Ejemplo 123",
                  "Nombre": "Comercial Ejemplo SpA",
                  "Region": "METROPOLITANA DE SANTIAGO ",
                  "Rut": "11111111-1"
                },
                "Subscriptor": {
                  "ApeMaterno": "Prueba",
                  "ApePaterno": "Ejemplo",
                  "Ciudad": "Santiago",
                  "Comuna": "SANTIAGO",
                  "CopiaCedula": "RWplbXBsbzogbm8gZXMgdW5hIGNlZHVsYSByZWFsLg==",
                  "Correo": "ana@example.com",
                  "Direccion": "Calle Ejemplo 123",
                  "Nombre": "Ana",
                  "Region": "METROPOLITANA DE SANTIAGO ",
                  "Rut": "12345678-5",
                  "Serie": "A000000000",
                  "Telefono": "+56 2 2000 0000"
                }
              },
              "schema": {
                "$ref": "#/components/schemas/SolicitudCertificado"
              }
            }
          },
          "description": "Datos de la solictud.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": "482913",
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Solicita un certificado.",
        "tags": [
          "Certificados"
        ],
        "x-error-codes": [
          {
            "codigo": "ERROR_SOLICITANDO_CERTIFICADO",
            "familia": "negocio",
            "status": 500
          }
        ],
        "x-idempotente": "desconocido",
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "ERROR_SOLICITANDO_CERTIFICADO"
          ],
          "nunca": []
        },
        "x-sdk-group": "certificados",
        "x-sdk-name": "solicitar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v1/certificado/solicitar \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Empresa\": {\n    \"Area\": \"Tecnología\",\n    \"Ciudad\": \"Santiago\",\n    \"Comuna\": \"SANTIAGO\",\n    \"Direccion\": \"Calle Ejemplo 123\",\n    \"Nombre\": \"Comercial Ejemplo SpA\",\n    \"Region\": \"METROPOLITANA DE SANTIAGO \",\n    \"Rut\": \"11111111-1\"\n  },\n  \"Subscriptor\": {\n    \"ApeMaterno\": \"Prueba\",\n    \"ApePaterno\": \"Ejemplo\",\n    \"Ciudad\": \"Santiago\",\n    \"Comuna\": \"SANTIAGO\",\n    \"CopiaCedula\": \"RWplbXBsbzogbm8gZXMgdW5hIGNlZHVsYSByZWFsLg==\",\n    \"Correo\": \"ana@example.com\",\n    \"Direccion\": \"Calle Ejemplo 123\",\n    \"Nombre\": \"Ana\",\n    \"Region\": \"METROPOLITANA DE SANTIAGO \",\n    \"Rut\": \"12345678-5\",\n    \"Serie\": \"A000000000\",\n    \"Telefono\": \"+56 2 2000 0000\"\n  }\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificado/solicitar\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Empresa\\\":{\\\"Area\\\":\\\"Tecnología\\\",\\\"Ciudad\\\":\\\"Santiago\\\",\\\"Comuna\\\":\\\"SANTIAGO\\\",\\\"Direccion\\\":\\\"Calle Ejemplo 123\\\",\\\"Nombre\\\":\\\"Comercial Ejemplo SpA\\\",\\\"Region\\\":\\\"METROPOLITANA DE SANTIAGO \\\",\\\"Rut\\\":\\\"11111111-1\\\"},\\\"Subscriptor\\\":{\\\"ApeMaterno\\\":\\\"Prueba\\\",\\\"ApePaterno\\\":\\\"Ejemplo\\\",\\\"Ciudad\\\":\\\"Santiago\\\",\\\"Comuna\\\":\\\"SANTIAGO\\\",\\\"CopiaCedula\\\":\\\"RWplbXBsbzogbm8gZXMgdW5hIGNlZHVsYSByZWFsLg==\\\",\\\"Correo\\\":\\\"ana@example.com\\\",\\\"Direccion\\\":\\\"Calle Ejemplo 123\\\",\\\"Nombre\\\":\\\"Ana\\\",\\\"Region\\\":\\\"METROPOLITANA DE SANTIAGO \\\",\\\"Rut\\\":\\\"12345678-5\\\",\\\"Serie\\\":\\\"A000000000\\\",\\\"Telefono\\\":\\\"+56 2 2000 0000\\\"}}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/certificado/solicitar', [\n  'body' => '{\"Empresa\":{\"Area\":\"Tecnología\",\"Ciudad\":\"Santiago\",\"Comuna\":\"SANTIAGO\",\"Direccion\":\"Calle Ejemplo 123\",\"Nombre\":\"Comercial Ejemplo SpA\",\"Region\":\"METROPOLITANA DE SANTIAGO \",\"Rut\":\"11111111-1\"},\"Subscriptor\":{\"ApeMaterno\":\"Prueba\",\"ApePaterno\":\"Ejemplo\",\"Ciudad\":\"Santiago\",\"Comuna\":\"SANTIAGO\",\"CopiaCedula\":\"RWplbXBsbzogbm8gZXMgdW5hIGNlZHVsYSByZWFsLg==\",\"Correo\":\"ana@example.com\",\"Direccion\":\"Calle Ejemplo 123\",\"Nombre\":\"Ana\",\"Region\":\"METROPOLITANA DE SANTIAGO \",\"Rut\":\"12345678-5\",\"Serie\":\"A000000000\",\"Telefono\":\"+56 2 2000 0000\"}}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificado/solicitar\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Empresa\\\":{\\\"Area\\\":\\\"Tecnología\\\",\\\"Ciudad\\\":\\\"Santiago\\\",\\\"Comuna\\\":\\\"SANTIAGO\\\",\\\"Direccion\\\":\\\"Calle Ejemplo 123\\\",\\\"Nombre\\\":\\\"Comercial Ejemplo SpA\\\",\\\"Region\\\":\\\"METROPOLITANA DE SANTIAGO \\\",\\\"Rut\\\":\\\"11111111-1\\\"},\\\"Subscriptor\\\":{\\\"ApeMaterno\\\":\\\"Prueba\\\",\\\"ApePaterno\\\":\\\"Ejemplo\\\",\\\"Ciudad\\\":\\\"Santiago\\\",\\\"Comuna\\\":\\\"SANTIAGO\\\",\\\"CopiaCedula\\\":\\\"RWplbXBsbzogbm8gZXMgdW5hIGNlZHVsYSByZWFsLg==\\\",\\\"Correo\\\":\\\"ana@example.com\\\",\\\"Direccion\\\":\\\"Calle Ejemplo 123\\\",\\\"Nombre\\\":\\\"Ana\\\",\\\"Region\\\":\\\"METROPOLITANA DE SANTIAGO \\\",\\\"Rut\\\":\\\"12345678-5\\\",\\\"Serie\\\":\\\"A000000000\\\",\\\"Telefono\\\":\\\"+56 2 2000 0000\\\"}}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificado/solicitar\"\n\npayload = {\n  \"Empresa\": {\n    \"Area\": \"Tecnología\",\n    \"Ciudad\": \"Santiago\",\n    \"Comuna\": \"SANTIAGO\",\n    \"Direccion\": \"Calle Ejemplo 123\",\n    \"Nombre\": \"Comercial Ejemplo SpA\",\n    \"Region\": \"METROPOLITANA DE SANTIAGO \",\n    \"Rut\": \"11111111-1\"\n  },\n  \"Subscriptor\": {\n    \"ApeMaterno\": \"Prueba\",\n    \"ApePaterno\": \"Ejemplo\",\n    \"Ciudad\": \"Santiago\",\n    \"Comuna\": \"SANTIAGO\",\n    \"CopiaCedula\": \"RWplbXBsbzogbm8gZXMgdW5hIGNlZHVsYSByZWFsLg==\",\n    \"Correo\": \"ana@example.com\",\n    \"Direccion\": \"Calle Ejemplo 123\",\n    \"Nombre\": \"Ana\",\n    \"Region\": \"METROPOLITANA DE SANTIAGO \",\n    \"Rut\": \"12345678-5\",\n    \"Serie\": \"A000000000\",\n    \"Telefono\": \"+56 2 2000 0000\"\n  }\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({\n    Empresa: {\n      Area: 'Tecnología',\n      Ciudad: 'Santiago',\n      Comuna: 'SANTIAGO',\n      Direccion: 'Calle Ejemplo 123',\n      Nombre: 'Comercial Ejemplo SpA',\n      Region: 'METROPOLITANA DE SANTIAGO ',\n      Rut: '11111111-1'\n    },\n    Subscriptor: {\n      ApeMaterno: 'Prueba',\n      ApePaterno: 'Ejemplo',\n      Ciudad: 'Santiago',\n      Comuna: 'SANTIAGO',\n      CopiaCedula: 'RWplbXBsbzogbm8gZXMgdW5hIGNlZHVsYSByZWFsLg==',\n      Correo: 'ana@example.com',\n      Direccion: 'Calle Ejemplo 123',\n      Nombre: 'Ana',\n      Region: 'METROPOLITANA DE SANTIAGO ',\n      Rut: '12345678-5',\n      Serie: 'A000000000',\n      Telefono: '+56 2 2000 0000'\n    }\n  })\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificado/solicitar', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/certificado/{rut}/validar": {
      "post": {
        "description": "Valida que el certificado tenga permisos para la empresa.",
        "operationId": "certificados_v1_validar",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Actualiza los permisos, si el certificado es admin, pero no tiene los permisos, (enviar, consultar, obtener, firmar, anular). Por defecto no se actualiza, solo se consulta. Pasar \"true\" para actualizar.",
            "in": "query",
            "name": "actualizar",
            "required": false,
            "schema": {
              "default": false,
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Datos del certificado.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": true,
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Valida que el certificado tenga permisos para la empresa.",
        "tags": [
          "Certificados"
        ],
        "x-error-codes": [
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": "desconocido",
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL",
            "SII_ERROR_CXN"
          ],
          "nunca": [
            "CERT_REQUERIDO"
          ]
        },
        "x-sdk-group": "certificados",
        "x-sdk-name": "validar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v1/certificado/1-9/validar \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/certificado/1-9/validar\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/certificado/1-9/validar', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/certificado/1-9/validar\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/certificado/1-9/validar\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/certificado/1-9/validar', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/empresas/{rutEmpresa}/permisos/{rutUsuario}/{ambiente}": {
      "post": {
        "description": "Actualiza el usuario con RUT {rutUsuario} con permisos en el SII para la empresa con RUT {rutEmpresa}.",
        "operationId": "empresas_v1_permisos",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rutEmpresa",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "RUT del usuario.",
            "in": "path",
            "name": "rutUsuario",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Ambiente del SII: 0 = Homologación (certificación), 1 = Producción. El segmento es opcional en la API: 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.",
            "example": 0,
            "in": "path",
            "name": "ambiente",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Ambiente",
              "default": 1
            },
            "x-opcional-en-ruta": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Certificado para autenticación en el SII.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": true,
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "description": "`true` si la operación fue exitosa. Si falla, la API responde con un error.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Actualiza el usuario con RUT {rutUsuario} con permisos en el SII para la empresa con RUT {rutEmpresa}.",
        "tags": [
          "Empresas"
        ],
        "x-error-codes": [
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": "desconocido",
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL",
            "SII_ERROR_CXN"
          ],
          "nunca": [
            "CERT_REQUERIDO"
          ]
        },
        "x-sdk-group": "empresas",
        "x-sdk-name": "permisos",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v1/empresas/1-9/permisos/1-9/0 \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/empresas/1-9/permisos/1-9/0\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/empresas/1-9/permisos/1-9/0', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/empresas/1-9/permisos/1-9/0\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/empresas/1-9/permisos/1-9/0\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/empresas/1-9/permisos/1-9/0', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/empresas/{rut}/consultar": {
      "post": {
        "description": "Alias de `empresas_v1_datos`: misma acción, misma respuesta.",
        "operationId": "empresas_v1_consultar",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Certificado para autenticación en el SII. (Puede ser opcional, en ese caso se usa el configurado en la plataforma)",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "Actecos": [
                    {
                      "AffectoIva": "SI",
                      "Codigo": "620200",
                      "Nombre": "Actividades de consultoría informática"
                    }
                  ],
                  "Direccion": "Calle Ejemplo 123, Santiago",
                  "DireccionRegional": "Santiago Centro",
                  "DocumentosHomo": [
                    {
                      "Codigo": "33",
                      "FechaDenegado": null,
                      "FechaPermitido": "01-09-2026",
                      "Nombre": "Factura electrónica"
                    }
                  ],
                  "DocumentosProd": [],
                  "FechaResolucion": "22-08-2014",
                  "Giro": "Desarrollo de software",
                  "NumeroResolucion": 80,
                  "RUT": "11111111-1",
                  "RazonSocial": "Comercial Ejemplo SpA",
                  "Sucursales": [
                    {
                      "Codigo": "1",
                      "Direccion": "Calle Ejemplo 123, Santiago",
                      "TipoDireccion": "Casa matriz"
                    }
                  ]
                },
                "schema": {
                  "$ref": "#/components/schemas/EmpresaInfo"
                }
              }
            },
            "description": "Datos de la empresa según información registrada en el SII.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Obtiene la información de la empresa.",
        "tags": [
          "Empresas"
        ],
        "x-alias-de": "empresas_v1_datos",
        "x-error-codes": [
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "NO_CERTIFICATE",
            "familia": "negocio",
            "mensaje": "No se especifico un certificado, y en la plataforma no existe uno.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": true,
        "x-reintentable": {
          "automatico": [
            "409",
            "SII_ERROR_CXN"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL"
          ],
          "nunca": [
            "CERT_REQUERIDO",
            "NO_CERTIFICATE"
          ]
        },
        "x-sdk-group": "empresas",
        "x-sdk-name": "consultar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v1/empresas/1-9/consultar \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/empresas/1-9/consultar\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/empresas/1-9/consultar', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/empresas/1-9/consultar\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/empresas/1-9/consultar\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/empresas/1-9/consultar', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v1/empresas/{rut}/datos": {
      "post": {
        "description": "Obtiene la información de la empresa.",
        "operationId": "empresas_v1_datos",
        "parameters": [
          {
            "description": "RUT de la empresa.",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Contrasenna": "********",
                "Data": "MIIC"
              },
              "schema": {
                "$ref": "#/components/schemas/Certificado"
              }
            }
          },
          "description": "Certificado para autenticación en el SII. (Puede ser opcional, en ese caso se usa el configurado en la plataforma)",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "Actecos": [
                    {
                      "AffectoIva": "SI",
                      "Codigo": "620200",
                      "Nombre": "Actividades de consultoría informática"
                    }
                  ],
                  "Direccion": "Calle Ejemplo 123, Santiago",
                  "DireccionRegional": "Santiago Centro",
                  "DocumentosHomo": [
                    {
                      "Codigo": "33",
                      "FechaDenegado": null,
                      "FechaPermitido": "01-09-2026",
                      "Nombre": "Factura electrónica"
                    }
                  ],
                  "DocumentosProd": [],
                  "FechaResolucion": "22-08-2014",
                  "Giro": "Desarrollo de software",
                  "NumeroResolucion": 80,
                  "RUT": "11111111-1",
                  "RazonSocial": "Comercial Ejemplo SpA",
                  "Sucursales": [
                    {
                      "Codigo": "1",
                      "Direccion": "Calle Ejemplo 123, Santiago",
                      "TipoDireccion": "Casa matriz"
                    }
                  ]
                },
                "schema": {
                  "$ref": "#/components/schemas/EmpresaInfo"
                }
              }
            },
            "description": "Datos de la empresa según información registrada en el SII.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Obtiene la información de la empresa.",
        "tags": [
          "Empresas"
        ],
        "x-error-codes": [
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "NO_CERTIFICATE",
            "familia": "negocio",
            "mensaje": "No se especifico un certificado, y en la plataforma no existe uno.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": true,
        "x-reintentable": {
          "automatico": [
            "409",
            "SII_ERROR_CXN"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL"
          ],
          "nunca": [
            "CERT_REQUERIDO",
            "NO_CERTIFICATE"
          ]
        },
        "x-sdk-group": "empresas",
        "x-sdk-name": "datos",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v1/empresas/1-9/datos \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v1/empresas/1-9/datos\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v1/empresas/1-9/datos', [\n  'body' => '{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v1/empresas/1-9/datos\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v1/empresas/1-9/datos\"\n\npayload = {\n  \"Contrasenna\": \"********\",\n  \"Data\": \"MIIC\"\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({Contrasenna: '********', Data: 'MIIC'})\n};\n\nfetch('https://api.enrolamiento.cl/v1/empresas/1-9/datos', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v2/certificaciones/{rut}/actualizar": {
      "post": {
        "description": "Actualizar los datos de una certificación.",
        "operationId": "certificaciones_v2_actualizar",
        "parameters": [
          {
            "description": "RUT de la empresa",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Certificado": {
                  "Contrasenna": "********",
                  "Data": "MIIC"
                },
                "Direccion": "Calle Ejemplo 123, Santiago",
                "Giro": "Desarrollo de software",
                "Productos": [
                  {
                    "Nombre": "Licencia mensual",
                    "Precio": 10000
                  }
                ],
                "RazonSocial": "Comercial Ejemplo SpA",
                "Servicios": [
                  {
                    "Nombre": "Implementación",
                    "Precio": 100000
                  }
                ],
                "Sets": [
                  33
                ]
              },
              "schema": {
                "$ref": "#/components/schemas/ActualizarCertificacion"
              }
            }
          },
          "description": "Datos de la certificación para actualizarlos. (No requerido)",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": true,
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Actualizar los datos de una certificación.",
        "tags": [
          "Certificaciones v2"
        ],
        "x-error-codes": [
          {
            "familia": "negocio",
            "status": 404
          },
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "SET_AMBAS_BOLETAS_JUNTAS",
            "familia": "negocio",
            "mensaje": "No se puede certificar ambos SET de Boleta (Afecta y Exenta) en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_DTE_BOLETA_JUNTOS",
            "familia": "negocio",
            "mensaje": "No se pueden certificar SET de DTE y Boletas en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe especificar al menos un SET para certificar.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          },
          {
            "codigo": "VALOR_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Se debe espeficiar al menos un valor a actualizar.",
            "status": 500
          }
        ],
        "x-idempotente": "desconocido",
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL",
            "SII_ERROR_CXN"
          ],
          "nunca": [
            "CERT_REQUERIDO",
            "SET_AMBAS_BOLETAS_JUNTAS",
            "SET_DTE_BOLETA_JUNTOS",
            "SET_REQUERIDO",
            "VALOR_REQUERIDO"
          ]
        },
        "x-sdk-group": "certificaciones.v2",
        "x-sdk-name": "actualizar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v2/certificaciones/1-9/actualizar \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Certificado\": {\n    \"Contrasenna\": \"********\",\n    \"Data\": \"MIIC\"\n  },\n  \"Direccion\": \"Calle Ejemplo 123, Santiago\",\n  \"Giro\": \"Desarrollo de software\",\n  \"Productos\": [\n    {\n      \"Nombre\": \"Licencia mensual\",\n      \"Precio\": 10000\n    }\n  ],\n  \"RazonSocial\": \"Comercial Ejemplo SpA\",\n  \"Servicios\": [\n    {\n      \"Nombre\": \"Implementación\",\n      \"Precio\": 100000\n    }\n  ],\n  \"Sets\": [\n    33\n  ]\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v2/certificaciones/1-9/actualizar\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Certificado\\\":{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"},\\\"Direccion\\\":\\\"Calle Ejemplo 123, Santiago\\\",\\\"Giro\\\":\\\"Desarrollo de software\\\",\\\"Productos\\\":[{\\\"Nombre\\\":\\\"Licencia mensual\\\",\\\"Precio\\\":10000}],\\\"RazonSocial\\\":\\\"Comercial Ejemplo SpA\\\",\\\"Servicios\\\":[{\\\"Nombre\\\":\\\"Implementación\\\",\\\"Precio\\\":100000}],\\\"Sets\\\":[33]}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v2/certificaciones/1-9/actualizar', [\n  'body' => '{\"Certificado\":{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"},\"Direccion\":\"Calle Ejemplo 123, Santiago\",\"Giro\":\"Desarrollo de software\",\"Productos\":[{\"Nombre\":\"Licencia mensual\",\"Precio\":10000}],\"RazonSocial\":\"Comercial Ejemplo SpA\",\"Servicios\":[{\"Nombre\":\"Implementación\",\"Precio\":100000}],\"Sets\":[33]}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v2/certificaciones/1-9/actualizar\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Certificado\\\":{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"},\\\"Direccion\\\":\\\"Calle Ejemplo 123, Santiago\\\",\\\"Giro\\\":\\\"Desarrollo de software\\\",\\\"Productos\\\":[{\\\"Nombre\\\":\\\"Licencia mensual\\\",\\\"Precio\\\":10000}],\\\"RazonSocial\\\":\\\"Comercial Ejemplo SpA\\\",\\\"Servicios\\\":[{\\\"Nombre\\\":\\\"Implementación\\\",\\\"Precio\\\":100000}],\\\"Sets\\\":[33]}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v2/certificaciones/1-9/actualizar\"\n\npayload = {\n  \"Certificado\": {\n    \"Contrasenna\": \"********\",\n    \"Data\": \"MIIC\"\n  },\n  \"Direccion\": \"Calle Ejemplo 123, Santiago\",\n  \"Giro\": \"Desarrollo de software\",\n  \"Productos\": [\n    {\n      \"Nombre\": \"Licencia mensual\",\n      \"Precio\": 10000\n    }\n  ],\n  \"RazonSocial\": \"Comercial Ejemplo SpA\",\n  \"Servicios\": [\n    {\n      \"Nombre\": \"Implementación\",\n      \"Precio\": 100000\n    }\n  ],\n  \"Sets\": [33]\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({\n    Certificado: {Contrasenna: '********', Data: 'MIIC'},\n    Direccion: 'Calle Ejemplo 123, Santiago',\n    Giro: 'Desarrollo de software',\n    Productos: [{Nombre: 'Licencia mensual', Precio: 10000}],\n    RazonSocial: 'Comercial Ejemplo SpA',\n    Servicios: [{Nombre: 'Implementación', Precio: 100000}],\n    Sets: [33]\n  })\n};\n\nfetch('https://api.enrolamiento.cl/v2/certificaciones/1-9/actualizar', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v2/certificaciones/{rut}/crear": {
      "post": {
        "description": "Crear una nueva certificación.",
        "operationId": "certificaciones_v2_crear",
        "parameters": [
          {
            "description": "RUT de la empresa",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "CertData": "MIIC",
                "Contrasenna": "********",
                "Sets": [
                  33,
                  34
                ],
                "TodosSets": false
              },
              "schema": {
                "$ref": "#/components/schemas/CrearCertificacion"
              }
            }
          },
          "description": "Datos iniciales de la certificación. Datos del certificado digital (opcional) y de los SETs a certificar.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "Actecos": [
                    {
                      "AffectoIva": "SI",
                      "Codigo": "620200",
                      "Nombre": "Actividades de consultoría informática"
                    }
                  ],
                  "ClasificacionError": 0,
                  "CodigoError": null,
                  "Comentario": "API",
                  "Direccion": "Calle Ejemplo 123, Santiago",
                  "DireccionModificada": null,
                  "DireccionRegional": "Santiago Centro",
                  "DireccionRegionalModificada": null,
                  "Estado": 1,
                  "Etapa": 1,
                  "Fecha": "2026-10-07T10:15:00",
                  "FechaEstado": "2026-10-07T10:15:00",
                  "Giro": "Desarrollo de software",
                  "GiroModificado": null,
                  "HorasEnEstado": 0,
                  "PasoEnSII": 0,
                  "Productos": [],
                  "RUT": "11111111-1",
                  "RazonSocial": "Comercial Ejemplo SpA",
                  "RazonSocialModificada": null,
                  "Reinicios": 0,
                  "Servicios": [],
                  "Sets": [
                    33,
                    34
                  ]
                },
                "schema": {
                  "$ref": "#/components/schemas/Certificacion"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "403": {
            "content": {
              "text/plain": {
                "example": "La llave maestra no puede crear certificaciones. RUT del intento: 11111111-1.",
                "schema": {
                  "$ref": "#/components/schemas/ErrorTextoPlano"
                }
              }
            },
            "description": "La operación no está disponible para esta credencial. El cuerpo es el texto literal que devuelve la API, con el RUT del intento.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Crear una nueva certificación.",
        "tags": [
          "Certificaciones v2"
        ],
        "x-error-codes": [
          {
            "codigo": "CERTIFICACION_EXISTE_EN_OTRO_CLIENTE",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "DATOS_REQUERIDOS",
            "familia": "negocio",
            "mensaje": "Los datos para crear la certificacion son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "INSUFICIENTE_SALDO",
            "familia": "negocio",
            "mensaje": "No es posible crear la certificación en estos momentos, por favor verifique su saldo e intente nuevamente.",
            "status": 500
          },
          {
            "codigo": "NO_CERTIFICATE",
            "familia": "negocio",
            "mensaje": "No se especifico un certificado, y en la plataforma no existe uno.",
            "status": 500
          },
          {
            "codigo": "SET_AMBAS_BOLETAS_JUNTAS",
            "familia": "negocio",
            "mensaje": "No se puede certificar ambos SET de Boleta (Afecta y Exenta) en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_DTE_BOLETA_JUNTOS",
            "familia": "negocio",
            "mensaje": "No se pueden certificar SET de DTE y Boletas en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe especificar al menos un SET para certificar.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          }
        ],
        "x-idempotente": false,
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL",
            "SII_ERROR_CXN"
          ],
          "nunca": [
            "CERTIFICACION_EXISTE_EN_OTRO_CLIENTE",
            "CERT_REQUERIDO",
            "DATOS_REQUERIDOS",
            "INSUFICIENTE_SALDO",
            "NO_CERTIFICATE",
            "SET_AMBAS_BOLETAS_JUNTAS",
            "SET_DTE_BOLETA_JUNTOS",
            "SET_REQUERIDO"
          ]
        },
        "x-sdk-group": "certificaciones.v2",
        "x-sdk-name": "crear",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v2/certificaciones/1-9/crear \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"CertData\": \"MIIC\",\n  \"Contrasenna\": \"********\",\n  \"Sets\": [\n    33,\n    34\n  ],\n  \"TodosSets\": false\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v2/certificaciones/1-9/crear\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"CertData\\\":\\\"MIIC\\\",\\\"Contrasenna\\\":\\\"********\\\",\\\"Sets\\\":[33,34],\\\"TodosSets\\\":false}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v2/certificaciones/1-9/crear', [\n  'body' => '{\"CertData\":\"MIIC\",\"Contrasenna\":\"********\",\"Sets\":[33,34],\"TodosSets\":false}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v2/certificaciones/1-9/crear\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"CertData\\\":\\\"MIIC\\\",\\\"Contrasenna\\\":\\\"********\\\",\\\"Sets\\\":[33,34],\\\"TodosSets\\\":false}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v2/certificaciones/1-9/crear\"\n\npayload = {\n  \"CertData\": \"MIIC\",\n  \"Contrasenna\": \"********\",\n  \"Sets\": [33, 34],\n  \"TodosSets\": False\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({CertData: 'MIIC', Contrasenna: '********', Sets: [33, 34], TodosSets: false})\n};\n\nfetch('https://api.enrolamiento.cl/v2/certificaciones/1-9/crear', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    },
    "/v2/certificaciones/{rut}/iniciar": {
      "post": {
        "description": "Iniciar el proceso de certificación.",
        "operationId": "certificaciones_v2_iniciar",
        "parameters": [
          {
            "description": "RUT de la empresa",
            "in": "path",
            "name": "rut",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "Certificado": {
                  "Contrasenna": "********",
                  "Data": "MIIC"
                },
                "Productos": [
                  {
                    "Nombre": "Licencia mensual",
                    "Precio": 10000
                  }
                ],
                "Servicios": [
                  {
                    "Nombre": "Implementación",
                    "Precio": 100000
                  }
                ],
                "Sets": [
                  33
                ]
              },
              "schema": {
                "$ref": "#/components/schemas/ActualizarCertificacion"
              }
            }
          },
          "description": "Datos de la certificación para actualizarlos.",
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": true,
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "description": "Respuesta exitosa.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/NoAutenticado"
          },
          "404": {
            "$ref": "#/components/responses/ErrorNegocio"
          },
          "409": {
            "$ref": "#/components/responses/LimiteDeTasa"
          },
          "500": {
            "$ref": "#/components/responses/ErrorNegocio"
          }
        },
        "summary": "Iniciar el proceso de certificación.",
        "tags": [
          "Certificaciones v2"
        ],
        "x-error-codes": [
          {
            "familia": "negocio",
            "status": 404
          },
          {
            "codigo": "CERTIFICADO_DIGITAL_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe actualizar el certificado digital para comenzar.",
            "status": 500
          },
          {
            "codigo": "CERT_ERROR",
            "familia": "negocio",
            "status": 500
          },
          {
            "codigo": "CERT_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Los datos del certificado son requeridos.",
            "status": 500
          },
          {
            "codigo": "ERROR_GENERAL",
            "familia": "negocio",
            "mensaje": "El RUT no puede ser nulo.",
            "status": 500
          },
          {
            "codigo": "PRODUCTO_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe configurar al menos un producto para continuar.",
            "status": 500
          },
          {
            "codigo": "SERVICIO_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe configurar al menos un servicio para continuar.",
            "status": 500
          },
          {
            "codigo": "SET_AMBAS_BOLETAS_JUNTAS",
            "familia": "negocio",
            "mensaje": "No se puede certificar ambos SET de Boleta (Afecta y Exenta) en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_DTE_BOLETA_JUNTOS",
            "familia": "negocio",
            "mensaje": "No se pueden certificar SET de DTE y Boletas en una misma certificación.",
            "status": 500
          },
          {
            "codigo": "SET_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Debe especificar al menos un SET para certificar.",
            "status": 500
          },
          {
            "codigo": "SII_ERROR_CXN",
            "familia": "negocio",
            "mensaje": "No fue posible validar el certificado, intente nuevamente.",
            "status": 500
          },
          {
            "codigo": "VALOR_REQUERIDO",
            "familia": "negocio",
            "mensaje": "Se debe espeficiar al menos un valor a actualizar.",
            "status": 500
          }
        ],
        "x-idempotente": "desconocido",
        "x-reintentable": {
          "automatico": [
            "409"
          ],
          "manual": [
            "CERT_ERROR",
            "ERROR_GENERAL",
            "SII_ERROR_CXN"
          ],
          "nunca": [
            "CERTIFICADO_DIGITAL_REQUERIDO",
            "CERT_REQUERIDO",
            "PRODUCTO_REQUERIDO",
            "SERVICIO_REQUERIDO",
            "SET_AMBAS_BOLETAS_JUNTAS",
            "SET_DTE_BOLETA_JUNTOS",
            "SET_REQUERIDO",
            "VALOR_REQUERIDO"
          ]
        },
        "x-sdk-group": "certificaciones.v2",
        "x-sdk-name": "iniciar",
        "x-codeSamples": [
          {
            "lang": "bash",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://api.enrolamiento.cl/v2/certificaciones/1-9/iniciar \\\n  --header 'Accept: application/json' \\\n  --header 'Authorization: Basic <base64 de usuario:apikey>' \\\n  --header 'Content-Type: application/json' \\\n  --data '\n{\n  \"Certificado\": {\n    \"Contrasenna\": \"********\",\n    \"Data\": \"MIIC\"\n  },\n  \"Productos\": [\n    {\n      \"Nombre\": \"Licencia mensual\",\n      \"Precio\": 10000\n    }\n  ],\n  \"Servicios\": [\n    {\n      \"Nombre\": \"Implementación\",\n      \"Precio\": 100000\n    }\n  ],\n  \"Sets\": [\n    33\n  ]\n}\n'"
          },
          {
            "lang": "csharp",
            "label": "C#",
            "source": "using System.Net.Http.Headers;\nvar client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n  Method = HttpMethod.Post,\n  RequestUri = new Uri(\"https://api.enrolamiento.cl/v2/certificaciones/1-9/iniciar\"),\n  Headers =\n  {\n    { \"Accept\", \"application/json\" },\n    { \"Authorization\", \"Basic <base64 de usuario:apikey>\" },\n  },\n  Content = new StringContent(\"{\\\"Certificado\\\":{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"},\\\"Productos\\\":[{\\\"Nombre\\\":\\\"Licencia mensual\\\",\\\"Precio\\\":10000}],\\\"Servicios\\\":[{\\\"Nombre\\\":\\\"Implementación\\\",\\\"Precio\\\":100000}],\\\"Sets\\\":[33]}\")\n  {\n    Headers =\n    {\n      ContentType = new MediaTypeHeaderValue(\"application/json\")\n    }\n  }\n};\nusing (var response = await client.SendAsync(request))\n{\n  response.EnsureSuccessStatusCode();\n  var body = await response.Content.ReadAsStringAsync();\n  Console.WriteLine(body);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\nrequire_once('vendor/autoload.php');\n\n$client = new \\GuzzleHttp\\Client();\n\n$response = $client->request('POST', 'https://api.enrolamiento.cl/v2/certificaciones/1-9/iniciar', [\n  'body' => '{\"Certificado\":{\"Contrasenna\":\"********\",\"Data\":\"MIIC\"},\"Productos\":[{\"Nombre\":\"Licencia mensual\",\"Precio\":10000}],\"Servicios\":[{\"Nombre\":\"Implementación\",\"Precio\":100000}],\"Sets\":[33]}',\n  'headers' => [\n    'Accept' => 'application/json',\n    'Authorization' => 'Basic <base64 de usuario:apikey>',\n    'Content-Type' => 'application/json',\n  ],\n]);\n\necho $response->getBody();"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.enrolamiento.cl/v2/certificaciones/1-9/iniciar\"))\n    .header(\"Accept\", \"application/json\")\n    .header(\"Authorization\", \"Basic <base64 de usuario:apikey>\")\n    .header(\"Content-Type\", \"application/json\")\n    .method(\"POST\", HttpRequest.BodyPublishers.ofString(\"{\\\"Certificado\\\":{\\\"Contrasenna\\\":\\\"********\\\",\\\"Data\\\":\\\"MIIC\\\"},\\\"Productos\\\":[{\\\"Nombre\\\":\\\"Licencia mensual\\\",\\\"Precio\\\":10000}],\\\"Servicios\\\":[{\\\"Nombre\\\":\\\"Implementación\\\",\\\"Precio\\\":100000}],\\\"Sets\\\":[33]}\"))\n    .build();\nHttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://api.enrolamiento.cl/v2/certificaciones/1-9/iniciar\"\n\npayload = {\n  \"Certificado\": {\n    \"Contrasenna\": \"********\",\n    \"Data\": \"MIIC\"\n  },\n  \"Productos\": [\n    {\n      \"Nombre\": \"Licencia mensual\",\n      \"Precio\": 10000\n    }\n  ],\n  \"Servicios\": [\n    {\n      \"Nombre\": \"Implementación\",\n      \"Precio\": 100000\n    }\n  ],\n  \"Sets\": [33]\n}\nheaders = {\n  \"Accept\": \"application/json\",\n  \"Authorization\": \"Basic <base64 de usuario:apikey>\",\n  \"Content-Type\": \"application/json\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\nprint(response.text)"
          },
          {
            "lang": "js",
            "label": "JavaScript",
            "source": "const options = {\n  method: 'POST',\n  headers: {\n    Accept: 'application/json',\n    Authorization: 'Basic <base64 de usuario:apikey>',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({\n    Certificado: {Contrasenna: '********', Data: 'MIIC'},\n    Productos: [{Nombre: 'Licencia mensual', Precio: 10000}],\n    Servicios: [{Nombre: 'Implementación', Precio: 100000}],\n    Sets: [33]\n  })\n};\n\nfetch('https://api.enrolamiento.cl/v2/certificaciones/1-9/iniciar', options)\n  .then(res => res.json())\n  .then(res => console.log(res))\n  .catch(err => console.error(err));"
          }
        ]
      }
    }
  },
  "security": [
    {
      "basic": []
    }
  ],
  "servers": [
    {
      "url": "https://api.enrolamiento.cl",
      "x-internal": false
    }
  ],
  "tags": [
    {
      "description": "Folios del SII (Código de Autorización de Folios): descargar, reobtener, consultar y anular. La descarga puede responder 429 si ya hay otra en curso para el mismo RUT y tipo de documento.",
      "name": "CAF"
    },
    {
      "description": "Alta, carga de datos, avance y consulta de una certificación ante el SII.",
      "name": "Certificaciones v1"
    },
    {
      "description": "Como v1, con el certificado digital opcional al crear y cargable al actualizar.",
      "name": "Certificaciones v2"
    },
    {
      "description": "Validación de un certificado digital contra el SII, y solicitud y descarga en E-Cert.",
      "name": "Certificados"
    },
    {
      "description": "Datos de una empresa según el SII y permisos de un usuario en el SII.",
      "name": "Empresas"
    }
  ],
  "x-errores": {
    "AUTH_ERROR": {
      "accion": "No se obtuvo la sesión del SII con el certificado. El propio mensaje pide intentar nuevamente: reintentar con espera y un tope de 3 intentos.",
      "reintentable": "si"
    },
    "AUT_COMP_ACTIVITIES_VERIFICATION": {
      "accion": "El SII no verifica actividades económicas positivas para la empresa. Resolverlo en el SII antes de volver a pedir folios.",
      "reintentable": "no"
    },
    "AUT_COMP_OR_REP_SITUATION": {
      "accion": "El SII no autoriza el timbraje por una situación de la empresa o de su representante legal. Resolverla en el SII antes de volver a pedir folios.",
      "reintentable": "no"
    },
    "AUT_DOCTYPE_NOT_AUTHORIZED": {
      "accion": "El SII no autoriza timbrar este tipo de documento; lo más común es que la empresa ya tenga folios suficientes. Usar los vigentes o anular los sobrantes y volver a pedir.",
      "reintentable": "no"
    },
    "CAF_DENIED_SII_EXCEED": {
      "accion": "El SII no autoriza timbrar más folios de este tipo, ni siquiera uno: la API ya bajó la cantidad sola. Pedir menos no cambia la respuesta; usar los folios vigentes o anular los sobrantes.",
      "reintentable": "no"
    },
    "CAF_DENIED_SII_NOTENOUGH": {
      "accion": "El SII no autoriza los folios pedidos para este tipo de documento. Usar los vigentes, anular los sobrantes o gestionar con el SII una autorización mayor.",
      "reintentable": "no"
    },
    "CAF_REQUEST_IN_PROGRESS": {
      "accion": "Otra solicitud de folios para el mismo RUT y tipo de documento sigue en curso; este request no se ejecutó. Esperar los segundos del header Retry-After (hoy 30) y repetir el mismo request. Si el 429 llega al reintentar un caf_v1_descargar propio cuya respuesta no se recibió, la solicitud en curso puede ser esa: antes de repetir, consultar con caf_v1_consulta o recuperar con caf_v1_reobtener si el CAF quedó timbrado.",
      "reintentable": "si"
    },
    "CAF_UNKNOWN": {
      "accion": "El SII no entregó el CAF por un motivo que no se pudo identificar. Antes de pedir folios de nuevo, consultar con caf_v1_consulta o caf_v1_reobtener si el CAF quedó timbrado.",
      "reintentable": "desconocido"
    },
    "CERTIFICACION_EXISTE_EN_OTRO_CLIENTE": {
      "accion": "Otro cliente está certificando ese RUT. Contactar a soporte; reintentar no lo cambia.",
      "reintentable": "no"
    },
    "CERTIFICADO_DIGITAL_REQUERIDO": {
      "accion": "Cargar el certificado digital con actualizar (campo Certificado) antes de iniciar.",
      "reintentable": "no"
    },
    "CERT_AUTH_NOT_CONFIGURED": {
      "accion": "El titular tiene que habilitar el certificado para autenticarse en el sitio del SII.",
      "reintentable": "no"
    },
    "CERT_ERROR": {
      "accion": "No se pudo cargar o validar el certificado. Casi siempre son los datos o la contraseña del PFX: revisarlos antes de repetir. Si el certificado está bien, reintentar una vez.",
      "reintentable": "desconocido"
    },
    "CERT_EXPIRADO": {
      "accion": "El certificado está vencido. Renovarlo y volver a mandarlo.",
      "reintentable": "no"
    },
    "CERT_NO_CONFIGURADO_AUTH": {
      "accion": "El titular tiene que habilitar el certificado para autenticarse en el sitio del SII.",
      "reintentable": "no"
    },
    "CERT_NO_VALIDO": {
      "accion": "El RUT del certificado termina en «k» minúscula y no se puede usar. Revocarlo y generarlo de nuevo, o usar otro certificado.",
      "reintentable": "no"
    },
    "CERT_REQUERIDO": {
      "accion": "Mandar el cuerpo con Data (PFX en base64) y Contrasenna.",
      "reintentable": "no"
    },
    "CERT_REQUIRED": {
      "accion": "Mandar el cuerpo con Data (PFX en base64) y Contrasenna.",
      "reintentable": "no"
    },
    "CERT_REVOCADO": {
      "accion": "El certificado fue revocado por su titular o por la entidad emisora. Emitir uno nuevo y volver a mandarlo.",
      "reintentable": "no"
    },
    "CERT_SIN_PERMISO": {
      "accion": "El certificado no tiene permisos en el SII para esa empresa. Usar el certificado de un usuario habilitado, o darle permisos (empresas_v1_permisos con un certificado administrador).",
      "reintentable": "no"
    },
    "CNX_HTTP_ERROR_500": {
      "accion": "El SII respondió 500 al pedir el CAF. Reintentar con espera exponencial y un tope de 3 intentos; antes de pedir folios de nuevo, consultar con caf_v1_consulta si el CAF salió igual.",
      "reintentable": "si"
    },
    "CNX_HTTP_ERROR_CLOSED": {
      "accion": "El SII cerró la conexión. Reintentar con espera exponencial y un tope de 3 intentos; antes de pedir folios de nuevo, consultar con caf_v1_consulta si el CAF salió igual.",
      "reintentable": "si"
    },
    "CNX_HTTP_ERROR_REMOTE": {
      "accion": "No se pudo conectar con el SII. Reintentar con espera exponencial y un tope de 3 intentos; si persiste, contactar a soporte.",
      "reintentable": "si"
    },
    "CNX_HTTP_ERROR_RETRY": {
      "accion": "El SII devolvió su página genérica «No ha sido posible completar su solicitud», que a veces es una falla pasajera y a veces envuelve un rechazo. Leer el mensaje; reintentar una sola vez y, si se repite, no insistir y contactar a soporte.",
      "reintentable": "desconocido"
    },
    "CNX_HTTP_ERROR_SSLTLS": {
      "accion": "No se pudo abrir el canal TLS con el SII; suele ser intermitente. Reintentar con espera exponencial y un tope de 3 intentos; si persiste, contactar a soporte.",
      "reintentable": "si"
    },
    "CNX_HTTP_ERROR_TIMEOUT": {
      "accion": "Venció el tiempo de espera con el SII. Reintentar con espera exponencial y un tope de 3 intentos; antes de pedir folios de nuevo, consultar con caf_v1_consulta si el CAF salió igual.",
      "reintentable": "si"
    },
    "CONTRIBUYENTE_SIN_PERMISO": {
      "accion": "El SII no habilita a la empresa para la anulación masiva de folios; reintentar no lo cambia.",
      "reintentable": "no"
    },
    "DATOS_REQUERIDOS": {
      "accion": "Mandar el cuerpo de crear con los datos del certificado y los sets.",
      "reintentable": "no"
    },
    "EMPRESA_VERIFICACION_ACTIVIDADES_SII": {
      "accion": "El SII no verifica actividades económicas positivas para la empresa. Resolverlo en el SII y recién entonces volver a crear.",
      "reintentable": "no"
    },
    "ERROR_ACTUALIZANDO_CASILLAS": {
      "accion": "El SII rechazó o no completó la actualización de las casillas de intercambio; el detalle viaja en el mensaje. Leerlo antes de repetir.",
      "reintentable": "desconocido"
    },
    "ERROR_DECLARANDO_CUMPLIMENTO": {
      "accion": "El SII rechazó o no completó la declaración de cumplimiento, y la certificación queda marcada con este error. Consultar la certificación y leer el mensaje antes de repetir.",
      "reintentable": "desconocido"
    },
    "ERROR_DESCARGANDO_CERTIFICADO": {
      "accion": "Falló la descarga desde E-Cert. Si el mensaje habla del usuario o la contraseña, corregirlos; si no, reintentar una vez.",
      "reintentable": "desconocido"
    },
    "ERROR_GENERAL": {
      "accion": "Código genérico. Si el mensaje dice que el RUT es nulo o no es válido, corregirlo; si no, leer el mensaje y consultar el estado de la certificación antes de repetir.",
      "reintentable": "desconocido"
    },
    "ERROR_MODALIDAD_CLIENTE": {
      "accion": "El SII dice que el contribuyente no está autorizado para operar en esta modalidad (facturación MiPyme del SII). Lo tiene que resolver la empresa con el SII.",
      "reintentable": "no"
    },
    "ERROR_SOLICITANDO_CERTIFICADO": {
      "accion": "Falló la solicitud a E-Cert. Si el mensaje empieza con «Errores en lo datos», corregir los campos que nombra; si no, reintentar una vez.",
      "reintentable": "desconocido"
    },
    "INSUFICIENTE_SALDO": {
      "accion": "El cliente no tiene saldo prepago. Cargar saldo en el portal y volver a crear.",
      "reintentable": "no"
    },
    "NOT_ENOUGH_FOLIO_FROM_SII": {
      "accion": "El SII no autoriza los folios pedidos para este tipo de documento. Usar los vigentes, anular los sobrantes o gestionar con el SII una autorización mayor.",
      "reintentable": "no"
    },
    "NO_CERTIFICATE": {
      "accion": "Mandar el certificado en el cuerpo: la plataforma no tiene uno guardado para usar.",
      "reintentable": "no"
    },
    "PRODUCTO_REQUERIDO": {
      "accion": "Cargar al menos un producto con nombre y precio (actualizar) antes de iniciar.",
      "reintentable": "no"
    },
    "RANGE_INVALID": {
      "accion": "Al menos un folio del rango ya fue recibido por el SII y no se puede anular. Anular un rango que no incluya folios usados.",
      "reintentable": "no"
    },
    "RESP_HTTP_ERROR": {
      "accion": "Error interno sin código reconocible. Desde la versión 1.1, un rechazo en la validación del certificado llega con su propio código (por ejemplo CERT_REQUERIDO o CERT_EXPIRADO), así que este código ya no corresponde a ese caso. Si aparece, reintentar una vez; si se repite, no insistir y contactar a soporte indicando la hora del request.",
      "reintentable": "desconocido"
    },
    "RESP_INVALID": {
      "accion": "El SII respondió a la anulación algo que no se reconoce; el texto del SII viaja en el mensaje. Leerlo antes de repetir.",
      "reintentable": "desconocido"
    },
    "SEC_CERT_NOT_AUTHORIZED": {
      "accion": "El SII rechaza a este certificado para descargar CAF. Usar un certificado con ese permiso: repetir con el mismo no cambia la respuesta.",
      "reintentable": "no"
    },
    "SEC_EMP_NOT_AUTHORIZED": {
      "accion": "La empresa no está autorizada para operar en esta modalidad (usa la facturación MiPyme del SII). Lo tiene que resolver la empresa con el SII.",
      "reintentable": "no"
    },
    "SEC_USER_BOLSII": {
      "accion": "El contribuyente usa el Sistema de Emisión de Boletas Electrónicas del SII. Lo tiene que resolver la empresa con el SII.",
      "reintentable": "no"
    },
    "SEC_USER_NOT_AUTHENTICATED": {
      "accion": "El certificado no quedó autenticado en el sitio del SII. Puede ser una sesión vencida que la llamada siguiente renueva: reintentar una vez y, si se repite, revisar que el certificado esté habilitado para autenticarse en el SII.",
      "reintentable": "desconocido"
    },
    "SERVICIO_REQUERIDO": {
      "accion": "Cargar al menos un servicio con nombre y precio (actualizar) antes de iniciar.",
      "reintentable": "no"
    },
    "SET_AMBAS_BOLETAS_JUNTAS": {
      "accion": "Certificar boleta afecta (39) y boleta exenta (41) en certificaciones separadas.",
      "reintentable": "no"
    },
    "SET_BASICO_REQUERIDO_SII": {
      "accion": "Reenviar el pedido incluyendo el set básico (33).",
      "reintentable": "no"
    },
    "SET_CERTIFICADO": {
      "accion": "Quitar del pedido el set que el mensaje dice que ya está certificado.",
      "reintentable": "no"
    },
    "SET_DTE_BOLETA_JUNTOS": {
      "accion": "Certificar los sets de DTE y los de boletas en certificaciones separadas.",
      "reintentable": "no"
    },
    "SET_REQUERIDO": {
      "accion": "Indicar al menos un set a certificar en Sets.",
      "reintentable": "no"
    },
    "SII_CALL_ERROR": {
      "accion": "Falló una llamada de negocio al facade de anulación masiva del SII. Volver a listar los folios antes de repetir la anulación, para no actuar sobre un estado viejo.",
      "reintentable": "desconocido"
    },
    "SII_ERROR_CXN": {
      "accion": "Falla de comunicación con el SII. Reintentar con espera exponencial y un tope de 3 intentos; si persiste, contactar a soporte con el RUT.",
      "reintentable": "si"
    },
    "SII_RESPUESTA_INESPERADA": {
      "accion": "El SII devolvió algo que no se pudo interpretar. No reintentar; contactar a soporte con el RUT.",
      "reintentable": "no"
    },
    "SITUACION_SII_EMPRESA_REP_LEGAL": {
      "accion": "La empresa o su representante legal tiene una situación pendiente en el SII. Resolverla allá y recién entonces volver a crear.",
      "reintentable": "no"
    },
    "SOLICITUD_FOLIOS_MAYOR_AUTORIZADOS_SII": {
      "accion": "El SII no autoriza la cantidad pedida, ni siquiera un folio. Usar los folios vigentes o anular los sobrantes antes de volver a pedir.",
      "reintentable": "no"
    },
    "UKN": {
      "accion": "Error no clasificado: puede ser pasajero (una falla TLS, por ejemplo) o no. Consultar el estado de la operación antes de repetirla y, si se repite, contactar a soporte con el RUT y la hora.",
      "reintentable": "desconocido"
    },
    "UNKNOWN_ERROR_CAF": {
      "accion": "Error no clasificado al reobtener o descargar el CAF; el motivo viaja en el mensaje. Leerlo y, antes de pedir folios nuevos, consultar con caf_v1_consulta si el CAF quedó timbrado.",
      "reintentable": "desconocido"
    },
    "UNK_ERROR": {
      "accion": "El SII no respondió a la anulación. Repetirla con el mismo rango es seguro: si ya estaba anulado, el SII lo acepta como hecho.",
      "reintentable": "desconocido"
    },
    "VALOR_REQUERIDO": {
      "accion": "Mandar en el cuerpo al menos un campo a actualizar.",
      "reintentable": "no"
    }
  }
}
