> ## 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 Token。不接受 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.