---
title: "Genera el ATS del período, lo valida y lo archiva"
method: POST
path: "/ats/generar"
tags: ["ats"]
---

# Genera el ATS del período, lo valida y lo archiva

`POST /ats/generar`

## Request

- Base URL: `https://contadeo.com/api`
- URL: `https://contadeo.com/api/ats/generar`
- Auth: HTTP bearer

Serializa el anexo, lo valida contra las reglas de la ficha y contra el XSD oficial, guarda el XML en el almacenamiento de objetos con su sha256 y archiva el snapshot en `declaraciones_hechas` (código `ATS`, período `aaaa-mm` o `aaaa-S1`/`aaaa-S2`). **Si el anexo no valida responde 400 con el informe y no guarda nada**; `forzar: true` lo guarda igual y lo deja marcado como forzado. **No devuelve el XML**: para eso está `GET /ats/{periodo}/descargar`. Requiere el módulo `ats`.

## Request body

- object
  - `emisorId` string, uuid, required
  - `anio` integer, required
  - `mes` integer: Anexo mensual. Se ignora si viene `semestre`.
  - `semestre` 1 | 2: Anexo semestral del RIMPE: 1 = enero-junio, 2 = julio-diciembre. Es una opción del contribuyente, no un default del régimen, y no se persiste: se pide en cada generación.
  - `forzar` boolean: Guarda el anexo aunque no valide, marcándolo como forzado y dejando la declaración en estado `borrador`.
  - `excluir332` boolean: Con `true`, las compras sin retención de renta salen sin el concepto 332. La ficha técnica pide reportarlo; el XSD admite el anexo sin él y la regla N10 lo avisa.
  - `excluirRetencionesElectronicas` boolean: Con `false`, lo que cada cliente retuvo se reporta en ventas (`valorRetIva`, `valorRetRenta`). Por defecto van en 0.00, como indica la ficha técnica para las retenciones con comprobante electrónico; la regla N11 dice cuántos comprobantes quedan fuera.

## Response `201`

Anexo generado y archivado

- object
  - `periodo` object
    - `anio` integer
    - `mes` integer
    - `semestral` boolean
    - `etiqueta` string: `2026-08` o `2026-S1`: es lo que se pasa a la ruta de descarga.
  - `archivo` object
    - `xml` string: `ATmmaaaa.xml`, el nombre del XML dentro del ZIP.
    - `zip` string: `ATmmaaaa.zip`, el nombre que pide la ficha.
    - `bytes` integer
  - `hashXml` string: `sha256:<hex>` del XML archivado.
  - `generadoAt` string, date-time
  - `estado` 'listo' | 'borrador': `listo` si el anexo valida (cifras congeladas); `borrador` si se forzó.
  - `forzado` boolean
  - `opciones` object: Opciones de generación con las que se armó el anexo.
    - `excluir332` boolean
    - `excluirRetencionesElectronicas` boolean
  - `totales` object: Totales de cabecera y conteos por sección, tal como quedaron en el snapshot.
  - `informe` object: Informe de las reglas V1-V17 y N1-N9, igual que en el borrador.
  - `xsd` object
  - `exclusiones` object[]
  - `brechas` object[]

## Other responses

- `400`: El anexo no está listo para presentarse: el cuerpo lleva `informe`, `xsd`, `exclusiones` y `brechas`, y no se guardó nada. Repetir con `forzar: true` lo guarda marcado.
- `402`: El plan del tenant no incluye el módulo `ats` (`upgrade: true`)
- `403`: Rol insuficiente o acceso denegado
- `404`: Recurso inexistente (o de otra cuenta — aislamiento multi-tenant)
- `409`: El período ya está marcado como presentado: el archivo guardado es la evidencia y no se sobrescribe.

---

[API](https://skmtc.dev/contadeo/apis/api-de-contadeo.md) · [All operations](https://skmtc.dev/contadeo/apis/api-de-contadeo/llms.txt) · [OpenAPI document](https://skmtc.dev/contadeo/apis/api-de-contadeo/revisions/461bbb9a74ce?raw)
