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

# Decisiones de transacción

> Los 5 valores de decision.type y qué hacer con cada uno

`decision.type` es el campo que le dice al comercio qué hacer con la transacción. Es el
único campo accionable de la respuesta — nunca actúes sobre el score, actúa sobre esto.

Tiene exactamente 5 valores posibles:

| `type`                | Qué significa                   | Qué debe hacer el comercio                                      | Estado resultante (`transaction_state`) |
| --------------------- | ------------------------------- | --------------------------------------------------------------- | --------------------------------------- |
| `APPROVE`             | Sin riesgo accionable           | Procesar normal                                                 | `ANALYZED`                              |
| `CONDITIONAL_APPROVE` | Procesar con seguimiento        | Procesar y registrar para revisión posterior                    | `ANALYZED`                              |
| `STEP_UP_AUTH`        | Requiere verificación adicional | Resolver lo que venga en `conditions` (hoy: `OTP_VERIFICATION`) | `HELD`                                  |
| `HOLD`                | Retener para revisión manual    | No despachar; encolar a revisión                                | `HELD`                                  |
| `BLOCK`               | Rechazar                        | No procesar                                                     | `BLOCKED`                               |

<Note>
  `STEP_UP_AUTH` y `HOLD` desembocan en el mismo `transaction_state` (`HELD`) — no se
  distinguen por el estado. Si necesitas saber cuál de las dos decisiones produjo un estado
  `HELD`, tienes que leer `decision.type`, no `transaction_state`. Ver
  [Ciclo de vida de la transacción](/conceptos/ciclo-de-vida) para el detalle de esta
  ambigüedad.
</Note>

## `conditions`

Lista de condiciones pendientes cuando `decision.type` es `STEP_UP_AUTH`. Hoy el único
valor observado es `OTP_VERIFICATION`. Para el resto de decisiones, `conditions` viene
vacío (`[]`).

## `reason`

Lista de **strings** que explican la decisión. Cada entrada es un código público de señal de
riesgo (p. ej. `AUTH_3DS_FAILED`), o una de estas dos formas cuando la decisión la elevó
algo tuyo:

| Forma                         | Qué significa                                               |
| ----------------------------- | ----------------------------------------------------------- |
| `custom_rule:<id>`            | Una regla propia del comercio elevó la decisión             |
| `entity_block:<kind>:<value>` | Una entrada de tu lista de entidades bloqueó la transacción |

El detalle de `flags` está en [Formato de respuesta](/referencia/respuesta). El catálogo
de `code` vive en [Flags](/referencia/flags). No confundas esas razones de riesgo con los
[códigos de error](/referencia/codigos-de-error) de la API.

## `confidence`

Número de 0 a 1 que indica qué tan cerca de un límite entre bandas quedó la decisión basada
en score. Sirve para detectar casos limítrofes, **no** como medida de certeza de la decisión
final — ver [Score de riesgo](/conceptos/score-y-decision).

Siguiente paso: [Razones de la decisión](/conceptos/razones).
