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

# Mantenimiento DGII

> Calendario oficial, impacto por ambiente y cuándo pasar a contingencia.

DGII publica ventanas de mantenimiento en el [calendario e-CF](https://dgii.gov.do/cicloContribuyente/facturacion/comprobantesFiscalesElectronicosE-CF/Paginas/Mantenimientos.aspx) y, cuando está disponible, en StatusECF.

emite.do las persiste y las expone en la API pública. No hace falta pegarle a DGII desde tu ERP.

## Consultar

Sin API key:

```bash theme={null}
curl https://api.emite.do/api/v1/dgii/status/maintenance
curl https://api.emite.do/api/v1/dgii/status/impact/ecf
```

`windows[]` trae `date_start` / `date_end` en UTC, ambientes afectados y `state` (`planned` | `in_progress` | `done`).

`recommend_contingency` es `true` si:

* hay una ventana **activa** en ese ambiente, o
* StatusECF marca el ambiente no disponible **sin** ventana (caída no programada).

En esos casos emite en [contingencia](/guides/contingency) si tienes que seguir facturando. Cuando DGII vuelve, el service reenvía.

## SDK

```python theme={null}
from ecfservice import ECFClient

with ECFClient() as client:
    impact = client.dgii.status_impact("ecf")
    if impact["recommend_contingency"]:
        print("Pasar a contingencia", impact["reason"], impact["active_window"])
    print(client.dgii.status_maintenance()["windows"])
```

C#: `Dgii.StatusImpactAsync("ecf")` y `Dgii.StatusMaintenanceAsync()`.

## Webhooks (opt-in)

Por defecto el endpoint nace con `ecf.*` (estados fiscales). Para avisos de calendario:

```json theme={null}
{ "events": ["ecf.*", "dgii.*"] }
```

| Evento                      | Cuándo                      |
| --------------------------- | --------------------------- |
| `dgii.maintenance.upcoming` | Falta ≤ 24 h                |
| `dgii.maintenance.started`  | La ventana acaba de iniciar |
| `dgii.maintenance.ended`    | Terminó                     |

El payload no lleva `public_id`: es un aviso de plataforma, no de un documento.

## Odoo on-prem

`l10n_do_ecf` sincroniza `dgii.maintenance.window` desde `{api_url}/v1/maintenance` (el contrato de ECF Sync / consultoriahenca). Si `ecf.sync.client.api_url` es `https://api.emite.do/api`, las rutas equivalentes son:

| ECF Sync                          | emite.do                              |
| --------------------------------- | ------------------------------------- |
| `GET /v1/maintenance`             | `GET /api/v1/maintenance`             |
| `GET /v1/maintenance/dgii-status` | `GET /api/v1/maintenance/dgii-status` |
| `GET /v1/maintenance/status`      | `GET /api/v1/maintenance/status`      |

Las ventanas salen con `date_start`/`date_end` en `America/Santo_Domingo` (`-04:00`), `id` entero, flags `affects_*` y `source`. El cron de Odoo manda `page` + `page_size=500` y `X-API-Key`; el GET no exige key (el calendario es público).

El módulo SaaS `l10n_do_ecf_client` no copia esas tablas: usa la API y los webhooks.
