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

# SDK C# e .NET para KYC, AML e transações

> Guia rápido do SDK oficial da Didit para C# e .NET: chamadas assíncronas tipadas às APIs, injeção de dependência, verificação de webhooks e tokens.

A biblioteca oficial da Didit para C# e .NET. Compatível com o .NET 8 e o .NET Standard 2.0, e todo método da API é `async`. No .NET Framework, use C# 11 ou posterior. Consulte a [visão geral dos SDKs de servidor](https://docs.didit.me/pt-br/integration/server-sdks/overview.md) para ver o que todos os SDKs têm em comum.

## Instalação

```bash theme={null}
dotnet add package Didit
```

Para a injeção de dependência do ASP.NET Core, adicione também `Didit.Extensions.DependencyInjection` e registre o cliente com `services.AddDidit()`.

Os pacotes são [`Didit`](https://www.nuget.org/packages/Didit) e [`Didit.Extensions.DependencyInjection`](https://www.nuget.org/packages/Didit.Extensions.DependencyInjection) no NuGet. O código-fonte e o changelog estão em [didit-protocol/sdk-dotnet](https://github.com/didit-protocol/sdk-dotnet) no GitHub.

## Configurar o cliente

`new DiditClient()` lê `DIDIT_API_KEY` do ambiente. Passe `DiditClientOptions` para substituí-la ou para definir os IDs de organização e de aplicação de que as chamadas com escopo de aplicação (casos, redes, relatórios regulatórios) precisam. Crie um único cliente e reutilize-o.

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient(new DiditClientOptions
{
    ApiKey = Environment.GetEnvironmentVariable("DIDIT_API_KEY"),
    OrganizationId = Environment.GetEnvironmentVariable("DIDIT_ORGANIZATION_ID"),
    ApplicationId = Environment.GetEnvironmentVariable("DIDIT_APPLICATION_ID"),
    Timeout = TimeSpan.FromSeconds(30),
    MaxRetries = 2,
});

// Options for a single call.
var decision = await client.Sessions.RetrieveDecisionAsync(
    "11111111-2222-3333-4444-555555555555",
    requestOptions: new RequestOptions { Timeout = TimeSpan.FromSeconds(5), MaxRetries = 0 });
Console.WriteLine(decision.Status);
```

As propriedades obrigatórias da requisição são marcadas como `required`, então a ausência de uma delas impede a compilação. As opcionais que você não definir não são enviadas.

## Criar uma sessão

Crie uma [sessão de verificação](https://docs.didit.me/pt-br/sessions-api/create-session.md) para um workflow e envie seu usuário para a URL dela.

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient();

var session = await client.Sessions.CreateAsync(new SessionsCreateParams
{
    WorkflowId = "11111111-2222-3333-4444-555555555555",
    VendorData = "user-123",
    Callback = "https://example.com/verification/done",
});
Console.WriteLine(session.Url);
```

## Ler a decisão

Quando o usuário terminar (ou quando o webhook chegar), [leia a decisão](https://docs.didit.me/pt-br/sessions-api/retrieve-session.md). O resultado de cada recurso é uma lista com uma entrada por nó do fluxo.

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient();

var decision = await client.Sessions.RetrieveDecisionAsync("11111111-2222-3333-4444-555555555555");
Console.WriteLine(decision.Status);
foreach (var verification in decision.IdVerifications ?? Array.Empty<SessionDecisionIdVerifications>())
{
    Console.WriteLine(verification.Status);
}
```

## Verificar um webhook

Passe o corpo bruto, exatamente como foi recebido, e uma forma de ler os cabeçalhos da requisição. `DiditWebhooks.Verify` lança `WebhookVerificationException` para tudo o que não for uma entrega válida e recente e, caso contrário, retorna um evento tipado.

```csharp theme={null}
using System;
using Didit;

var secret = Environment.GetEnvironmentVariable("DIDIT_WEBHOOK_SECRET") ?? "";

int HandleWebhook(string rawBody, Func<string, string?> header)
{
    try
    {
        var evt = DiditWebhooks.Verify(rawBody, header, secret);
        if (evt is SessionStatusUpdatedEvent updated)
        {
            Console.WriteLine($"{updated.SessionId} {updated.Status}");
        }
        return 200;
    }
    catch (WebhookVerificationException error)
    {
        Console.WriteLine($"rejected: {error.Reason}");
        return 400;
    }
}
```

Em uma API mínima do ASP.NET Core, leia o corpo com um `StreamReader` e passe `name => request.Headers[name].FirstOrDefault()`. Enquanto você faz a rotação do segredo, passe os dois: `new[] { newSecret, oldSecret }`. Consulte [Webhooks](https://docs.didit.me/pt-br/integration/webhooks.md) para ver os eventos e o esquema de assinatura.

## Analisar uma transação

Envie um pagamento, um saque ou uma transferência de criptoativos para o [monitoramento de transações](https://docs.didit.me/pt-br/transaction-monitoring/overview.md); a resposta traz o status e a pontuação de risco.

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient();

var transaction = await client.Transactions.CreateAsync(new TransactionsCreateParams
{
    TransactionId = "txn-1001",
    TransactionCategory = "finance",
    TransactionDetails = new()
    {
        Direction = "outbound",
        Amount = 1500,
        Currency = "EUR",
    },
    Subject = new()
    {
        EntityType = "individual",
        VendorData = "user-123",
        FullName = "Maria Garcia",
    },
});
Console.WriteLine($"{transaction.Status} {transaction.Score}");
```

## Verificar tokens de Authentication

`Authentication` verifica no seu backend os tokens de acesso que o seu emissor de [Authentication](https://docs.didit.me/pt-br/authentication/overview.md) assina, sem chamar a Didit a cada requisição. Ele também troca códigos, renova tokens, verifica e revoga sessões e executa step-ups.

> [!NOTE]
>
> A verificação de tokens faz as checagens descritas em [Verificar um token no seu servidor](https://docs.didit.me/pt-br/authentication/tokens-and-jwks.md#verificar-um-token-no-seu-servidor), com base no emissor e nas chaves de assinatura da sua aplicação.

```csharp theme={null}
using System;
using System.Threading.Tasks;
using Didit;

// The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
var auth = Authentication.FromPublishableKey("pk_live_...");

async Task<string?> CurrentUserAsync(string accessToken)
{
    try
    {
        var claims = await auth.VerifyAccessTokenAsync(accessToken, audience: "your-application-id");
        return claims.Subject;
    }
    catch (TokenVerificationException error)
    {
        Console.WriteLine($"rejected: {error.Reason}");
        return null;
    }
}
```

## Erros

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient();

try
{
    await client.Sessions.RetrieveDecisionAsync("11111111-2222-3333-4444-555555555555");
}
catch (NotFoundException)
{
    Console.WriteLine("no such session");
}
catch (ApiStatusException error)
{
    Console.WriteLine($"{error.StatusCode} {error.RequestId}");
}
```

## Listas e arquivos

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient();

// Lists page through every result.
await foreach (var session in await client.Sessions.ListAsync(new SessionsListParams { Status = "Approved" }))
{
    Console.WriteLine(session.SessionId);
}

// Uploads take FileUpload.FromPath, FromBytes or FromStream.
var result = await client.IdVerification.VerifyAsync(new IdVerificationVerifyParams
{
    FrontImage = FileUpload.FromPath("id-front.jpg"),
    BackImage = FileUpload.FromPath("id-back.jpg"),
});
Console.WriteLine(result.IdVerification?.Status);
```

As páginas dos endpoints do servidor da [referência da API](https://docs.didit.me/pt-br/api-reference/overview.md) têm um exemplo em .NET para a respectiva operação, exceto os endpoints e campos que ainda não estão presentes em nenhuma versão 1.0.1, listados na [visão geral](https://docs.didit.me/pt-br/integration/server-sdks/overview.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.