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

# Solicitudes de información (RFI)

> Lee las solicitudes de documentación que Fluz envía a tus clientes y respóndelas desde tu propia interfaz: preguntas, carga de archivos, vinculación de bancos y envío para revisión.

## Resumen

Una **solicitud de información (RFI)** es un conjunto de preguntas que Fluz envía a un cliente cuando el equipo de cumplimiento necesita más información de su parte, con mayor frecuencia durante la revisión KYB (documentos de constitución, comprobante de domicilio, organigrama de propiedad) y, en ocasiones, más adelante durante la vida de una cuenta.

La API de RFI permite que tu plataforma muestre esas solicitudes y recopile las respuestas en tu propia interfaz, en lugar de enviar al cliente a Fluz. En cuatro operaciones puedes:

1. Listar las RFI abiertas del cliente con [openRfis](https://docs.fluz.app/get-rfis), o leer una con [rfi](https://docs.fluz.app/get-rfis),
2. Cargar los documentos que piden las preguntas con el endpoint de [carga de documentos de RFI](https://docs.fluz.app/upload-rfi-document),
3. Responder preguntas de vinculación bancaria y de domicilio con Plaid, si lo deseas, usando [completeRfiPlaidLink](https://docs.fluz.app/complete-rfi-plaid-link), y
4. Enviar las respuestas con [submitRfi](https://docs.fluz.app/submit-rfi), todas a la vez o por partes.

Una vez enviada, la RFI pasa a `IN_REVIEW` y Fluz la revisa. El resultado llega como un nuevo estado en la misma RFI.

> [!NOTE]
>
> **Las preguntas se redactan por cada RFI.** Fluz crea cada RFI para el cliente al que se envía, por lo que las preguntas, su orden y cuáles son obligatorias difieren entre RFI. Muestra lo que devuelve la API en lugar de programar un formulario fijo.

***

## Requisitos

| Requisito | Si falta |
| - | - |
| Tu aplicación tiene el scope `MANAGE_RFI` y la autorización OAuth del cliente lo incluye | `AUTH-0031` |
| Llamas con un **token de usuario Bearer**. La autenticación básica (tu clave de API) no se acepta en ninguna operación de RFI | `AUTH-0002` |
| El token incluye `userId` y `accountId` | `AUTH-0008` |
| El usuario del token es el destinatario de la RFI (consulta [Quién puede responder una RFI](#who-can-answer-an-rfi)) | `G-0003` (`ACCESS_DENIED`) |
| Solo para respuestas con Plaid: el token también incluye `MANAGE_PAYMENT` | `AUTH-0031` |

Selecciona **`MANAGE_RFI`** en los scopes de permisos de tu aplicación en el panel de Fluz. Los clientes lo aprueban en la pantalla de consentimiento durante OAuth, como cualquier otro scope. Consulta [Scopes de la aplicación](https://docs.fluz.app/fluz-dashboard/application-scopes.md).

### Quién puede responder una RFI

Una RFI está dirigida a una cuenta. El `accountId` del token debe ser esa cuenta, y el usuario del token debe ser el destinatario de la cuenta:

| La RFI está en | Destinatario |
| - | - |
| Una cuenta de consumidor | El usuario propietario de esa cuenta de consumidor |
| Una cuenta de negocio | El **solicitante** del negocio: el usuario que envió `registerBusiness` |

Otros propietarios del negocio, usuarios autorizados y subusuarios no pueden leer ni responder las RFI de un negocio a través de la API. Genera el token para el solicitante con el `accountId` del negocio.

***

## Flujo

**1. Encuentra las RFI abiertas**

Llama a [openRfis](https://docs.fluz.app/get-rfis) con el token del cliente. Devuelve cada RFI que espera sus respuestas, de la más reciente a la más antigua, con sus preguntas. Una lista vacía significa que no hay nada que hacer.

**2. Muestra las preguntas**

Muestra cada pregunta en orden según `ordinal`. Usa `questionType` para elegir el campo de entrada, `options` para las preguntas de opción y `visibilityCondition` para ocultar las preguntas que no aplican. Consulta [Tipos de pregunta](#question-types).

**3. Carga documentos**

Por cada archivo que adjunte el cliente, llama al [endpoint de carga](https://docs.fluz.app/upload-rfi-document) con el `rfiId` y el `questionId`. Conserva el `fileId` que devuelve.

**4. Vincula un banco, si se ofrece**

Las preguntas de estado de cuenta bancario y de comprobante de domicilio pueden responderse con una vinculación bancaria de Plaid en lugar de un archivo. Abre Plaid Link y luego pasa el token público a [completeRfiPlaidLink](https://docs.fluz.app/complete-rfi-plaid-link).

**5. Envía**

Llama a [submitRfi](https://docs.fluz.app/submit-rfi) con las respuestas. Con `finalize: true` (el valor predeterminado) la RFI pasa a `IN_REVIEW`. Usa `finalize: false` para guardar parte de las respuestas y continuar más tarde.

**6. Da seguimiento al resultado**

Vuelve a leer la RFI con [rfi](https://docs.fluz.app/get-rfis) para ver su estado. Si Fluz necesita más información, la misma RFI vuelve a `PENDING_DOCUMENTS` con nuevas preguntas y aparece de nuevo en `openRfis`.

```mermaid theme={null}
sequenceDiagram
    autonumber
    participant App as Your Application
    participant API as Fluz GraphQL API
    participant Files as Fluz File Upload (REST)
    participant Plaid as Plaid Link
    participant Fluz as Fluz Compliance

    Fluz->>API: RFI sent to the customer (PENDING_DOCUMENTS)
    App->>API: query openRfis
    API-->>App: RFIs with questions

    opt Question asks for documents
        App->>Files: POST /api/v1/file-upload/rfi-document
        Files-->>App: fileId
    end

    opt Customer links a bank instead
        App->>API: mutation createPlaidLinkToken
        App->>Plaid: Open Plaid Link
        Plaid-->>App: public_token
        App->>API: mutation completeRfiPlaidLink
        API-->>App: Bank linked, answer saved
    end

    App->>API: mutation submitRfi (finalize: true)
    API-->>App: status IN_REVIEW
    Fluz->>Fluz: Review
    App->>API: query rfi(rfiId)
    API-->>App: REQUIREMENTS_MET, REQUIREMENTS_NOT_MET, or PENDING_DOCUMENTS again
```

***

## Ciclo de vida del estado de la RFI

```mermaid theme={null}
stateDiagram-v2
    [*] --> PENDING_DOCUMENTS: Fluz sends the RFI
    PENDING_DOCUMENTS --> IN_REVIEW: submitRfi with finalize true
    PENDING_DOCUMENTS --> EXPIRED: Expiry date passes before submission
    IN_REVIEW --> PENDING_DOCUMENTS: Fluz asks for more
    IN_REVIEW --> REQUIREMENTS_MET: Review passed
    IN_REVIEW --> REQUIREMENTS_NOT_MET: Review did not pass
    PENDING_DOCUMENTS --> CLOSED: Closed by Fluz
    IN_REVIEW --> CLOSED: Closed by Fluz
```

| `RfiStatus` | Qué significa | Qué debe hacer tu app |
| - | - | - |
| `PENDING_DOCUMENTS` | Esperando las respuestas del cliente. Es el único estado que acepta respuestas | Mostrar las preguntas y recopilar las respuestas |
| `IN_REVIEW` | Respuestas enviadas y en revisión | Mostrar un estado de "en revisión". No hay nada que responder |
| `REQUIREMENTS_MET` | La revisión terminó y se cumplieron los requisitos | Eliminar la solicitud de tu interfaz |
| `REQUIREMENTS_NOT_MET` | La revisión terminó y no se cumplieron los requisitos | Mostrar un mensaje neutral y dirigir al cliente a soporte |
| `EXPIRED` | La fecha de vencimiento pasó antes de que se enviara la RFI | Dirigir al cliente a soporte. Una RFI vencida no puede responderse |
| `CLOSED` | Cerrada por Fluz sin un resultado de revisión | Eliminar la solicitud de tu interfaz |

Las preguntas se devuelven solo mientras una RFI está en `PENDING_DOCUMENTS`. En cualquier otro estado, `questions` es una lista vacía.

> [!NOTE]
>
> Un negocio con una RFI abierta o en revisión aparece como `PENDING` en [getBusiness](https://docs.fluz.app/get-business.md). Enviar la RFI no aprueba el negocio; espera a que `kybStatus` cambie.

***

## Tipos de pregunta

Cada respuesta se envía como `value` en un `RfiAnswerInput`. Su formato depende del `questionType` de la pregunta.

| `questionType` | `value` | Reglas |
| - | - | - |
| `FREE_FORM_TEXT` | Cadena | Hasta 10 000 caracteres. Se recortan los espacios |
| `SINGLE_LINE_TEXT` | Cadena | Hasta 10 000 caracteres. Se recortan los espacios |
| `EMAIL` | Cadena | Una dirección de correo electrónico válida |
| `PHONE_NUMBER` | Cadena | De 7 a 20 caracteres entre dígitos, espacios, `+`, `-`, `.`, `(` y `)`, con al menos un dígito |
| `NUMBER` | Número o cadena numérica | Por ejemplo `1250` o `"1250.50"` |
| `DATE` | Cadena | `YYYY-MM-DD`, una fecha real del calendario |
| `DROPDOWN` | Cadena | Exactamente una de las `options` de la pregunta |
| `SINGLE_CHECKBOX` | Cadena | Exactamente una de las `options` de la pregunta |
| `MULTIPLE_CHECKBOX` | Lista de cadenas | Cada una de las `options` de la pregunta, sin repeticiones |
| `MULTI_UPLOAD` | Lista de `{ "fileId": "<uuid>" }` | De 1 a 20 archivos [cargados](https://docs.fluz.app/upload-rfi-document) para esta pregunta |
| `BANK_LINK_OR_STATEMENT` | Lista de `{ "fileId": "<uuid>" }` | De 1 a 20 archivos PDF o de imagen, **o** un banco vinculado con [completeRfiPlaidLink](https://docs.fluz.app/complete-rfi-plaid-link) |
| `ADDRESS_VERIFICATION_OR_DOCUMENT` | Lista de `{ "fileId": "<uuid>" }` | De 1 a 20 archivos PDF o de imagen, **o** una vinculación bancaria cuyo banco confirme el domicilio del cliente |
| `SECTION_BREAK` | — | Un encabezado solo para el diseño. No se puede responder |

### Preguntas obligatorias y opcionales

`isOptional: false` significa que la pregunta debe responderse antes de poder finalizar la RFI. Las preguntas opcionales pueden omitirse.

### Preguntas condicionales

Cuando `visibilityCondition` está definido, la pregunta aplica solo si la condición se cumple según las respuestas a las preguntas **anteriores**. Evalúala en tu interfaz para mostrar u ocultar la pregunta:

```json theme={null}
{
  "kind": "GROUP",
  "logic": "AND",
  "items": [
    { "kind": "PREDICATE", "questionId": "q_entity_type", "operator": "EQ", "value": "LLC" },
    { "kind": "PREDICATE", "questionId": "q_member_count", "operator": "GT", "value": "1" }
  ]
}
```

| Campo | Valores |
| - | - |
| `kind` | `GROUP` (combina `items` con `logic`) o `PREDICATE` (una sola prueba) |
| `logic` | `AND` u `OR` |
| `operator` | `EQ`, `NEQ`, `IN`, `NOT_IN`, `GT`, `GTE`, `LT`, `LTE` |
| `value` | Una cadena, o una lista de cadenas para `IN` y `NOT_IN` |

* Las condiciones se evalúan solo contra respuestas de texto y de opción. Las respuestas con archivos y con vinculación bancaria cuentan como sin responder.
* Una pregunta que no aplica no es obligatoria, y cualquier respuesta que envíes para ella se ignora.

***

## Webhooks

Para saber cuándo llega una RFI sin consultar periódicamente, suscríbete a los eventos de webhook de RFI. Consulta [Webhooks](https://docs.fluz.app/fluz-dashboard/webhooks.md#rfi-events).

***

## Páginas relacionadas

> [card] [Leer RFI](https://docs.fluz.app/get-rfis)
>
> `openRfis` y `rfi`: las preguntas, las respuestas guardadas y el estado.

> [card] [Cargar documentos de RFI](https://docs.fluz.app/upload-rfi-document)
>
> El endpoint REST que devuelve el `fileId` que envías.

> [card] [Enviar una RFI](https://docs.fluz.app/submit-rfi)
>
> Guarda respuestas, finaliza y gestiona los errores de validación.

> [card] [Responder con una vinculación bancaria](https://docs.fluz.app/complete-rfi-plaid-link)
>
> Usa Plaid en lugar de un estado de cuenta bancario o un comprobante de domicilio.


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