# Consultar declaraciones F29 del SII

> Lee las declaraciones mensuales (Formulario 29) ya sincronizadas para esta conexión, con sus códigos.



{/* AUTO-GENERATED by @emisso/codegen. DO NOT EDIT. */}

|                     |                                                                    |
| ------------------- | ------------------------------------------------------------------ |
| **Tool ID**         | `sii.f29.consultar`                                                |
| **Nombre MCP**      | `sii__f29__consultar`                                              |
| **Conector**        | `sii`                                                              |
| **Plano**           | `action`                                                           |
| **Lee el alcance**  | `f29` (debe estar habilitado en la conexión)                       |
| **Scope (permiso)** | `sii:read`                                                         |
| **Auth**            | `none`                                                             |
| **Versión**         | `1`                                                                |
| **Sensible**        | sí                                                                 |
| **Deprecado**       | no                                                                 |
| **Comportamiento**  | readOnly=true, destructive=false, idempotent=true, openWorld=false |

> **Requiere conexión.** Indica cuál en cada llamada: header `X-Connect-Connection` en REST, campo `connectionId` en el `execute` de 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 de [`conexiones.estado.consultar`](../conexiones/estado-consultar).

## Qué hace [#qué-hace]

Lectura pura: NO contacta al SII. Por defecto trae sólo las vigentes; con 'incluirNoVigentes' trae también las rectificadas y anuladas. Filtra por un 'periodo' o por un rango 'desde'/'hasta'. Los códigos vienen por número sin ceros a la izquierda y un código ausente venía en blanco en el formulario (vacío no es cero). El F29 se revisa solo después de cada vencimiento; para forzar una revisión usa 'sii.conexion.sincronizar' con alcances \['f29']. Pagina con 'cursor'.

## Entrada [#entrada]

| Campo               | Tipo                   | Requerido            | Descripción                                                          |
| ------------------- | ---------------------- | -------------------- | -------------------------------------------------------------------- |
| `periodo`           | string `^\d{4}-\d{2}$` | no                   | Un período concreto, AAAA-MM.                                        |
| `desde`             | string `^\d{4}-\d{2}$` | no                   | Primer período del rango, inclusive.                                 |
| `hasta`             | string `^\d{4}-\d{2}$` | no                   | Último período del rango, inclusive.                                 |
| `incluirNoVigentes` | booleano               | no · default `false` | 'true' para traer también las declaraciones rectificadas y anuladas. |
| `cursor`            | string                 | no                   | Paginación: el valor que devolvió la respuesta anterior, tal cual.   |
| `limit`             | entero 1-120           | no · default `24`    | Filas por página.                                                    |

<details>
  <summary>
    JSON Schema de entrada
  </summary>

  ```json
  {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
      "periodo": {
        "description": "Un período concreto, AAAA-MM.",
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}$"
      },
      "desde": {
        "description": "Primer período del rango, inclusive.",
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}$"
      },
      "hasta": {
        "description": "Último período del rango, inclusive.",
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}$"
      },
      "incluirNoVigentes": {
        "default": false,
        "description": "'true' para traer también las declaraciones rectificadas y anuladas.",
        "type": "boolean"
      },
      "cursor": {
        "description": "Paginación: el valor que devolvió la respuesta anterior, tal cual.",
        "type": "string"
      },
      "limit": {
        "default": 24,
        "description": "Filas por página.",
        "type": "integer",
        "minimum": 1,
        "maximum": 120
      }
    }
  }
  ```
</details>

## Ejemplo [#ejemplo]

```bash title="curl"
curl -X POST https://connect.emisso.ai/api/v1/tools/sii.f29.consultar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Content-Type: application/json" \
  -d '{"input":{"desde":"2026-06","hasta":"2026-07"}}'
```

```ts title="SDK TypeScript"
const data = await connect.tools.sii.f29.consultar({ desde: "2026-06", hasta: "2026-07" }, { connectionId: "conn_9tKfR2mQx4Vb" });
```

```json title="MCP · meta-tool execute"
{
  "tool": "sii.f29.consultar",
  "params": {
    "desde": "2026-06",
    "hasta": "2026-07"
  },
  "connectionId": "conn_9tKfR2mQx4Vb"
}
```

**Salida esperada (200):**

```json
{
  "data": {
    "declaraciones": [
      {
        "folio": "1234567890",
        "periodo": "2026-07",
        "estado": "vigente",
        "tipoDeclaracion": "primitiva",
        "fechaPresentacion": "2026-08-11",
        "corrigeAFolios": [],
        "medioPago": "PEL",
        "banco": "ESTADO",
        "totalAPagar": 310250,
        "codigos": {
          "62": {
            "glosa": "PPM NETO DETERMINADO",
            "valor": 4750,
            "tipo": "monto"
          },
          "89": {
            "glosa": "IMP. DETERM. IVA",
            "valor": 305500,
            "tipo": "monto"
          },
          "91": {
            "glosa": "TOTAL A PAGAR DENTRO DEL PLAZO LEGAL",
            "valor": 310250,
            "tipo": "monto"
          },
          "115": {
            "glosa": "TASA PPM 1ra. CATEGORÍA",
            "valor": 0.125,
            "tipo": "tasa"
          },
          "502": {
            "glosa": "DÉBITOS FACTURAS EMITIDAS",
            "valor": 520000,
            "tipo": "monto"
          },
          "503": {
            "glosa": "CANTIDAD FACTURAS EMITIDAS",
            "valor": 12,
            "tipo": "monto"
          },
          "537": {
            "glosa": "TOTAL CRÉDITOS",
            "valor": 214500,
            "tipo": "monto"
          },
          "538": {
            "glosa": "TOTAL DÉBITOS",
            "valor": 520000,
            "tipo": "monto"
          }
        },
        "ultimaLecturaEn": "2026-08-13T11:02:10.000Z"
      }
    ],
    "cursor": null,
    "revision": {
      "revisadoEn": "2026-08-13T11:02:10.000Z",
      "completo": true,
      "pendientes": 0
    }
  },
  "meta": {
    "request_id": "req_…",
    "tool_id": "sii.f29.consultar",
    "plane": "action",
    "latency_ms": 24,
    "audit_status": "recorded"
  }
}
```

> Recortado a los códigos principales. 89 = 538 − 537 en esta declaración simple, pero no es una regla general: otras líneas del formulario (por ejemplo el 755) también entran al cálculo. El 115 es una tasa: 0.125 es 0,125 %, no 125.

## Salida [#salida]

| Campo                               | Tipo                               | Requerido | Descripción                                                                                                                                         |                                                                                                                                                                                                                                                                      |
| ----------------------------------- | ---------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `declaraciones`                     | lista de objeto                    | sí        | Las declaraciones que calzan con el filtro, de la más reciente a la más antigua. Salen de lo ya sincronizado, nunca de una consulta en vivo al SII. |                                                                                                                                                                                                                                                                      |
| `declaraciones[].folio`             | string                             | sí        | El folio de la declaración. Es su identidad: una rectificatoria tiene otro folio.                                                                   |                                                                                                                                                                                                                                                                      |
| `declaraciones[].periodo`           | string `^\d{4}-\d{2}$`             | sí        | El período tributario declarado, AAAA-MM. No es el mes en que se presentó.                                                                          |                                                                                                                                                                                                                                                                      |
| `declaraciones[].estado`            | string                             | sí        | El estado que muestra el SII, en minúsculas: 'vigente' es la que rige; una rectificada o 'anulada' queda como historia.                             |                                                                                                                                                                                                                                                                      |
| `declaraciones[].tipoDeclaracion`   | `"primitiva"` · `"rectificatoria"` | null      | sí                                                                                                                                                  | Si es la primera declaración del período o una que corrige a otra.                                                                                                                                                                                                   |
| `declaraciones[].fechaPresentacion` | string                             | null      | sí                                                                                                                                                  | Cuándo se presentó, AAAA-MM-DD.                                                                                                                                                                                                                                      |
| `declaraciones[].corrigeAFolios`    | lista de string                    | sí        | Los folios que esta declaración corrige. Vacío en una primitiva.                                                                                    |                                                                                                                                                                                                                                                                      |
| `declaraciones[].medioPago`         | string                             | null      | sí                                                                                                                                                  | El medio de pago tal como lo escribe el SII (por ejemplo 'PEL', pago electrónico).                                                                                                                                                                                   |
| `declaraciones[].banco`             | string                             | null      | sí                                                                                                                                                  | El banco por el que se pagó, cuando lo hubo.                                                                                                                                                                                                                         |
| `declaraciones[].totalAPagar`       | número                             | null      | sí                                                                                                                                                  | Código 91, total a pagar dentro del plazo legal, en pesos. 'null' si la declaración no trae ese código o sus códigos aún no se leyeron.                                                                                                                              |
| `declaraciones[].codigos`           | objeto                             | null      | sí                                                                                                                                                  | Los códigos del formulario con valor, por número de código sin ceros a la izquierda ('89', no '089'). Un código que no aparece venía en blanco en el formulario: vacío no es cero. 'null' cuando la declaración no es la vigente o su formulario todavía no se leyó. |
| `declaraciones[].ultimaLecturaEn`   | string                             | sí        | Cuándo se observó esta fila por última vez, en ISO 8601 UTC.                                                                                        |                                                                                                                                                                                                                                                                      |
| `cursor`                            | string                             | null      | sí                                                                                                                                                  | El cursor de la página siguiente, opaco. 'null' significa que no hay más filas; cualquier otro valor se reenvía tal cual en 'cursor' de la próxima llamada y nunca se construye a mano.                                                                              |
| `revision`                          | objeto                             | null      | sí                                                                                                                                                  | La última revisión del F29. 'null' significa que el F29 de esta conexión no se ha revisado nunca: una lista vacía con 'revision' distinto de null sí quiere decir que no hay declaraciones en ese rango.                                                             |
| `revision.revisadoEn`               | string                             | sí        | Cuándo terminó la última revisión del F29 de esta conexión, en ISO 8601 UTC.                                                                        |                                                                                                                                                                                                                                                                      |
| `revision.completo`                 | booleano                           | null      | sí                                                                                                                                                  | 'false' si quedaron declaraciones sin leer; se retoman solas en la revisión siguiente. 'null' si no se puede saber.                                                                                                                                                  |
| `revision.pendientes`               | entero                             | null      | sí                                                                                                                                                  | Cuántas declaraciones quedaron sin leer en esa revisión. 'null' si no se puede saber.                                                                                                                                                                                |

<details>
  <summary>
    JSON Schema de salida
  </summary>

  ```json
  {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
      "declaraciones": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "folio": {
              "type": "string",
              "description": "El folio de la declaración. Es su identidad: una rectificatoria tiene otro folio."
            },
            "periodo": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}$",
              "description": "El período tributario declarado, AAAA-MM. No es el mes en que se presentó."
            },
            "estado": {
              "type": "string",
              "description": "El estado que muestra el SII, en minúsculas: 'vigente' es la que rige; una rectificada o 'anulada' queda como historia."
            },
            "tipoDeclaracion": {
              "anyOf": [
                {
                  "type": "string",
                  "enum": [
                    "primitiva",
                    "rectificatoria"
                  ]
                },
                {
                  "type": "null"
                }
              ],
              "description": "Si es la primera declaración del período o una que corrige a otra."
            },
            "fechaPresentacion": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Cuándo se presentó, AAAA-MM-DD."
            },
            "corrigeAFolios": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Los folios que esta declaración corrige. Vacío en una primitiva."
            },
            "medioPago": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "El medio de pago tal como lo escribe el SII (por ejemplo 'PEL', pago electrónico)."
            },
            "banco": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "El banco por el que se pagó, cuando lo hubo."
            },
            "totalAPagar": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Código 91, total a pagar dentro del plazo legal, en pesos. 'null' si la declaración no trae ese código o sus códigos aún no se leyeron."
            },
            "codigos": {
              "anyOf": [
                {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {
                    "type": "object",
                    "properties": {
                      "glosa": {
                        "type": "string",
                        "description": "El nombre de la línea tal como lo escribe el formulario del SII. Puede cambiar de texto sin que cambie el código."
                      },
                      "valor": {
                        "type": "number",
                        "description": "El valor numérico. En pesos para los montos y cantidades; como número decimal para las tasas (0.125 es 0,125 %)."
                      },
                      "tipo": {
                        "type": "string",
                        "enum": [
                          "monto",
                          "tasa"
                        ],
                        "description": "'tasa' cuando el formulario escribe el valor con decimales (el código 115); 'monto' en todo lo demás, incluidas las cantidades de documentos."
                      }
                    },
                    "required": [
                      "glosa",
                      "valor",
                      "tipo"
                    ],
                    "additionalProperties": false
                  }
                },
                {
                  "type": "null"
                }
              ],
              "description": "Los códigos del formulario con valor, por número de código sin ceros a la izquierda ('89', no '089'). Un código que no aparece venía en blanco en el formulario: vacío no es cero. 'null' cuando la declaración no es la vigente o su formulario todavía no se leyó."
            },
            "ultimaLecturaEn": {
              "type": "string",
              "description": "Cuándo se observó esta fila por última vez, en ISO 8601 UTC."
            }
          },
          "required": [
            "folio",
            "periodo",
            "estado",
            "tipoDeclaracion",
            "fechaPresentacion",
            "corrigeAFolios",
            "medioPago",
            "banco",
            "totalAPagar",
            "codigos",
            "ultimaLecturaEn"
          ],
          "additionalProperties": false
        },
        "description": "Las declaraciones que calzan con el filtro, de la más reciente a la más antigua. Salen de lo ya sincronizado, nunca de una consulta en vivo al SII."
      },
      "cursor": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ],
        "description": "El cursor de la página siguiente, opaco. 'null' significa que no hay más filas; cualquier otro valor se reenvía tal cual en 'cursor' de la próxima llamada y nunca se construye a mano."
      },
      "revision": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "revisadoEn": {
                "type": "string",
                "description": "Cuándo terminó la última revisión del F29 de esta conexión, en ISO 8601 UTC."
              },
              "completo": {
                "anyOf": [
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "'false' si quedaron declaraciones sin leer; se retoman solas en la revisión siguiente. 'null' si no se puede saber."
              },
              "pendientes": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Cuántas declaraciones quedaron sin leer en esa revisión. 'null' si no se puede saber."
              }
            },
            "required": [
              "revisadoEn",
              "completo",
              "pendientes"
            ],
            "additionalProperties": false
          },
          {
            "type": "null"
          }
        ],
        "description": "La última revisión del F29. 'null' significa que el F29 de esta conexión no se ha revisado nunca: una lista vacía con 'revision' distinto de null sí quiere decir que no hay declaraciones en ese rango."
      }
    },
    "required": [
      "declaraciones",
      "cursor",
      "revision"
    ],
    "additionalProperties": false
  }
  ```
</details>

## Errores de esta tool [#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.             |
| `alcance_not_enabled` | 403  | no           | Habilita el alcance en /connections o quítalo del input de la sincronización. |

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](../errores).

## Próximos pasos [#próximos-pasos]

* [`sii.conexion.sincronizar`](./conexion-sincronizar): la tool que escribe los datos que esta lectura devuelve.
* [Sincronizar y consultar](/docs/conceptos/sincronizar-consultar): por qué leer datos reales son dos pasos.
