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

# Requests for Information

> A request for information (RFI) is raised when our compliance team needs evidence beyond what was submitted. We email the request to your compliance contact with a HIFI-hosted link, and you can answer there or submit the reply through the API.

## Overview

An RFI is opened by our compliance team after a review, either against a user's KYC/KYB or against a single transfer. The request is emailed to your compliance contact, not to the end user. It carries a HIFI-hosted link you can answer on directly, so the default path needs no integration work. The endpoints below exist for clients who would rather gather the evidence inside their own product and reply programmatically.

| Kind          | Raised against             | Effect while open                                                                                |
| :------------ | :------------------------- | :----------------------------------------------------------------------------------------------- |
| `onboarding`  | The user's KYC/KYB         | KYC status moves to `RFI_PENDING` and onboarding does not complete until the request is resolved |
| `transaction` | A single onramp or offramp | That transfer stays held until the request is resolved                                           |

## Knowing an RFI Is Open

There are three ways to find out, and they answer slightly different questions.

| Signal                                       | Tells you                                                                          |
| :------------------------------------------- | :--------------------------------------------------------------------------------- |
| `KYC.RFI.OPEN` and `KYC.RFI.CLOSED` webhooks | An onboarding request was opened or closed for a user                              |
| GET `/v2/users/:user_id/kyc/status`          | The user's KYC status, plus an `rfi` object describing the open onboarding request |
| GET `/v2/rfis`                               | Every request across all your users, including transaction requests                |

<Info>
  A user can sit at `RFI_PENDING` with `rfi` still `null`. Our compliance team flags the case first and composes the request afterwards, so the status changes before there is anything to answer. Once the request is issued and emailed, `rfi` is populated.
</Info>

## Rounds

Each RFI has one open round at a time, numbered from 1. A round carries its own questions, its own deadline, and its own link. If the reply does not settle the question, our compliance team asks again, which closes the current round and opens the next one with a fresh link.

A round accepts one submission. Answering twice, or answering after the deadline, returns an error rather than replacing the reply.

## Request Items

The `items` array on the current round is what is being asked for, in the order it should be shown. Each item is answered by its `id`.

| Field      | Description                                                                                                 |
| :--------- | :---------------------------------------------------------------------------------------------------------- |
| `id`       | Quote this as `requestItemId` when you reply                                                                |
| `kind`     | `document` expects a file, or text explaining why the file cannot be provided. `question` expects text only |
| `label`    | What is being asked for, in the reviewer's own words                                                        |
| `docType`  | Hint for the kind of document expected, or `null` for a custom request. Not a closed set                    |
| `detail`   | Additional guidance, or `null`                                                                              |
| `required` | Whether the item must be answered for the submission to be accepted                                         |

## Example: Answer an RFI

<Steps>
  <Step title="Find the open request">
    List the requests raised against your users, filtering by status.

    **Request**

    ```shell theme={null}
    curl "https://sandbox.hifibridge.com/v2/rfis?status=issued" \
      -H "Authorization: Bearer YOUR_API_KEY"
    ```

    **Response**

    ```json theme={null}
    {
      "data": [
        {
          "id": "7c9e1a34-5b02-4d68-91af-3e6d2b8c4075",
          "kind": "onboarding",
          "status": "issued",
          "subjectType": "individual",
          "userId": "2d5b7e18-9c40-4a63-b8f1-7e0a4c9d2536",
          "transferId": null,
          "flowType": null,
          "createdAt": "2026-07-01T10:30:00.000Z",
          "currentRound": 1,
          "round": {
            "id": "b81d4f2c-6e35-4a90-9f27-0c3e5a71d8b6",
            "round": 1,
            "issuedAt": "2026-07-01T10:30:00.000Z",
            "expiresAt": "2026-07-31T10:30:00.000Z",
            "submittedAt": null,
            "items": [
              {
                "id": "3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34",
                "kind": "document",
                "label": "Proof of address issued in the last 3 months",
                "docType": "proof_of_address",
                "detail": "A utility bill or bank statement dated within the last three months.",
                "required": true
              },
              {
                "id": "6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041",
                "kind": "question",
                "label": "What is the source of the funds being deposited?",
                "docType": null,
                "detail": null,
                "required": true
              }
            ],
            "link": "https://dashboard.hifi.com/production/rfi-link/rfir_2mNpXwZ7bV1aLcs3Kf9dQ#sessionToken=..."
          }
        }
      ],
      "pagination": { "limit": 20, "offset": 0, "total": 1 }
    }
    ```

    <Tip>
      You can stop here. Open the `link` and answer on the HIFI-hosted page, with no further calls. The same link was emailed to your compliance contact when the request was issued.
    </Tip>
  </Step>

  <Step title="Upload any documents">
    Upload each file via POST `/v2/files` and keep the `file_` ID from the response.

    ```shell theme={null}
    curl -X POST "https://sandbox.hifibridge.com/v2/files" \
      -H "Authorization: Bearer YOUR_API_KEY" \
      -F "file=@proof-of-address.pdf"
    ```
  </Step>

  <Step title="Submit the reply">
    Answer every required item in one call. Each entry carries exactly one of `fileId` or `answerText`, and repeating a `requestItemId` attaches several files to the same item.

    **Request**

    ```shell theme={null}
    curl -X POST "https://sandbox.hifibridge.com/v2/rfis/7c9e1a34-5b02-4d68-91af-3e6d2b8c4075/submissions" \
      -H "Authorization: Bearer YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "items": [
          { "requestItemId": "3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34", "fileId": "file_7bV1aLcs3Kf9dQ2mNpXwZ" },
          { "requestItemId": "6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041", "answerText": "Salary from the user's employer, with payslips attached." }
        ]
      }'
    ```

    **Response**

    ```json theme={null}
    {
      "rfiId": "7c9e1a34-5b02-4d68-91af-3e6d2b8c4075",
      "roundId": "b81d4f2c-6e35-4a90-9f27-0c3e5a71d8b6",
      "round": 1,
      "status": "submitted",
      "submittedAt": "2026-07-03T09:12:44.000Z",
      "responseCount": 2
    }
    ```
  </Step>

  <Step title="Track the outcome">
    The request sits at `submitted` while our compliance team reviews it. It then moves to `resolved` and a `KYC.RFI.CLOSED` webhook is sent, or a new round opens if they need more. A request left unanswered past its deadline moves to `expired`.
  </Step>
</Steps>

## Statuses

| Status      | Description                                               |
| ----------- | --------------------------------------------------------- |
| `issued`    | Emailed to your compliance contact and waiting on a reply |
| `submitted` | Answered and under review by our compliance team          |
| `resolved`  | Decided by our compliance team                            |
| `expired`   | The deadline passed without a reply                       |

<Info>
  These are the RFI's own statuses. The user's KYC status is separate: it reads `RFI_PENDING` while an onboarding request is open, and moves on once the request is resolved.
</Info>

## Getting Help

* 📧 **Email:** [support@hifi.com](mailto:support@hifi.com)
* 💬 **Slack:** Message us in our shared Slack channel

## Related Resources

* [KYC Status](/kyc/kyc-status) - Individual KYC statuses
* [KYB Status](/kyc/kyb-status) - Business KYB statuses
* [KYC Links](/features/kyc-links) - HIFI-hosted KYC collection
