# Erstattung simulieren

> Überführen Sie eine Sandbox-Rechnungserstattung in completed, failed oder cancelled und lösen Sie den signierten Webhook aus.

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

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

**API-Schlüssel:** `Payment` (Sandbox)

Nur in der Sandbox. Überführt eine bestehende Sandbox-Erstattung (`is_test: true`) in den angeforderten Endstatus (`completed`, `failed` oder `cancelled`), aktualisiert das Sandbox-Guthaben und sendet den entsprechenden Webhook `withdrawal.completed`, `withdrawal.failed` oder `withdrawal.cancelled` mit der vollständigen Erstattungs-Payload.

## Anfragekörper

| Parameter | Typ | Erforderlich | Beschreibung |
|-----------|-----|--------------|--------------|
| `status` | string | Ja | Gewünschter Endstatus: `"completed"`, `"failed"` oder `"cancelled"` |

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

## Antwort (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"
}
```

## Regeln

:::dash-list
- Erstellen Sie die Sandbox-Erstattung zuerst über [`POST /v1/refunds`](/de/docs/refunds/create.md) mit einem Sandbox-Payment-Schlüssel (`pk_test_`) und übergeben Sie anschließend deren `withdrawal_id` an diesen Endpunkt.
- Ein erneuter Aufruf von `simulate` für eine Erstattung, die sich bereits im angeforderten Endstatus befindet, ist idempotent und gibt `200 OK` zurück, ohne einen doppelten Webhook zu senden.
- Ein Aufruf mit einem abweichenden Endstatus nach bereits erreichtem Endzustand liefert `409 invalid_withdrawal_state`.
- Die Simulation von `"completed"` schließt die Belastung des reservierten Guthabens ab und vergibt einen synthetischen `tx_hash`. Die Simulation von `"failed"` oder `"cancelled"` gibt `amount + fee` wieder für Ihr Sandbox-Guthaben frei, sodass Sie eine neue Erstattung für die Rechnung anlegen können.
:::

## Fehler

| Code | HTTP | Wann |
|------|------|------|
| `payment_key_required` | 403 | Die Anfrage wurde mit einem Payout-Schlüssel (`rk_`) signiert |
| `refunds_not_enabled` | 503 | Rechnungserstattungen sind in dieser Umgebung deaktiviert |
| `withdrawal_not_found` | 404 | Die ID existiert nicht, ist keine Sandbox-Erstattung oder liegt außerhalb des Projektbereichs des Schlüssels |
| `invalid_withdrawal_state` | 409 | Die Erstattung befindet sich bereits in einem anderen Endstatus |
| `field_invalid_enum` | 400 | `status` ist nicht `"completed"`, `"failed"` oder `"cancelled"` |

Siehe [Testen](/de/docs/testing.md) für den gesamten Sandbox-Ablauf und [Fehlercodes](/de/docs/errors/codes.md) für den vollständigen Katalog.
