# Симулировать возврат

> Переведите тестовый возврат по инвойсу в статус completed, failed или cancelled и получите подписанный вебхук.

`POST /v1/sandbox/refunds/:withdrawal_id/simulate`

:::endpoint
POST /v1/sandbox/refunds/:withdrawal_id/simulate
:::

**API-ключ:** `Payment` (тестовый режим)

Только для песочницы. Переводит существующий тестовый возврат (`is_test: true`) в указанный финальный статус (`completed`, `failed` или `cancelled`), обновляет тестовый баланс и отправляет соответствующий вебхук `withdrawal.completed`, `withdrawal.failed` или `withdrawal.cancelled` с полным контрактом возврата.

## Тело запроса

| Параметр | Тип | Обязателен | Описание |
|----------|-----|------------|----------|
| `status` | string | Да | Целевой финальный статус: `"completed"`, `"failed"` или `"cancelled"` |

```json
{
  "status": "completed"
}
```

## Ответ (200 OK)

```json
{
  "withdrawal_id": "wdr_6Qm2fK8xR4vN7cT1bY9dL5",
  "invoice_id": "inv_7K2M9P4Q8R1X5Z3A0bC2dE",
  "mode": "full",
  "external_order_id": "refund-1042-full",
  "status": "completed",
  "is_final": true,
  "is_test": false,
  "amount": "100.00",
  "fee": "1.00",
  "currency": "USDT",
  "network": "TRC20",
  "destination_address": "TN3W4H6rK2ce4vX9YnFQHwKENnHjoxb3m9",
  "first_sender": "TN3W4H6rK2ce4vX9YnFQHwKENnHjoxb3m9",
  "tx_hash": "9f3b8c2a1d0e4f6789abc123def4567890abc123def4567890abc123def45678",
  "explorer_url": "https://tronscan.org/#/transaction/9f3b8c2a1d0e4f6789abc123def4567890abc123def4567890abc123def45678",
  "created_at": 1767225600,
  "completed_at": 1767225932,
  "type": "refund",
  "project_id": "prj_3F9xL2mN8pQ4rT6vW1yZ5b"
}
```

## Правила

:::dash-list
- Сначала создайте тестовый возврат через [`POST /v1/refunds`](/ru/docs/refunds/create.md) с помощью тестового ключа `Payment` (`pk_test_`), а затем передайте его `withdrawal_id` в этот метод.
- Повторный вызов `simulate` для возврата, который уже находится в запрошенном финальном статусе, идемпотентен и возвращает `200 OK` без повторной отправки вебхука.
- Вызов `simulate` с другим финальным статусом после завершения возврата возвращает `409 invalid_withdrawal_state`.
- Симуляция `"completed"` фиксирует списание зарезервированных средств и присваивает синтетический `tx_hash`. Симуляция `"failed"` или `"cancelled"` разблокирует `amount + fee` обратно на тестовый баланс, позволяя создать новый возврат по инвойсу.
:::

## Ошибки

| Код | HTTP | Когда возникает |
|-----|------|-----------------|
| `payment_key_required` | 403 | Запрос подписан ключом `Payout` (`rk_`) |
| `refunds_not_enabled` | 503 | Возвраты по инвойсам отключены в данном окружении |
| `withdrawal_not_found` | 404 | Идентификатор не существует, не относится к тестовому возврату или не входит в область видимости ключа |
| `invalid_withdrawal_state` | 409 | Возврат уже находится в другом финальном статусе |
| `field_invalid_enum` | 400 | Поле `status` не равно `"completed"`, `"failed"` или `"cancelled"` |

Полное описание работы в тестовой среде приведено в разделе [Тестирование](/ru/docs/testing.md), а список всех кодов — в [Кодах ошибок](/ru/docs/errors/codes.md).
