> 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/python/guides/payouts.md).

# Send a payout

Send single crypto payouts in Python — 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:

```python
from cryptochief import Chain, EstimatePayoutRequest

est = await client.payouts.estimate(EstimatePayoutRequest(
    network=Chain.ETH_MAINNET,
    coin="USDT",
    amount="25.0",
    to_address="0xRecipient...",
))
# est.amount_to_receive, est.fee_info.estimated_fiat, est.sources
```

## Execute

```python
from cryptochief import ExecutePayoutRequest

payout = await client.payouts.execute(ExecutePayoutRequest(
    order_id="order-42",   # idempotency key — safe to retry
    user_id="u-7",
    network=Chain.ETH_MAINNET,
    coin="USDT",
    amount="25.0",
    to_address="0xRecipient...",
    url_callback="https://your.app/webhooks/payout",
))
```

{% hint style="info" %}
`order_id` 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 %}

{% hint style="warning" %}
**On TRON, the fee fields are not the whole cost.** A TRC-20 payout consumes energy, and unless the project set `gas_source` to `native` the platform supplies that energy and bills it to your **API credits** — in every fee mode, after the transfer is on chain. `fee_info.estimated_fiat`, and the paid figure the API reports beside it, cover on-chain gas only, so reconcile the rental from your credits ledger rather than expecting it in the payout. See [Auto-sweep settings](/processing/python/guides/auto-sweep-settings.md#who-supplies-tron-energy).
{% endhint %}

## Wait for confirmation

```python
final = await client.payouts.wait_for(payout.uuid, interval=5, timeout=5 * 60)
if final.status == "paid":
    print("paid: tx =", final.txid)
```

Or react to the `payout.*` [webhook](/processing/python/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

```python
from cryptochief import APIError, ErrorCode, is_api_error

try:
    await client.payouts.execute(req)
except APIError as err:
    if is_api_error(err, ErrorCode.INSUFFICIENT_FUNDS):
        ...  # top up and retry
    elif err.code in (ErrorCode.ASSET_NOT_ENABLED, ErrorCode.DEBT_LIMIT_EXCEEDED):
        ...
    else:
        raise
```

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

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