> ## 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.

# 读取信息请求

> 使用 openRfis 列出客户的待处理信息请求，或使用 rfi 读取单个 RFI：其状态、问题和已保存的答案。

## 概述

有两个查询用于读取信息请求（RFI）：

* **`openRfis`** 列出令牌所属账户上所有正在等待客户回答的 RFI。可用它来决定是否显示 RFI 提示。
* **`rfi`** 按 ID 读取单个 RFI，不限状态。可用它来渲染您已找到的表单，或在提交后检查结果。

两者返回相同的 `Rfi` 类型。有关流程和问题类型，请参阅 [RFI 概述](https://docs.fluz.app/rfi-overview)。

## 所需权限范围

| 属性 | 值 |
| - | - |
| 端点 | GraphQL API |
| 身份验证 | OAuth Bearer 令牌。不接受 Basic 身份验证 |
| 所需权限范围 | `MANAGE_RFI` |

客户信息取自令牌。令牌的 `accountId` 必须是 RFI 所在的账户，且其用户必须是该账户的收件人：个人账户的所有者，或企业账户的**申请人**。请参阅[谁可以回答 RFI](https://docs.fluz.app/rfi-overview#who-can-answer-an-rfi)。

## openRfis

```graphql theme={null}
query OpenRfis {
  openRfis {
    rfiId
    status
    introText
    expiresAt
    createdAt
    updatedAt
    questions {
      questionId
      questionType
      isOptional
      question
      helperText
      options
      visibilityCondition
      keepSamePage
      ordinal
      isSubmitted
      answer
    }
  }
}
```

返回 `[Rfi!]!`：令牌所属账户上状态为 `PENDING_DOCUMENTS` 且未过期的 RFI，按最新优先排序。没有时返回 `[]`。

状态为 `IN_REVIEW` 或已完成的 RFI 不在此列表中。请使用 `rfi` 读取它们。

## rfi

```graphql theme={null}
query Rfi($rfiId: UUID!) {
  rfi(rfiId: $rfiId) {
    rfiId
    status
    introText
    expiresAt
    questions {
      questionId
      questionType
      isOptional
      question
      helperText
      options
      visibilityCondition
      ordinal
      isSubmitted
      answer
    }
  }
}
```

### 参数

| 参数 | 类型 | 必填 | 描述 |
| - | - | - | - |
| `rfiId` | `UUID!` | 是 | 要读取的 RFI |

返回任意状态的 RFI。仅当其状态为 `PENDING_DOCUMENTS` 时才包含问题；否则 `questions` 为 `[]`。

## 响应详情

### Rfi

| 字段 | 类型 | 描述 |
| - | - | - |
| `rfiId` | `UUID!` | RFI 的 ID。将其传给上传端点、`submitRfi` 和 `completeRfiPlaidLink` |
| `status` | `RfiStatus!` | 请参阅 [RFI 状态生命周期](https://docs.fluz.app/rfi-overview#rfi-status-lifecycle) |
| `introText` | `String` | Fluz 为客户撰写的说明。请显示在问题上方 |
| `expiresAt` | `DateTime` | RFI 停止接受答案的时间。无到期时间时为 `null` |
| `createdAt` | `DateTime` | RFI 的创建时间 |
| `updatedAt` | `DateTime` | RFI 的最后更改时间 |
| `questions` | `[RfiQuestion!]!` | 当前轮次的问题。除非 `status` 为 `PENDING_DOCUMENTS`，否则为空 |

### RfiQuestion

| 字段 | 类型 | 描述 |
| - | - | - |
| `questionId` | `String!` | 稳定的 ID。上传文件和回答时将其用作 `questionId` |
| `questionType` | `RfiQuestionType!` | 问题期望的输入类型。请参阅[问题类型](https://docs.fluz.app/rfi-overview#question-types) |
| `isOptional` | `Boolean!` | 为 `false` 时，必须先回答该问题，RFI 才能最终确定 |
| `question` | `String!` | 问题文本 |
| `helperText` | `String` | 额外指引，例如接受哪些文件 |
| `options` | `[String!]` | `DROPDOWN`、`SINGLE_CHECKBOX` 和 `MULTIPLE_CHECKBOX` 的允许值 |
| `visibilityCondition` | `JSON` | 设置后，仅当针对先前答案的条件成立时，该问题才适用。请参阅[条件问题](https://docs.fluz.app/rfi-overview#conditional-questions) |
| `keepSamePage` | `Boolean` | 布局提示：将此问题与其前一个问题保持在同一页面 |
| `ordinal` | `Int!` | 显示顺序。请按 `ordinal` 升序渲染问题 |
| `isSubmitted` | `Boolean!` | 问题有已保存的答案后为 `true`。已保存的答案无法更改 |
| `answer` | `JSON` | 已保存的答案（如有，见下文） |

### 已保存的答案

| 问题的回答方式 | `answer` |
| - | - |
| 文本、数字、日期或单个选项 | 按发送时的原值，例如 `"Acme Holdings LLC"` |
| 多个选项 | 字符串列表 |
| 文件 | `{ "fileName": "...", "url": "..." }` 的列表。`fileName` 是文件上传时使用的名称。`url` 是 Fluz 存储该文件的位置，并非公开下载链接——请向客户显示 `fileName` |
| Plaid 银行关联 | `{ "type": "PLAID_BANK_LINK", "institutionName": "...", "accounts": [...], "linkedAt": "...", "identityMatchStatus": "..." }` |

使用 `isSubmitted` 将已回答的问题显示为只读，并在下一次调用 `submitRfi` 时将其排除。

## cURL 示例

```bash theme={null}
curl -X POST https://transactional-graph.staging.fluzapp.com/api/v1/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -d '{
    "query": "query OpenRfis { openRfis { rfiId status introText expiresAt questions { questionId questionType isOptional question helperText options visibilityCondition ordinal isSubmitted answer } } }"
  }'
```

## 响应示例

```json theme={null}
{
  "data": {
    "openRfis": [
      {
        "rfiId": "7c1e2a90-4b3d-4f6e-9a18-3d5b2c7e8f01",
        "status": "PENDING_DOCUMENTS",
        "introText": "We need a few more details to finish reviewing your business.",
        "expiresAt": "2026-12-01T05:00:00.000Z",
        "questions": [
          {
            "questionId": "q_formation",
            "questionType": "MULTI_UPLOAD",
            "isOptional": false,
            "question": "Upload your articles of incorporation or organization.",
            "helperText": "PDF or image. Include every page.",
            "options": null,
            "visibilityCondition": null,
            "ordinal": 1,
            "isSubmitted": false,
            "answer": null
          },
          {
            "questionId": "q_address",
            "questionType": "ADDRESS_VERIFICATION_OR_DOCUMENT",
            "isOptional": false,
            "question": "Verify your business address.",
            "helperText": "Link the business bank account, or upload a utility bill or bank statement from the last 90 days.",
            "options": null,
            "visibilityCondition": null,
            "ordinal": 2,
            "isSubmitted": false,
            "answer": null
          },
          {
            "questionId": "q_source_of_funds",
            "questionType": "DROPDOWN",
            "isOptional": false,
            "question": "What is the main source of funds for this account?",
            "helperText": null,
            "options": ["Business revenue", "Owner investment", "Loan or financing", "Other"],
            "visibilityCondition": null,
            "ordinal": 3,
            "isSubmitted": false,
            "answer": null
          },
          {
            "questionId": "q_source_of_funds_other",
            "questionType": "SINGLE_LINE_TEXT",
            "isOptional": false,
            "question": "Describe the source of funds.",
            "helperText": null,
            "options": null,
            "visibilityCondition": {
              "kind": "PREDICATE",
              "questionId": "q_source_of_funds",
              "operator": "EQ",
              "value": "Other"
            },
            "ordinal": 4,
            "isSubmitted": false,
            "answer": null
          }
        ]
      }
    ]
  }
}
```

仅当客户在第三个问题中选择“Other”时，第四个问题才适用。

## 错误代码

两个查询都在顶层 `errors` 数组中返回失败信息。

| 代码 | 名称 | 描述 | 解决方法 |
| - | - | - | - |
| `AUTH-0002` | InvalidCredentials | 使用了 Basic 身份验证 | 使用 Bearer 用户令牌调用 |
| `AUTH-0008` | InvalidUserAccess | Bearer 令牌没有 `userId` 或 `accountId` | 为用户和账户生成令牌 |
| `AUTH-0031` | InvalidScope | 令牌缺少 `MANAGE_RFI` | 将该权限范围添加到您的应用，让客户批准，然后重新生成令牌 |
| `G-0003` | ResourceAccessDenied | `extensions.rfiErrorCode: "ACCESS_DENIED"`。对于 `rfi`：该 RFI 不存在、位于其他账户，或令牌的用户不是其收件人。对于 `openRfis`：令牌的用户不是令牌所属账户的收件人 | 为 RFI 所在的账户生成令牌，并使用其所有者或企业申请人 |

> [!NOTE]
>
> `openRfis` 返回非空列表，因此 `ACCESS_DENIED` 错误会将 `data` 设为 `null`。读取 `data` 之前请先检查 `errors`。

## 最佳实践

* **轮询要适度，或使用 webhook。** 在客户打开您的应用或其账户页面时调用 `openRfis`，而不是在每次页面加载时调用。如需在有 RFI 到达时收到通知，请订阅 [RFI webhook 事件](https://docs.fluz.app/fluz-dashboard/webhooks.md#rfi-events)。
* **根据响应进行渲染。** 问题、其顺序以及哪些为必答，会因 RFI 而异。
* **显示到期时间。** 如果设置了 `expiresAt`，请向客户显示。已过期的 RFI 无法回答。

## 相关页面

> [card] [RFI 概述](https://docs.fluz.app/rfi-overview)
>
> 状态、问题类型和端到端流程。

> [card] [提交 RFI](https://docs.fluz.app/submit-rfi)
>
> 发送您所渲染问题的答案。


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