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

# Read Information Requests

> List a customer's open requests for information with openRfis, or read one RFI with rfi: its status, questions and saved answers.

## Overview

Two queries read requests for information (RFIs):

* **`openRfis`** lists every RFI on the token's account that is waiting for the customer's answers. Use it to decide whether to show an RFI prompt.
* **`rfi`** reads one RFI by ID, in any status. Use it to render a form you have already found, or to check the outcome after submitting.

Both return the same `Rfi` type. See the [RFI overview](https://docs.fluz.app/rfi-overview) for the flow and question types.

## Required scopes

| Property | Value |
| - | - |
| Endpoint | GraphQL API |
| Authentication | OAuth Bearer Token. Basic auth is not accepted |
| Required Scopes | `MANAGE_RFI` |

The customer is taken from the token. The token's `accountId` must be the account the RFI is on, and its user must be the account's addressee: the owner of a consumer account, or the **applicant** of a business account. See [Who can answer an 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
    }
  }
}
```

Returns `[Rfi!]!`: the RFIs on the token's account with status `PENDING_DOCUMENTS` that have not expired, newest first. Returns `[]` when there are none.

RFIs that are `IN_REVIEW` or finished are not in this list. Read them with `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
    }
  }
}
```

### Arguments

| Argument | Type | Required | Description |
| - | - | - | - |
| `rfiId` | `UUID!` | Yes | The RFI to read |

Returns the RFI in any status. Questions are included only while it is `PENDING_DOCUMENTS`; otherwise `questions` is `[]`.

## Response details

### Rfi

| Field | Type | Description |
| - | - | - |
| `rfiId` | `UUID!` | The RFI's ID. Pass it to the upload endpoint, `submitRfi` and `completeRfiPlaidLink` |
| `status` | `RfiStatus!` | See [RFI status lifecycle](https://docs.fluz.app/rfi-overview#rfi-status-lifecycle) |
| `introText` | `String` | Explanation written by Fluz for the customer. Show it above the questions |
| `expiresAt` | `DateTime` | When the RFI stops accepting answers. `null` when it has no expiry |
| `createdAt` | `DateTime` | When the RFI was created |
| `updatedAt` | `DateTime` | When the RFI last changed |
| `questions` | `[RfiQuestion!]!` | The questions of the current round. Empty unless `status` is `PENDING_DOCUMENTS` |

### RfiQuestion

| Field | Type | Description |
| - | - | - |
| `questionId` | `String!` | Stable ID. Use it as `questionId` when uploading files and answering |
| `questionType` | `RfiQuestionType!` | The kind of input the question expects. See [Question types](https://docs.fluz.app/rfi-overview#question-types) |
| `isOptional` | `Boolean!` | `false` when the question must be answered before the RFI can be finalized |
| `question` | `String!` | The question text |
| `helperText` | `String` | Extra guidance, such as which documents are accepted |
| `options` | `[String!]` | Allowed values for `DROPDOWN`, `SINGLE_CHECKBOX` and `MULTIPLE_CHECKBOX` |
| `visibilityCondition` | `JSON` | When set, the question applies only if the condition on earlier answers holds. See [Conditional questions](https://docs.fluz.app/rfi-overview#conditional-questions) |
| `keepSamePage` | `Boolean` | Layout hint: keep this question on the same page as the one before it |
| `ordinal` | `Int!` | Display order. Render questions in ascending `ordinal` |
| `isSubmitted` | `Boolean!` | `true` once the question has a saved answer. A saved answer cannot be changed |
| `answer` | `JSON` | The saved answer, if any (see below) |

### Saved answers

| Question answered with | `answer` |
| - | - |
| Text, number, date or a single option | The value as sent, for example `"Acme Holdings LLC"` |
| Several options | A list of strings |
| Files | A list of `{ "fileName": "...", "url": "..." }`. `fileName` is the name the file was uploaded with. `url` is where Fluz stores the file and is not a public download link — show `fileName` to the customer |
| A Plaid bank link | `{ "type": "PLAID_BANK_LINK", "institutionName": "...", "accounts": [...], "linkedAt": "...", "identityMatchStatus": "..." }` |

Use `isSubmitted` to show answered questions as read-only and leave them out of your next `submitRfi` call.

## cURL Example

```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 } } }"
  }'
```

## Example Response

```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
          }
        ]
      }
    ]
  }
}
```

The fourth question applies only when the customer picks "Other" for the third.

## Error Codes

Both queries return failures in the top-level `errors` array.

| Code | Name | Description | How to resolve |
| - | - | - | - |
| `AUTH-0002` | InvalidCredentials | Basic auth was used | Call with a Bearer user token |
| `AUTH-0008` | InvalidUserAccess | The Bearer token has no `userId` or `accountId` | Mint the token for a user and account |
| `AUTH-0031` | InvalidScope | The token is missing `MANAGE_RFI` | Add the scope to your app, have the customer approve it, and re-mint the token |
| `G-0003` | ResourceAccessDenied | `extensions.rfiErrorCode: "ACCESS_DENIED"`. For `rfi`: the RFI does not exist, is on another account, or the token's user is not its addressee. For `openRfis`: the token's user is not the addressee of the token's account | Mint the token for the account the RFI is on, for its owner or the business applicant |

> [!NOTE]
>
> `openRfis` returns a non-null list, so an `ACCESS_DENIED` error sets `data` to `null`. Check `errors` before reading `data`.

## Best practices

* **Poll gently, or use webhooks.** Call `openRfis` when the customer opens your app or their account screen, not on every page load. To be told when an RFI arrives, subscribe to the [RFI webhook events](https://docs.fluz.app/fluz-dashboard/webhooks.md#rfi-events).
* **Render from the response.** Questions, their order and which are required change from one RFI to the next.
* **Show the expiry.** If `expiresAt` is set, show it to the customer. An expired RFI cannot be answered.

## Related pages

> [card] [RFI overview](https://docs.fluz.app/rfi-overview)
>
> Statuses, question types and the end-to-end flow.

> [card] [Submit an RFI](https://docs.fluz.app/submit-rfi)
>
> Send the answers for the questions you rendered.


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