import { Aside, Code } from "@astrojs/starlight/components";
import models from "../../../../public/models/python/ecf.py?raw";

Dataclasses sin dependencias externas. Cada modelo tiene `to_dict()` para armar el JSON del request y `from_dict()` para leer la respuesta. Descarga el zip completo y descomprímelo como un paquete (incluye `__init__.py`), por ejemplo como `novafe_models`.

## Descargar

{/* prettier-ignore */}
- <a href="/models/python/ecf.py" download>ecf.py</a>: emisión de e-CF, con sus tipos anidados.
- <a href="/models/novafe-models-python.zip" download>novafe-models-python.zip</a>: todas las áreas de la API.
- <a href="/openapi/novafe-public.json" download>documento OpenAPI</a>: el contrato completo, para generar tus propios modelos.

## Ejemplo: emitir un comprobante

```python title="emitir.py"
import os
import uuid
from decimal import Decimal

import requests

from novafe_models.ecf import (
    EcfBuyerPayload,
    EcfDto,
    EcfLinePayload,
    EcfPaymentMethodPayload,
    EcfPaymentPayload,
    IssueEcfCommand,
)

payload = IssueEcfCommand(
    type=31,
    income_type="01",
    internal_number="FAC-2026-00042",
    buyer=EcfBuyerPayload(rnc="131880681", name="Mi Cliente SRL"),
    payment=EcfPaymentPayload(
        condition="credit",
        due_date="15-03-2026",
        methods=[EcfPaymentMethodPayload(type="check_transfer", amount=Decimal("2360"))],
    ),
    lines=[
        EcfLinePayload(
            name="Servicio de consultoría",
            kind="service",
            quantity=Decimal("1"),
            unit_of_measure="43",
            unit_price=Decimal("2000"),
            itbis_rate=1,
        )
    ],
)

response = requests.post(
    "https://api.novafe.example/api/v1/ecf",
    json=payload.to_dict(),
    headers={
        "X-API-Key": os.environ["NOVAFE_API_KEY"],
        "Idempotency-Key": str(uuid.uuid4()),
    },
)
response.raise_for_status()

ecf = EcfDto.from_dict(response.json())
print(ecf.encf, ecf.status)
```

## Modelos de emisión

Todo el contenido de `ecf.py`, listo para copiar. Incluye `IssueEcfCommand` (el cuerpo de `POST /ecf`), `EcfDto` (la respuesta) y sus tipos anidados.

<Code code={models} lang="python" title="ecf.py" />

<Aside type="tip" title="Otras áreas de la API">
  Los modelos de secuencias, webhooks, recepción B2B y el resto están en el zip
  y en la [página de descargas](/sdk-modelos/).
</Aside>