SDK .NET
Cliente oficial de la API para .NET. Cubre autenticacion, idempotencia, reintentos y firma de webhook.
Paquetes#
| Paquete | Uso |
|---|---|
Ecuafact.Sdk |
Cliente, modelos de datos, excepciones y firma de webhooks |
Ecuafact.Sdk.Core |
Registro del cliente para inyeccion de dependencias (ASP.NET Core o Worker Service) |
Compatible con netstandard2.0 (.NET Framework 4.6.1+) y net10.0.
Instalacion#
dotnet add package Ecuafact.Sdk
dotnet add package Ecuafact.Sdk.Core # opcional, para inyeccion de dependencias
Uso basico#
Crea el cliente una vez y reutilizalo.
using Ecuafact.Sdk;
var client = EcuafactClient.Create(new EcuafactClientOptions
{
BaseAddress = new Uri("https://staging-api.mynexusapi.com/"),
ApiKey = Environment.GetEnvironmentVariable("ECUAFACT_API_KEY")!,
Identificacion = "1790012345001" // solo integraciones de un RUC
});
// comprobante: la Estructura del comprobante (ver [Factura](/v1/guias/emision-01)).
EmisionResultado r = await client.EmitirAsync(comprobante);
Console.WriteLine($"Operacion {r.Admission.IdOperacion} / codigo: {r.Admission.Codigo}");
DateTime desde = new DateTime(2026, 1, 1);
DateTime hasta = new DateTime(2026, 1, 31);
PaginaComprobantes emitidos = await client.ListarEmitidosAsync(
new ListadoRequest { Desde = desde, Hasta = hasta });
QuotaBucket cupo = await client.GetConsumoAsync();
Contexto contexto = await client.GetContextoAsync();
Para varias API Key o varios RUC de la misma cuenta:
IEcuafactContribuyente a = client.Para("1790012345001");
IEcuafactContribuyente b = client.Para("1790099987001");
await a.EmitirAsync(comprobanteA);
await b.EmitirAsync(comprobanteB); // concurrente y seguro
Uso con inyeccion de dependencias#
En aplicaciones con Microsoft.Extensions.DependencyInjection (ASP.NET Core,
Worker Service) registra el cliente y resuelve la interfaz.
using Ecuafact.Sdk.Core;
builder.Services.AddEcuafactClient(o =>
{
o.BaseAddress = new Uri(configuration["Ecuafact:BaseUrl"]!);
o.ApiKey = configuration["Ecuafact:ApiKey"]!;
// o.Identificacion = "1790012345001"; // solo un RUC
});
public sealed class Facturacion(IEcuafactClient client)
{
public async Task EmitirAsync(ComprobanteRequest comprobante, CancellationToken ct)
{
EmisionResultado r = await client.EmitirAsync(comprobante, ct: ct);
Console.WriteLine(r.Admission.IdOperacion);
}
}
Varias integraciones (varios clientes):
builder.Services.AddEcuafactClient("integracionA", o =>
{
o.BaseAddress = new Uri(configuration["EcuafactA:BaseUrl"]!);
o.ApiKey = configuration["EcuafactA:ApiKey"]!;
});
builder.Services.AddEcuafactClient("integracionB", o =>
{
o.BaseAddress = new Uri(configuration["EcuafactB:BaseUrl"]!);
o.ApiKey = configuration["EcuafactB:ApiKey"]!;
});
public sealed class Multi(IEcuafactClientProvider provider)
{
public Task Emitir(CancellationToken ct)
=> provider.GetClient("integracionA").EmitirAsync(comprobante, ct: ct);
}
El cliente por defecto tambien queda inyectable como IEcuafactClient.
Idempotencia#
Idempotency-Key es opcional. Si no se envia, el SDK la genera, la usa en todos
los reintentos y la devuelve en EmisionResultado.IdempotencyKey; si la llamada
falla, viaja en EcuafactApiException.IdempotencyKey.
Al reintentar a nivel de aplicacion reutiliza la clave devuelta: generar otra
puede duplicar la emision. Los fallos transitorios (timeout, 408/425/429/5xx) se
reintentan con la misma clave respetando Retry-After; el resto de los 4xx no.
La espera se ajusta con RespectRetryAfter y MaxRetryDelay.
Consultas SRI#
Consultas al SRI (contribuyentes, establecimientos, identificaciones y claves de acceso). Son de solo lectura, no consumen cupo y requieren la misma API Key.
ContribuyenteConsulta contribuyente = await client.ConsultarContribuyenteAsync("1760013210001");
IReadOnlyList<BusquedaContribuyente> encontrados =
await client.BuscarContribuyentesAsync("PEREZ LOPEZ", "JUAN", "PersonaNatural", 10);
EstablecimientosContribuyente establecimientos =
await client.ListarEstablecimientosAsync("1760013210001", "SoloActivos");
ValidacionIdentificacion validacion = await client.ValidarIdentificacionAsync("1760013210001");
ClaveAccesoDecodificada decodificada = await client.DecodificarClaveAccesoAsync(claveAcceso);
Webhook saliente#
using Ecuafact.Sdk;
bool valido = WebhookSignature.Verify(secreto, cabecera, cuerpoCrudo, DateTimeOffset.UtcNow, TimeSpan.FromMinutes(5));
Errores#
Los errores del API se exponen como EcuafactApiException (Codigo, Mensaje,
EstadoHttp, IdSeguimiento, Errores). Errores es una lista de strings y
solo trae mensajes en errores de validacion. Los errores locales de configuracion
o transporte son EcuafactSdkException.
En emisiones exitosas, EmisionResultado.CorrelationId conserva el
X-Correlation-Id de la respuesta; guardalo al reportar un incidente.
Siguientes pasos#
- Vision general de los SDK: compara lenguajes y metodos.
- Autenticacion: obten y usa tu API Key.
- Emision: emite tu primer comprobante.
- Verificacion de firma: valida los webhooks entrantes.