> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fegora.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Anulación de un DTE

> Cuándo se puede anular un documento certificado, las dos rutas del API para hacerlo y qué ocurre fiscalmente con el DTE anulado.

Anular un DTE no lo elimina: el documento permanece disponible con toda su información original, pero queda marcado como **anulado** y deja de tener validez fiscal como comprobante vigente. Fegora expone dos rutas equivalentes para anular — una nueva y una legacy — que internamente ejecutan la misma operación.

## Cuándo se puede anular

* El documento debe estar **certificado** (`estado: "Certificado"`). Un documento ya anulado no puede anularse de nuevo.
* Debe indicarse un **motivo de anulación** (obligatorio, máximo 500 caracteres).
* La fecha de anulación es opcional — si se omite, se usa el momento de la solicitud. Si se indica explícitamente, no puede ser una fecha futura.

## Ruta recomendada: `POST /dte/{id}/anular`

```bash theme={null}
curl -X POST https://api.fegora.com/dte/8F3A1C2E-9B7D-4E51-8A0F-1234567890AB/anular \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...ejemplo" \
  -H "Content-Type: application/json" \
  -d '{
        "dteId": "8F3A1C2E-9B7D-4E51-8A0F-1234567890AB",
        "motivoAnulacion": "Error en el NIT del receptor"
      }'
```

| Campo                      | Tipo          | Obligatorio | Descripción                                                                                                                                                                  |
| -------------------------- | ------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `dteId`                    | string (UUID) | Sí          | Debe coincidir exactamente con el `{id}` de la URL — si difieren, el API responde `400` ("DTE ID mismatch").                                                                 |
| `motivoAnulacion`          | string        | Sí          | Motivo de la anulación. Máximo 500 caracteres.                                                                                                                               |
| `fechaAnulacion`           | datetime      | No          | Fecha/hora de la anulación. Por defecto, el momento de la solicitud. No puede ser futura.                                                                                    |
| `numeroDocumentoAnulacion` | string        | No          | Identificador interno de la anulación para su propio sistema. Máximo 100 caracteres.                                                                                         |
| `forzarAmbientePruebas`    | boolean       | No          | Fuerza el ambiente de la anulación, con el mismo comportamiento que `forzarAmbientePruebas` al crear un DTE — vea [Ambientes](/primeros-pasos/ambientes).                    |
| `forzarActualizacion`      | boolean       | No          | Omite la comunicación con el certificador y guarda la anulación directamente. Pensado para cuentas de prueba cuyo certificador de pruebas rechaza la solicitud de anulación. |

### Respuesta

Una anulación exitosa devuelve `200 OK` con el DTE completo, ya reflejando el nuevo estado:

```json theme={null}
{
  "id": "8F3A1C2E-9B7D-4E51-8A0F-1234567890AB",
  "tipo": "factura",
  "estado": "Anulado",
  "anulado": true,
  "datosAnulacion": {
    "motivoAnulacion": "Error en el NIT del receptor",
    "fechaAnulacion": "2026-07-12T15:40:02",
    "fechaCertificacion": "2026-07-12T15:40:05"
  },
  "archivoXmlUri": "https://cdn.fegora.com/dtes/8F3A1C2E-9B7D-4E51-8A0F-1234567890AB.xml",
  "archivoPdfUri": "https://cdn.fegora.com/pdfs/8F3A1C2E-9B7D-4E51-8A0F-1234567890AB.pdf"
}
```

`archivoXmlUri` pasa a apuntar al XML de anulación (firmado y, cuando aplica, certificado ante la autoridad fiscal) — el XML de emisión original ya no es el que se sirve en esa URL.

## Ruta legacy: `PATCH /dte`

Se mantiene por compatibilidad con integraciones existentes. Ejecuta la misma operación que la ruta anterior:

```bash theme={null}
curl -X PATCH https://api.fegora.com/dte \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...ejemplo" \
  -H "Content-Type: application/json" \
  -H "x-force: true" \
  -d '{
        "id": "8F3A1C2E-9B7D-4E51-8A0F-1234567890AB",
        "anulado": true,
        "datosAnulacion": { "motivoAnulacion": "Error en el NIT del receptor" }
      }'
```

* Si se omite `datosAnulacion.motivoAnulacion`, el motivo registrado es literalmente **"Anulación"**.
* El header `x-force: true` equivale a `forzarActualizacion: true` de la ruta nueva.

<Note>
  El header `x-force` sólo existe en esta ruta legacy. No debe confundirse con `forzarAmbientePruebas` — vea [Ambientes: pruebas y producción](/primeros-pasos/ambientes) para el mecanismo de ambiente por documento.
</Note>

## Desanulación

`PATCH /dte` con `anulado: false` revierte el estado del documento a no-anulado:

```json theme={null}
{
  "id": "8F3A1C2E-9B7D-4E51-8A0F-1234567890AB",
  "anulado": false
}
```

No existe un `POST /dte/{id}/desanular` equivalente a la ruta nueva de anulación — la desanulación sólo está disponible por esta vía legacy.

<Warning>
  Esta operación **es únicamente local**: cambia el estado del documento en Fegora, pero no se comunica con el certificador ni con la autoridad fiscal (SAT/MH/DGII) para revertir la anulación ante ellos. Si el documento ya fue anulado ante el certificador, usar "Marcar como no anulado" deja el registro de Fegora desincronizado del estado real ante la autoridad fiscal. Úsela sólo para corregir una anulación hecha por error en Fegora, no como mecanismo para "deshacer" una anulación ya certificada.
</Warning>

## Errores comunes

| Código                      | HTTP | Cuándo ocurre                                                                                                                                                                  |
| --------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `FEG_DET_OBTE_INEX`         | 400  | El `id` indicado no corresponde a un DTE existente (o no pertenece a una cuenta a la que el usuario tiene acceso).                                                             |
| `FEG_DTE_INVALID_OPERATION` | 400  | El documento ya está anulado, no está certificado (no se puede anular algo que no llegó a certificarse), o falta el motivo de anulación. El detalle exacto viaja en `mensaje`. |

Vea el catálogo completo en [Manejo de errores](/primeros-pasos/errores).

<Warning>
  **Solo República Dominicana.** Al momento de escribir esta página, la anulación contra el certificador Digifact NUC DO devuelve un error `404` del lado del certificador (no un "documento no encontrado" de Fegora) — un problema de endpoint/ambiente de prueba del certificador, no de los datos enviados. Confirme el estado actual con el equipo antes de depender de la anulación en DO.
</Warning>

## Páginas relacionadas

<Columns cols={2}>
  <Card title="Casos especiales" icon="puzzle" href="/dte/casos-especiales">
    Contingencia, exportación, plantillas y otros flujos fuera de la emisión estándar.
  </Card>

  <Card title="Manejo de errores" icon="octagon-alert" href="/primeros-pasos/errores">
    Formato de errores y catálogo completo de códigos.
  </Card>
</Columns>
