# Explain a decision

Source: https://immiscible.fly.dev/docs/api/get-v1-actions-id-explain

`GET /v1/actions/:id/explain`

The decision on one of this agent's actions in plain English: what was asked, the rule it was judged under, each reason and risk signal with its label, and what the agent should do next. Read only and safe to call at any time: unlike polling, it never hands over released data, and it never carries the receipt. The MCP tool `explain_decision` returns the same.

## Authentication

Agent key. An agent-scoped key (`ask_...`) bound to exactly one agent, or an OAuth access token (`aat_...`) issued to an MCP client for that agent, sent as `Authorization: Bearer`. An agent key may ask, poll and settle. It can never approve, widen a mandate or lift a freeze.

## Path parameters

- `id` (string, required): Action id

## Request

curl:

```bash
curl "https://immiscible.fly.dev/v1/actions/act_7Qm2c1f0/explain" \
  -H "authorization: Bearer $IMMISCIBLE_AGENT_KEY"
```

Node:

```ts
const res = await fetch('https://immiscible.fly.dev/v1/actions/act_7Qm2c1f0/explain', {
  headers: {
    authorization: `Bearer ${process.env.IMMISCIBLE_AGENT_KEY}`,
  },
});
const data = await res.json();
console.log(res.status, data);
```

Python:

```python
import os
import requests

res = requests.get(
    "https://immiscible.fly.dev/v1/actions/act_7Qm2c1f0/explain",
    headers={
        "authorization": f"Bearer {os.environ['IMMISCIBLE_AGENT_KEY']}",
    },
)
print(res.status_code, res.json())
```

## Response

```json
{
  "id": "act_Vd1x0a9e",
  "headline": "Your request \"Buy this week's groceries from Ocado\" for £95.00 to ocado.com is waiting for a person to decide.",
  "why": ["£95.00 is above the £80.00 that Weekly groceries lets the agent spend without asking."],
  "signals": [{ "id": "approve_above", "label": "Above what it may spend without asking", "effect": "approval", "detail": "£95.00 is above the £80.00 that Weekly groceries lets the agent spend without asking." }],
  "next": "Do not act yet. Tell the person you act for that a person has been asked, then poll check_action_status (or GET /v1/actions/:id) every five seconds for a minute and every thirty after. ...",
  "text": "Your request ... is waiting for a person to decide.\nIt was judged under the rule \"Weekly groceries\" (payment, active).\n...",
  "decision": { "id": "act_Vd1x0a9e", "decision": "approval_required", "status": "pending_approval", "reasons": ["..."], "mandateId": "mdt_91c3e0b2", "risk": { "score": 20, "signals": ["..."] } }
}
```
