import { Aside, Code } from "@astrojs/starlight/components";
import models from "../../../../public/models/csharp/Ecf.cs?raw";

Records con `System.Text.Json` (`[JsonPropertyName]`) y los campos obligatorios marcados como `required`. Agrega los archivos a tu proyecto; el espacio de nombres es `NovaFE.Client.Models`.

## Descargar

{/* prettier-ignore */}
- <a href="/models/csharp/Ecf.cs" download>Ecf.cs</a>: emisión de e-CF, con sus tipos anidados.
- <a href="/models/novafe-models-csharp.zip" download>novafe-models-csharp.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

```csharp title="Emitir.cs"
using System.Net.Http.Json;
using System.Text.Json;
using System.Text.Json.Serialization;
using NovaFE.Client.Models;

var payload = new IssueEcfCommand
{
    Type = 31,
    IncomeType = "01",
    InternalNumber = "FAC-2026-00042",
    Buyer = new EcfBuyerPayload { Rnc = "131880681", Name = "Mi Cliente SRL" },
    Payment = new EcfPaymentPayload
    {
        Condition = "credit",
        DueDate = "15-03-2026",
        Methods = [new EcfPaymentMethodPayload { Type = "check_transfer", Amount = 2360m }],
    },
    Lines =
    [
        new EcfLinePayload
        {
            Name = "Servicio de consultoría",
            Kind = "service",
            Quantity = 1m,
            UnitOfMeasure = "43",
            UnitPrice = 2000m,
            ItbisRate = 1,
        },
    ],
};

using var http = new HttpClient { BaseAddress = new Uri("https://api.novafe.example") };
http.DefaultRequestHeaders.Add("X-API-Key", Environment.GetEnvironmentVariable("NOVAFE_API_KEY"));
http.DefaultRequestHeaders.Add("Idempotency-Key", Guid.NewGuid().ToString());

var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull };
var response = await http.PostAsJsonAsync("/api/v1/ecf", payload, options);
response.EnsureSuccessStatusCode();

var ecf = await response.Content.ReadFromJsonAsync<EcfDto>();
Console.WriteLine($"{ecf!.Encf} {ecf.Status}");
```

## Modelos de emisión

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

<Code code={models} lang="csharp" title="Ecf.cs" />

<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>