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

# RESOURCE_TERMINAL error

> A sandbox simulate endpoint was called against an entity that has already reached a terminal state

## What happened

You called a `simulate/*` endpoint against an entity (a payout, transaction, order, or deposit) that has already reached a terminal state. This returns HTTP 409 with error code `RESOURCE_TERMINAL`.

The first simulate call wins. Once an entity is terminal (succeeded, failed, or cancelled), no further simulation is possible on that entity.

```json theme={null}
{
  "type": "RESOURCE_TERMINAL",
  "title": "Resource Terminal",
  "status": 409,
  "detail": "The requested action can no longer be applied.",
  "resolution": "Re-fetch the entity to inspect its terminal state. No further simulation is needed.",
  "docs": "/errors#resource-terminal",
  "instance": "/v2/sandbox/payouts/txn_abc123/simulate/cosign",
  "correlationId": "corr_xyz789",
  "timestamp": "2026-01-15T09:30:00.000Z"
}
```

## Common causes

* **Replay of a successful simulate call** -- the simulate call succeeded earlier and you called it again (e.g., a retry loop that did not check the prior response)
* **Race between simulate and autopilot** -- in sandbox, the chain-confirm autopilot runs automatically after a cosign approval; if autopilot completes before your next simulate call, the entity is already terminal
* **Simulate called on an already-terminal entity** -- the entity reached a terminal state through a different path (e.g., a `simulate/terminal` call or an earlier auto-terminate)

## Recovery

**1. Re-fetch the entity to see its terminal state**

```bash theme={null}
curl -X GET https://api.sandbox.conduit.financial/v2/payouts/txn_abc123 \
  -H "x-api-key: YOUR_API_KEY"
```

For orders:

```bash theme={null}
curl -X GET https://api.sandbox.conduit.financial/v2/orders/ord_abc123 \
  -H "x-api-key: YOUR_API_KEY"
```

**2. Verify the terminal state is what you expected**

If the entity is already in the state your simulate call was trying to produce, no further action is needed. The 409 is confirmation that the entity is terminal.

**3. If the terminal state is unexpected, investigate**

Check the entity's `failureCode` (for failed states) or `status` to understand how it reached the terminal state. If a prior simulate call or autopilot drove it to an unexpected state, that is the root cause to address.

## Prevention

* **Check the response from each simulate call** -- treat a 200 response as authoritative; if the entity is already terminal, the response body will show the terminal state
* **Do not retry simulate calls in a loop** -- simulate calls are idempotent at the semantic level: once the entity is terminal, the first call's outcome stands
* **Account for sandbox autopilot** -- after approving a cosign, the sandbox chain-confirm autopilot runs automatically; do not issue a follow-up `simulate/confirm` call unless you disabled autopilot

## Related endpoints

* [GET /v2/payouts/:id](/api-reference/payouts/retrieve-a-payout) -- read payout state
* [GET /v2/transactions/:id](/api-reference/transactions/get-a-transaction-by-id) -- read transaction state
* [GET /v2/orders/:id](/api-reference/orders/retrieve-an-order-by-id) -- read order state
* [POST /v2/sandbox/transactions/:id/simulate/terminal](/sandbox/cheat-sheet) -- force a transaction terminal (will return RESOURCE\_TERMINAL if already done)
