> For the complete documentation index, see [llms.txt](https://docs-sdk.crypto-chief.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs-sdk.crypto-chief.com/processing/dotnet/guides/payouts.md).

# Send a payout

Send single crypto payouts in .NET / C# — estimate, execute idempotently, and wait for confirmation.

A payout sends crypto from your project balance to any address. The flow is **estimate** (optional) → **execute** → **wait for confirmation** (optional).

## Estimate

Preview the network fee and the net amount the recipient receives before sending:

```csharp
using CryptoChief.Processing.Chains;
using CryptoChief.Processing.Models;

var est = await client.Payouts.EstimateAsync(new EstimatePayoutRequest
{
    Network   = Chain.EthMainnet,
    Coin      = "USDT",
    Amount    = "25.0",
    ToAddress = "0xRecipient...",
});
// est.AmountToReceive, est.FeeInfo?.EstimatedFiat, est.Sources
```

{% hint style="info" %}
**On TRON the fee figures are not the whole cost.** Where the platform rents energy for the transfer instead of burning TRX, that energy is billed to your **API credits** after the fact and appears in neither `FeeInfo.EstimatedFiat` here nor the fees the finished payout reports. Budget for it separately — see [Credits balance](/processing/dotnet/guides/credits-balance.md). Whether the platform rents that energy or the wallet burns its own TRX is the `gas_source` policy, and renting is the default: [Auto-sweep settings](/processing/dotnet/guides/auto-sweep-settings.md#tron-what-the-transfer-is-paid-with).
{% endhint %}

## Execute

```csharp
var payout = await client.Payouts.ExecuteAsync(new ExecutePayoutRequest
{
    OrderId     = "order-42",   // idempotency key — safe to retry
    UserId      = "u-7",
    Network     = Chain.EthMainnet,
    Coin        = "USDT",
    Amount      = "25.0",
    ToAddress   = "0xRecipient...",
    UrlCallback = "https://your.app/webhooks/payout",
});
```

{% hint style="info" %}
`OrderId` is an **idempotency key**: re-submitting the same `order_id` returns the same payout instead of creating a second one. That is what makes the SDK's automatic retries safe.
{% endhint %}

## Wait for confirmation

```csharp
using CryptoChief.Processing.Polling;

var final = await client.WaitForPayoutAsync(payout.Uuid, new PollOptions
{
    Interval = TimeSpan.FromSeconds(5),
    Timeout  = TimeSpan.FromMinutes(5),
});
if (final.Succeeded)
{
    Console.WriteLine($"paid: tx={final.TxId}");
}
```

Or react to the `payout.*` [webhook](/processing/dotnet/guides/webhooks.md) instead of polling.

## Pay out in a different asset (swap)

{% hint style="warning" %}
**Not available yet.** The payout request carries an `auto_convert` field and this SDK exposes it, but the platform refuses any payout that sets it, answering `AUTO_CONVERT_NOT_IMPLEMENTED`. `auto_convert_policy` is reserved alongside it. Convert the asset yourself and pay out what the master wallet already holds.
{% endhint %}

## Handle errors

```csharp
using CryptoChief.Processing.Errors;

try
{
    await client.Payouts.ExecuteAsync(req);
}
catch (CryptoChiefApiException ex)
{
    switch (ex.Code)
    {
        case ErrorCodes.InsufficientFunds:    /* top up and retry */ break;
        case ErrorCodes.AssetNotEnabled:      /* coin/network not enabled */ break;
        case ErrorCodes.DebtLimitExceeded:    /* postpaid cap hit */ break;
        case ErrorCodes.FromWalletNotOwned:   break;
        case ErrorCodes.AlreadyExecuted:      break;
    }
}
```

See [Errors & retries](/processing/dotnet/concepts/errors.md).

{% content-ref url="/pages/8TJeW1ILxOwYkB5744MH" %}
[Mass payouts](/processing/dotnet/guides/mass-payouts.md)
{% endcontent-ref %}
