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

# Read a Decision

> Read one recorded Decision whole: the application it was decided on, the rules that ran, and what it decided.

This call answers one recorded Decision exactly as it was recorded: the application the Platform read, every rule of the policy version evaluated, the score, the band, and the outcome with its terms.

A Decision reads back the same whatever your adoption has since become, and it stays readable for as long as your Tenancy exists.

<Info>
  The trace is self-contained. Every knockout carries its own identifier, its text, the bound it applied and the value it saw, so a refusal explains itself years later without the policy version being fetched beside it.
</Info>

## Path parameters

<ParamField path="tenant_id" type="string" required>
  The Tenancy whose Decision is read. Another Tenancy's path answers `403`.
</ParamField>

<ParamField path="decision_id" type="string" required>
  The Decision's identifier, as the deciding call answered it.
</ParamField>

## Response

The body is the one the deciding call answers, field for field. See [Decide an application](/api-reference/credit-decisions/decide) for every field.

## Explaining a refusal

Everything an explanation needs is in the Decision. Read the trace and take the knockouts whose `fired` is `true`; each carries the words of the rule, the bound it applied and the value it saw.

| Field | What it gives the explanation |
| - | - |
| `trace.knockouts[].text` | What the rule does, in words, as it read at the moment of deciding |
| `trace.knockouts[].bound` | The threshold applied |
| `trace.knockouts[].observed` | The value the rule saw, with its state |
| `trace.scorecard[].points` | What each attribute contributed to the score |
| `band` | The cutoff band the score fell in, absent when a knockout settled it first |
| `policy_version` and `policy_digest` | Which content decided it, and a checkable fact about that content |

A refusal with no fired knockout is one the score produced: the band is named, and the scorecard entries say where the points went.

## Refusals

This route reads no query parameter and takes no body.

| Status | When |
| - | - |
| `400` | The URL carries a query parameter, which this route does not read |
| `403` | The key authenticates for another Tenancy |
| `404` | No such Decision, or it belongs to another Tenancy |

A Decision recorded by another Tenancy and one that never existed are the same `404`, which is what keeps the two indistinguishable from outside. A read-scoped key is enough.

<RequestExample>
  ```bash Read theme={null}
  curl https://api.capcells.com/v1/tenants/capyplazo/credit-decisions/a0deb1fc-b160-4088-92eb-c1e8b7b58001 \
    -H "Authorization: $(capcells_sign "$CAPCELLS_API_KEY" GET /v1/tenants/capyplazo/credit-decisions/a0deb1fc-b160-4088-92eb-c1e8b7b58001)"
  ```
</RequestExample>

<ResponseExample>
  ```json 200 A refusal, abridged theme={null}
  {
    "id": "0dcc320f-709a-4770-a50f-5e922f9255f2",
    "reference": "app-knock",
    "client_id": "client-alonso",
    "policy": "mx-base",
    "policy_version": 1,
    "policy_digest": "498e17408e74013e84c500e261fa7bc3f22a51a721c7c1540e1b5b755ad85cab",
    "configuration_id": "49edf7ee-80d9-4500-b480-89977cfb48d3",
    "configuration_version": 1,
    "principal": { "minor_units": 1000000, "currency": "MXN" },
    "submitted_on": "2026-08-24",
    "score": 99,
    "outcome": "refuse",
    "trace": {
      "knockouts": [
        {
          "id": "capcells:mx.history.prior-default",
          "text": "The client has already failed to repay a loan issued by this lender. The plainest evidence there is that the decision would not hold.",
          "attribute": "prior_loans_defaulted",
          "comparison": "at_least",
          "bound": 1,
          "observed": { "state": "present", "number": 1, "as_of": "2026-08-24" },
          "fired": true,
          "outcome": "refuse"
        }
      ]
    },
    "sources": [],
    "binding": true,
    "self_confirmed_version": false,
    "bound_from": "2026-08-24",
    "decided_at": "2026-08-24T21:29:03.283717Z"
  }
  ```

  ```json 404 No such Decision theme={null}
  {
    "error": "risk: no such decision: 00000000-0000-0000-0000-000000000000",
    "code": "not_found"
  }
  ```
</ResponseExample>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.