Preparar la anulación de una factura en el SII
Ubica una factura afecta (33) emitida con el Facturador Gratuito del SII y le pide al portal la nota de crédito de anulación, sin firmarla ni emitirla.
| Tool ID | sii.anulacion.previsualizar |
| Nombre MCP | sii__anulacion__previsualizar |
| Conector | sii |
| Plano | action |
| Scope (permiso) | sii:write |
| Auth | connection_credentials |
| Versión | 1 |
| Sensible | sí |
| Deprecado | no |
| Comportamiento | readOnly=true, destructive=false, idempotent=true, openWorld=true |
Requiere conexión. Indica cuál en cada llamada: header
X-Connect-Connectionen REST, campoconnectionIden elexecutede MCP y en las opciones del SDK. No hay resolución implícita, ni siquiera con una sola conexión activa: la conexión es la empresa. El id sale deconexiones.estado.consultar.
Qué hace
El SII construye la nota completa a partir de la factura original: Connect no propone líneas ni montos. Identifica la factura por folio y fecha de emisión. Sólo alcanza a las facturas emitidas con ese portal; una emitida con otro proveedor no aparece en su lista y se rechaza diciéndolo. Requiere habilitación de la organización, permiso de la conexión y credencial de representante, y que la conexión tenga guardada la clave del certificado: se resuelve en el servidor y nunca viaja en la llamada ni en el resultado.
Entrada
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
documento | objeto | sí | La factura a anular, identificada como la conoce quien la emitió. |
documento.tipoDte | string | sí | Factura electrónica afecta. Es el único tipo medido hoy. |
documento.folio | string ^[1-9][0-9]{0,17}$ | sí | Folio de la factura a anular, en TEXTO: es un identificador, no una cantidad. |
documento.fechaEmision | string | sí | Fecha de emisión de la factura, AAAA-MM-DD, tal como la lista del portal. |
JSON Schema de entrada
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"documento": {
"type": "object",
"properties": {
"tipoDte": {
"type": "string",
"const": "33",
"description": "Factura electrónica afecta. Es el único tipo medido hoy."
},
"folio": {
"type": "string",
"pattern": "^[1-9][0-9]{0,17}$",
"description": "Folio de la factura a anular, en TEXTO: es un identificador, no una cantidad."
},
"fechaEmision": {
"type": "string",
"x-emisso-formato": "AAAA-MM-DD",
"description": "Fecha de emisión de la factura, AAAA-MM-DD, tal como la lista del portal."
}
},
"required": [
"tipoDte",
"folio",
"fechaEmision"
],
"additionalProperties": false,
"description": "La factura a anular, identificada como la conoce quien la emitió."
}
},
"required": [
"documento"
],
"additionalProperties": false
}Salida
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
anulacion | objeto | sí | La nota de crédito que el SII construyó a partir de la factura, todavía sin firmar. |
anulacion.tipoDte | string | sí | Nota de crédito electrónica. |
anulacion.operacion | string | sí | Anula el documento referido; no corrige montos ni texto. |
anulacion.referencia | objeto | sí | El documento que esta nota anula, según lo escribió el propio SII. |
anulacion.referencia.tipoDte | string | sí | Factura electrónica afecta: el tipo del documento anulado. |
anulacion.referencia.folio | string ^[1-9][0-9]{0,17}$ | sí | Folio de la factura a anular, en TEXTO: es un identificador, no una cantidad. |
anulacion.referencia.fechaEmision | string | sí | Fecha de emisión de la factura anulada, AAAA-MM-DD. |
anulacion.totales | objeto | sí | Totales calculados por el SII a partir de la factura original. Connect no los calcula ni los propone. |
anulacion.totales.neto | entero | sí | Monto neto en pesos, calculado por el SII. |
anulacion.totales.iva | entero | sí | IVA en pesos, calculado por el SII. |
anulacion.totales.total | entero | sí | Total en pesos; siempre igual a neto + IVA. |
previewRef | string | sí | Referencia opaca y de vida corta que liga esta preparación a una eventual emisión. |
expiraEn | string `^(?:(?:\d\d[2468][048] | \d\d[13579][26] | \d\d0[48] |
advertencias | lista de "confirmacion_humana_pendiente" | sí | Advertencias codificadas; nunca HTML ni datos del portal. confirmacion_humana_pendiente sale sólo cuando la preparación la creó una persona: ahí un propietario o administrador tiene que confirmarla en Connect. Llamando con clave de API no aparece, porque emitir confirma solo. |
JSON Schema de salida
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"anulacion": {
"type": "object",
"properties": {
"tipoDte": {
"type": "string",
"const": "61",
"description": "Nota de crédito electrónica."
},
"operacion": {
"type": "string",
"const": "anula",
"description": "Anula el documento referido; no corrige montos ni texto."
},
"referencia": {
"type": "object",
"properties": {
"tipoDte": {
"type": "string",
"const": "33",
"description": "Factura electrónica afecta: el tipo del documento anulado."
},
"folio": {
"type": "string",
"pattern": "^[1-9][0-9]{0,17}$",
"description": "Folio de la factura a anular, en TEXTO: es un identificador, no una cantidad."
},
"fechaEmision": {
"type": "string",
"x-emisso-formato": "AAAA-MM-DD",
"description": "Fecha de emisión de la factura anulada, AAAA-MM-DD."
}
},
"required": [
"tipoDte",
"folio",
"fechaEmision"
],
"additionalProperties": false,
"description": "El documento que esta nota anula, según lo escribió el propio SII."
},
"totales": {
"type": "object",
"properties": {
"neto": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Monto neto en pesos, calculado por el SII."
},
"iva": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "IVA en pesos, calculado por el SII."
},
"total": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Total en pesos; siempre igual a neto + IVA."
}
},
"required": [
"neto",
"iva",
"total"
],
"additionalProperties": false,
"description": "Totales calculados por el SII a partir de la factura original. Connect no los calcula ni los propone."
}
},
"required": [
"tipoDte",
"operacion",
"referencia",
"totales"
],
"additionalProperties": false,
"description": "La nota de crédito que el SII construyó a partir de la factura, todavía sin firmar."
},
"previewRef": {
"type": "string",
"minLength": 1,
"description": "Referencia opaca y de vida corta que liga esta preparación a una eventual emisión."
},
"expiraEn": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Instante en que la preparación deja de servir para emitir."
},
"advertencias": {
"maxItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"confirmacion_humana_pendiente"
]
},
"description": "Advertencias codificadas; nunca HTML ni datos del portal. `confirmacion_humana_pendiente` sale sólo cuando la preparación la creó una persona: ahí un propietario o administrador tiene que confirmarla en Connect. Llamando con clave de API no aparece, porque emitir confirma solo."
}
},
"required": [
"anulacion",
"previewRef",
"expiraEn",
"advertencias"
],
"additionalProperties": false
}Errores de esta tool
| Código | HTTP | Reintentable | Qué hacer |
|---|---|---|---|
connection_disabled | 403 | no | Reactívala en /connections o usa otra conexión del mismo sistema. |
connection_credential_required | 428 | no | Crea 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_busy | 409 | sí | Espera unos segundos y reintenta. Es una espera transitoria: no necesitas volver a conectar ni ingresar la credencial otra vez. |
upstream_error | 502 | sí | Reintenta más tarde. Si persiste, el problema está en el sistema externo, no en tu integración. |
timeout | 504 | sí | 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.