Connect

Preparar boleta en e-Boleta

Prepara una boleta 39 o 41 en E-Boleta del SII sin emitir y devuelve previewRef, vigente 15 minutos.

Tool IDsii.boleta.previsualizar
Nombre MCPsii__boleta__previsualizar
Conectorsii
Planoaction
Scope (permiso)sii:boletas:write
Authconnection_credentials
Versión1
Sensiblesí
Deprecadono
ComportamientoreadOnly=true, destructive=false, idempotent=true, openWorld=true

Requiere conexión. Indica cuál en cada llamada: header X-Connect-Connection en REST y campo connectionId en el execute de MCP. No hay resolución implícita, ni siquiera con una sola conexión activa: la conexión es la empresa. El id sale de conexiones.estado.consultar.

Qué hace

Requiere la conexión de representante con las boletas activas y el permiso sii:boletas:write. Si la empresa tiene varias sucursales en E-Boleta, indica en sucursal desde cuál se emite esta boleta (los códigos salen de sii.boleta_sucursales.listar); con una sola se usa esa. La respuesta dice qué sucursal se usó.

Entrada

CampoTipoRequeridoDescripción
candidatoobjetosíBaseline de una línea con cantidad 1; no acepta fecha, folio, referencias ni descuentos.
candidato.tipoDte"39" · "41"síTipo de boleta: 39 afecta o 41 exenta.
candidato.montoTotalenterosíMonto total entero en CLP. El límite es de representación segura; no acredita un máximo del SII.
candidato.detallestringnoDescripción de la única línea, hasta 80 caracteres.
candidato.medioPagoCodigostringnoCódigo contrastado con el catálogo fresco al preparar.
candidato.receptorobjetonoReceptor opcional; no se inventan valores cuando está ausente.
candidato.receptor.rutstringsíRUT del receptor validado con módulo 11 y canonizado.
candidato.receptor.razonSocialstringsíNombre o razón social del receptor.
candidato.receptor.direccionstringsíDirección del receptor.
candidato.receptor.correostring ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$noCorreo opcional del receptor.
candidato.receptor.telefonostringnoTeléfono opcional del receptor.
sucursalenteronoCódigo SII de la sucursal que emite esta boleta. Si la empresa tiene una sola sucursal en E-Boleta se usa esa y no hace falta. Si tiene varias es obligatorio en cada boleta: no queda guardado ni hay una por defecto. Los códigos salen de sii.boleta_sucursales.listar.
JSON Schema de entrada
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "candidato": {
      "type": "object",
      "properties": {
        "tipoDte": {
          "type": "string",
          "enum": [
            "39",
            "41"
          ],
          "description": "Tipo de boleta: 39 afecta o 41 exenta."
        },
        "montoTotal": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991,
          "description": "Monto total entero en CLP. El límite es de representación segura; no acredita un máximo del SII."
        },
        "detalle": {
          "description": "Descripción de la única línea, hasta 80 caracteres.",
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        "medioPagoCodigo": {
          "description": "Código contrastado con el catálogo fresco al preparar.",
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        },
        "receptor": {
          "description": "Receptor opcional; no se inventan valores cuando está ausente.",
          "type": "object",
          "properties": {
            "rut": {
              "description": "RUT del receptor validado con módulo 11 y canonizado.",
              "type": "string"
            },
            "razonSocial": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100,
              "description": "Nombre o razón social del receptor."
            },
            "direccion": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "description": "Dirección del receptor."
            },
            "correo": {
              "description": "Correo opcional del receptor.",
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "telefono": {
              "description": "Teléfono opcional del receptor.",
              "type": "string",
              "minLength": 1,
              "maxLength": 32
            }
          },
          "required": [
            "rut",
            "razonSocial",
            "direccion"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "tipoDte",
        "montoTotal"
      ],
      "additionalProperties": false,
      "description": "Baseline de una línea con cantidad 1; no acepta fecha, folio, referencias ni descuentos."
    },
    "sucursal": {
      "description": "Código SII de la sucursal que emite esta boleta. Si la empresa tiene una sola sucursal en E-Boleta se usa esa y no hace falta. Si tiene varias es obligatorio en cada boleta: no queda guardado ni hay una por defecto. Los códigos salen de `sii.boleta_sucursales.listar`.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "candidato"
  ],
  "additionalProperties": false
}

Ejemplo

curl
curl -X POST https://connect.emisso.ai/api/v1/tools/sii.boleta.previsualizar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Content-Type: application/json" \
  -d '{"input":{"candidato":{"tipoDte":"39","montoTotal":25000,"detalle":"Mantención de jardín - Av. Los Aromos 1234","medioPagoCodigo":"TRANSFERENCIA"}}}'
MCP · meta-tool execute
{
  "tool": "sii.boleta.previsualizar",
  "params": {
    "candidato": {
      "tipoDte": "39",
      "montoTotal": 25000,
      "detalle": "Mantención de jardín - Av. Los Aromos 1234",
      "medioPagoCodigo": "TRANSFERENCIA"
    }
  },
  "connectionId": "conn_9tKfR2mQx4Vb"
}

Salida esperada (200):

{
  "data": {
    "candidato": {
      "tipoDte": "39",
      "montoTotal": 25000,
      "detalle": "Mantención de jardín - Av. Los Aromos 1234",
      "medioPagoCodigo": "TRANSFERENCIA"
    },
    "totales": {
      "total": 25000
    },
    "advertencias": [
      "receptor_no_informado"
    ],
    "sucursal": {
      "codigo": 0,
      "direccion": "Av. Los Aromos 1234",
      "comuna": "Providencia"
    },
    "previewRef": "ebr.1.1.Tz4Kp9Wm2Qx7Lb5N.Vc8Rj3Yt6Hn1Fs0Gk4DmQw.Jq2Ux9Ab4Lr7Wn1Ze5Ct8Ks3Pv6Hy0Mf2Gd9Tb4Nx7Qa1Rw5Ej8Lc3Vu6Is0Op2Y"
  },
  "meta": {
    "request_id": "req_…",
    "tool_id": "sii.boleta.previsualizar",
    "plane": "action",
    "latency_ms": 7410,
    "audit_status": "recorded"
  }
}

No emite nada. El previewRef vence en 15 minutos y se emite con sii.boleta.emitir. Paso a paso en Boletas 39 y 41.

Salida

CampoTipoRequeridoDescripción
candidatoobjetosíBaseline de una línea con cantidad 1; no acepta fecha, folio, referencias ni descuentos.
candidato.tipoDte"39" · "41"síTipo de boleta: 39 afecta o 41 exenta.
candidato.montoTotalenterosíMonto total entero en CLP. El límite es de representación segura; no acredita un máximo del SII.
candidato.detallestringnoDescripción de la única línea, hasta 80 caracteres.
candidato.medioPagoCodigostringnoCódigo contrastado con el catálogo fresco al preparar.
candidato.receptorobjetonoReceptor opcional; no se inventan valores cuando está ausente.
candidato.receptor.rutstringsíRUT del receptor validado con módulo 11 y canonizado.
candidato.receptor.razonSocialstringsíNombre o razón social del receptor.
candidato.receptor.direccionstringsíDirección del receptor.
candidato.receptor.correostring ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$noCorreo opcional del receptor.
candidato.receptor.telefonostringnoTeléfono opcional del receptor.
totalesobjetosíTotal de la única línea. No acredita un desglose neto/IVA del SII.
totales.totalenterosíMonto total entero en CLP. El límite es de representación segura; no acredita un máximo del SII.
advertenciaslista de "receptor_no_informado" · "medio_pago_no_informado" · "confirmacion_humana_pendiente"síAdvertencias codificadas de la preparación. confirmacion_humana_pendiente ya no se emite: quien preparó la boleta la confirma al emitir; se conserva sólo por compatibilidad.
sucursalobjetosíLa sucursal desde la que se emitirá esta boleta.
sucursal.codigoenterosíCódigo SII de la sucursal (CdgSIISucur).
sucursal.direccionstringsíDirección de la sucursal tal como la muestra E-Boleta.
sucursal.comunastringnullsí
previewRefstring ^[A-Za-z0-9_.-]+$síReferencia opaca de preparación ligada a su propietario; vigencia máxima de 15 minutos para iniciar emisión.
JSON Schema de salida
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "candidato": {
      "type": "object",
      "properties": {
        "tipoDte": {
          "type": "string",
          "enum": [
            "39",
            "41"
          ],
          "description": "Tipo de boleta: 39 afecta o 41 exenta."
        },
        "montoTotal": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991,
          "description": "Monto total entero en CLP. El límite es de representación segura; no acredita un máximo del SII."
        },
        "detalle": {
          "description": "Descripción de la única línea, hasta 80 caracteres.",
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        "medioPagoCodigo": {
          "description": "Código contrastado con el catálogo fresco al preparar.",
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        },
        "receptor": {
          "description": "Receptor opcional; no se inventan valores cuando está ausente.",
          "type": "object",
          "properties": {
            "rut": {
              "description": "RUT del receptor validado con módulo 11 y canonizado.",
              "type": "string"
            },
            "razonSocial": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100,
              "description": "Nombre o razón social del receptor."
            },
            "direccion": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "description": "Dirección del receptor."
            },
            "correo": {
              "description": "Correo opcional del receptor.",
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "telefono": {
              "description": "Teléfono opcional del receptor.",
              "type": "string",
              "minLength": 1,
              "maxLength": 32
            }
          },
          "required": [
            "rut",
            "razonSocial",
            "direccion"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "tipoDte",
        "montoTotal"
      ],
      "additionalProperties": false,
      "description": "Baseline de una línea con cantidad 1; no acepta fecha, folio, referencias ni descuentos."
    },
    "totales": {
      "type": "object",
      "properties": {
        "total": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991,
          "description": "Monto total entero en CLP. El límite es de representación segura; no acredita un máximo del SII."
        }
      },
      "required": [
        "total"
      ],
      "additionalProperties": false,
      "description": "Total de la única línea. No acredita un desglose neto/IVA del SII."
    },
    "advertencias": {
      "maxItems": 3,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "receptor_no_informado",
          "medio_pago_no_informado",
          "confirmacion_humana_pendiente"
        ]
      },
      "description": "Advertencias codificadas de la preparación. `confirmacion_humana_pendiente` ya no se emite: quien preparó la boleta la confirma al emitir; se conserva sólo por compatibilidad."
    },
    "sucursal": {
      "type": "object",
      "properties": {
        "codigo": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "Código SII de la sucursal (CdgSIISucur)."
        },
        "direccion": {
          "type": "string",
          "maxLength": 1000,
          "description": "Dirección de la sucursal tal como la muestra E-Boleta."
        },
        "comuna": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 200
            },
            {
              "type": "null"
            }
          ],
          "description": "Comuna de la sucursal; null si E-Boleta no la informa."
        }
      },
      "required": [
        "codigo",
        "direccion",
        "comuna"
      ],
      "additionalProperties": false,
      "description": "La sucursal desde la que se emitirá esta boleta."
    },
    "previewRef": {
      "type": "string",
      "minLength": 24,
      "maxLength": 8192,
      "pattern": "^[A-Za-z0-9_.-]+$",
      "description": "Referencia opaca de preparación ligada a su propietario; vigencia máxima de 15 minutos para iniciar emisión."
    }
  },
  "required": [
    "candidato",
    "totales",
    "advertencias",
    "sucursal",
    "previewRef"
  ],
  "additionalProperties": false
}

Errores de esta tool

CódigoHTTPReintentableQué hacer
connection_disabled403noReactívala en /connections o usa otra conexión del mismo sistema.
connection_not_found404noUsa uno de los connectionId que lista el error, o revisa la conexión en /connections. No hace falta reactivar nada.
connection_credential_required428noCrea un enlace con conexiones.enlace.crear (modo reconectar si la conexión ya existe) y pide a la persona que entregue la credencial de nuevo. No reintentes con la credencial anterior.
connection_busy409síEspera unos segundos y reintenta. Es una espera transitoria: no necesitas volver a conectar ni ingresar la credencial otra vez.
upstream_error502síReintenta más tarde. Si persiste, el problema está en el sistema externo, no en tu integración.
timeout504síReintenta. Para sincronizaciones largas usa la vía asíncrona y consulta el estado del trabajo.

Toda llamada puede devolver además los códigos transversales (validation_error, unauthorized, scope_not_granted, rate_limited, entre otros): el detalle vive en el catálogo de errores.

En esta página