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

# POST /v1/authorize

> The decision. Nine gates in a fixed order, one of six outcomes, recorded either way.

```http theme={"system"}
POST /v1/authorize
authorization: Bearer rsk_...
content-type: application/json
```

## Request

```json theme={"system"}
{
  "grant_id": "grt_01KZXYD62VG0",
  "action": {
    "scope": { "tool": ["payments.settle"] },
    "stakes_minor": 25000
  },
  "amount_minor": 25000,
  "currency": "EUR",
  "trajectory_id": "trj_01KZZWKNEPCJ",
  "incumbent_decision": "approved"
}
```

| Field                 | Notes                                                           |
| --------------------- | --------------------------------------------------------------- |
| `grant_id`            | The authority being drawn on.                                   |
| `action.scope`        | What is being attempted, matched against the grant at gate 4.   |
| `action.stakes_minor` | Consequence size where it differs from the amount moved.        |
| `amount_minor`        | Integer, minor units. Debited at gate 8, last.                  |
| `currency`            | Three-letter code.                                              |
| `trajectory_id`       | Ties this decision to the recorded work.                        |
| `incumbent_decision`  | What your existing system decided. Only meaningful in `shadow`. |

## Response

```json theme={"system"}
{
  "outcome": "exhausted",
  "allowed": false,
  "reason": "the call allowance on this grant is spent; retrying cannot help",
  "grant_id": "grt_01KZXYD62VG0",
  "ledger_id": "led_01KZZWKM4G8B",
  "remaining_amount_minor": 1500000,
  "remaining_count": 0,
  "policy_outcome": "allow",
  "enforcement_mode": "enforce",
  "findings": []
}
```

<Note>
  A refusal is `200`, not `4xx`. The decision succeeded; the answer was no.
  Treating it as an HTTP error would make a working control look like an outage
  in every dashboard you own.
</Note>

## The gates, in order

Evaluated in sequence, short-circuiting at the first refusal. Gates after that
point are recorded as **not reached** rather than left blank.

`authority` · `status` · `window` · `scope` · `clean_context` · `bounds` ·
`policy` · `budget` · `review`

Budget is debited last, after every structural check has passed, so an action
refused earlier does not consume an allowance it never used. See
[The nine gates](/concepts/the-nine-gates).

## Settling later

Where the final amount is not known at authorisation time, authorise against an
estimate and settle the real figure afterwards:

```http theme={"system"}
POST /v1/decisions/{ledger_id}/settle
```

The difference returns to the ceiling. Without this, an agent that reserves
generously starves itself.
