Hifi RFI API

Request for information (RFI) endpoints

Operations 2

GET /v2/rfis List RFIs #
POST /v2/rfis/{rfiId}/submissions Submit an RFI response #

Specifications

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/hifi:hifi-rfi-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

hifi-rfi-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Hifi RFI API
  version: 2.0.0
  description: API documentation for HIFI
servers:
- url: https://production.hifibridge.com
  description: Production server
- url: https://sandbox.hifibridge.com
  description: Sandbox server
security:
- bearerAuth: []
tags:
- name: RFI
  description: Request for information (RFI) endpoints
paths:
  /v2/rfis:
    get:
      summary: List RFIs
      description: 'List the requests for information (RFIs) compliance has raised against your users. An RFI is raised either during onboarding, against the user''s KYC/KYB, or against a single transfer, which stays held until the request is resolved.


        If you would rather collect the reply programmatically, submit it through the Submit an RFI response endpoint instead.


        Pass `transferId` to find the request holding a specific onramp or offramp, for example after an `ONRAMP.RFI.OPEN` or `OFFRAMP.RFI.OPEN` webhook.


        The open onboarding RFI for a single user is also returned on the Retrieve KYC status endpoint.'
      tags:
      - RFI
      parameters:
      - $ref: '#/components/parameters/RfiStatusQueryParameter'
      - $ref: '#/components/parameters/RfiKindQueryParameter'
      - $ref: '#/components/parameters/RfiUserIdQueryParameter'
      - $ref: '#/components/parameters/RfiTransferIdQueryParameter'
      - $ref: '#/components/parameters/RfiLimitParameter'
      - $ref: '#/components/parameters/RfiOffsetParameter'
      responses:
        '200':
          $ref: '#/components/responses/ListRfisResponse'
        '400':
          $ref: '#/components/responses/RfiBadRequestResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedResponse'
        '500':
          $ref: '#/components/responses/RfiInternalServerErrorResponse'
      operationId: getV2Rfis
      x-operation-id-source: derived
  /v2/rfis/{rfiId}/submissions:
    post:
      summary: Submit an RFI response
      description: Answer the current round of a request for information. Each entry in `items` replies to one request item by its `requestItemId` with exactly one of `fileId` or `answerText`, and any file must be uploaded through the files endpoint first. Every item marked `required` must be answered, and a round accepts only one submission.
      tags:
      - RFI
      parameters:
      - $ref: '#/components/parameters/RfiIdPathParameter'
      requestBody:
        $ref: '#/components/requestBodies/SubmitRfiBody'
      responses:
        '200':
          $ref: '#/components/responses/SubmitRfiResponse'
        '400':
          $ref: '#/components/responses/RfiBadRequestResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedResponse'
        '404':
          $ref: '#/components/responses/RfiNotFoundResponse'
        '409':
          $ref: '#/components/responses/RfiConflictResponse'
        '422':
          $ref: '#/components/responses/RfiNotEligibleResponse'
        '500':
          $ref: '#/components/responses/RfiInternalServerErrorResponse'
      operationId: postV2RfisByRfiIdSubmissions
      x-operation-id-source: derived
components:
  responses:
    RfiConflictResponse:
      description: Conflict
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RfiError'
          example:
            type: RESOURCE_CONFLICT
            message: This request has already been answered
    ListRfisResponse:
      description: Success
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RfiListObject'
          example:
            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=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
            pagination:
              limit: 20
              offset: 0
              total: 1
    RfiNotEligibleResponse:
      description: Unprocessable Entity
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RfiError'
          example:
            type: RESOURCE_NOT_USABLE
            message: The deadline for this request has passed
    RfiInternalServerErrorResponse:
      description: Internal Server Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RfiError'
          example:
            type: INTERNAL_SERVER_ERROR
            message: An internal error occurred
    RfiBadRequestResponse:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RfiError'
          example:
            type: VALIDATION_ERROR
            message: A question request item is answered with answerText
            fields:
            - code: conditional_required
              message: A question request item is answered with answerText
              field: items[1].answerText
    RfiNotFoundResponse:
      description: Not Found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RfiError'
          example:
            type: RESOURCE_NOT_FOUND
            message: RFI not found
    UnauthorizedResponse:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Unauthorized'
    SubmitRfiResponse:
      description: Success
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RfiSubmissionResult'
          example:
            rfiId: 7c9e1a34-5b02-4d68-91af-3e6d2b8c4075
            roundId: b81d4f2c-6e35-4a90-9f27-0c3e5a71d8b6
            round: 1
            status: submitted
            submittedAt: '2026-07-03T09:12:44.000Z'
            responseCount: 3
  parameters:
    RfiLimitParameter:
      name: limit
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 20
      description: Number of requests to return.
    RfiTransferIdQueryParameter:
      name: transferId
      in: query
      required: false
      schema:
        type: string
        format: uuid
      description: ID of the onramp or offramp the request is held against.
      example: 9b1e4c72-3a58-4f06-8d2b-6c0e7a1f5d43
    RfiStatusQueryParameter:
      name: status
      in: query
      required: false
      schema:
        type: string
        enum:
        - issued
        - submitted
        - resolved
        - expired
      description: Filter requests by status.
    RfiUserIdQueryParameter:
      name: userId
      in: query
      required: false
      schema:
        type: string
        format: uuid
      description: ID of the user whose requests are listed.
      example: 2d5b7e18-9c40-4a63-b8f1-7e0a4c9d2536
    RfiKindQueryParameter:
      name: kind
      in: query
      required: false
      schema:
        type: string
        enum:
        - onboarding
        - transaction
      description: Filter requests by what they are attached to.
    RfiIdPathParameter:
      name: rfiId
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: ID of the request for information.
      example: 7c9e1a34-5b02-4d68-91af-3e6d2b8c4075
    RfiOffsetParameter:
      name: offset
      in: query
      required: false
      schema:
        type: integer
        minimum: 0
        default: 0
      description: Number of requests to skip.
  schemas:
    RfiError:
      type: object
      properties:
        type:
          type: string
          description: Machine-readable error type.
          example: VALIDATION_ERROR
        message:
          type: string
          description: Human-readable error message.
          example: One or more fields are invalid or missing.
        fields:
          type: array
          description: Present on field-level validation errors. One entry per problem field.
          items:
            type: object
            properties:
              code:
                type: string
                description: Error code related to the field issue.
              message:
                type: string
                description: Error message for the specific issue.
              field:
                type: string
                description: The name of the field that has an issue.
    RfiListObject:
      type: object
      description: Paginated list of requests for information, newest first.
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/RfiObject'
        pagination:
          $ref: '#/components/schemas/RfiPagination'
    RfiObject:
      type: object
      description: A request for information raised by compliance against a user or one of their transfers.
      properties:
        id:
          type: string
          format: uuid
          description: Request ID.
          example: 7c9e1a34-5b02-4d68-91af-3e6d2b8c4075
        kind:
          $ref: '#/components/schemas/RfiKind'
        status:
          $ref: '#/components/schemas/RfiStatus'
        subjectType:
          type: string
          description: Whether the user the request concerns is an individual or a business.
          enum:
          - individual
          - business
          example: individual
        userId:
          type:
          - string
          - 'null'
          format: uuid
          description: ID of the user the request concerns.
          example: 2d5b7e18-9c40-4a63-b8f1-7e0a4c9d2536
        transferId:
          type:
          - string
          - 'null'
          format: uuid
          description: ID of the held transfer, on a `transaction` request. Null on an `onboarding` request.
          example: null
        flowType:
          type:
          - string
          - 'null'
          description: Which transfer `transferId` refers to. Null on an `onboarding` request.
          enum:
          - onramp
          - offramp
          - null
          example: null
        createdAt:
          type: string
          format: date-time
          description: When the request was raised.
          example: '2026-07-01T10:30:00.000Z'
        currentRound:
          type:
          - integer
          - 'null'
          description: Attempt number of the round in `round`.
          example: 1
        round:
          allOf:
          - $ref: '#/components/schemas/RfiRoundObject'
          description: The current round. Null if the request has no round open.
    Unauthorized:
      type: object
      properties:
        code:
          type: integer
          description: Error code
        error:
          type: string
          description: Error type
        errorDetails:
          type: string
          description: Detailed error message
    RfiStatus:
      type: string
      description: Where the request is in its lifecycle. `issued` is waiting on a reply, `submitted` has been answered and is under review, `resolved` has been decided, and `expired` passed its deadline unanswered.
      enum:
      - issued
      - submitted
      - resolved
      - expired
      example: issued
    RfiRequestItemObject:
      type: object
      description: A single thing being asked for. One item may be answered by several entries in a submission, which is how three bank statements answer one request.
      properties:
        id:
          type: string
          format: uuid
          description: Request item ID. Quote it as `requestItemId` when submitting a reply.
          example: 3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34
        kind:
          type: string
          description: '`document` expects a file, or written text explaining why the file cannot be provided. `question` expects written text only.'
          enum:
          - document
          - question
          example: document
        label:
          type: string
          description: What is being asked for, in the reviewer's own words.
          example: Proof of address issued in the last 3 months
        docType:
          type:
          - string
          - 'null'
          description: Hint for the kind of document expected. Null when the request does not correspond to a standard document type. Not a closed set, so treat an unrecognised value as an untyped document request. Values currently in use are `proof_of_address`, `source_of_funds`, `bank_statement`, `government_id`, `selfie`, `incorporation_docs`, `ownership_structure`, `invoice` and `contract`.
          example: proof_of_address
        detail:
          type:
          - string
          - 'null'
          description: Additional guidance for this item.
          example: A utility bill or bank statement dated within the last three months.
        required:
          type: boolean
          description: Whether this item must be answered for the submission to be accepted.
          example: true
    RfiSubmissionItem:
      type: object
      description: One reply to one request item. Exactly one of `fileId` and `answerText` must be provided.
      required:
      - requestItemId
      properties:
        requestItemId:
          type: string
          format: uuid
          description: The `id` of the request item being answered.
          example: 3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34
        fileId:
          type:
          - string
          - 'null'
          description: ID of a file previously uploaded through the files API (prefixed with `file_`). Only valid against a `document` request item, and only for a file uploaded under the same client.
          example: file_7bV1aLcs3Kf9dQ2mNpXwZ
        answerText:
          type:
          - string
          - 'null'
          minLength: 1
          maxLength: 10000
          description: Written reply. Required for a `question` request item, and accepted for a `document` request item as an explanation in place of the file.
          example: The property is leased by the user's employer; the attached letter confirms the address.
    RfiRoundObject:
      type: object
      description: The current attempt at the request. Each time compliance asks again a new round is opened with its own items and deadline, and earlier rounds are retained but not returned here.
      properties:
        id:
          type: string
          format: uuid
          description: Round ID.
          example: b81d4f2c-6e35-4a90-9f27-0c3e5a71d8b6
        round:
          type: integer
          description: Attempt number, starting at 1.
          example: 1
        issuedAt:
          type: string
          format: date-time
          description: When this round was issued and emailed to your compliance contact.
          example: '2026-07-01T10:30:00.000Z'
        expiresAt:
          type:
          - string
          - 'null'
          format: date-time
          description: Deadline for replying. A submission after this time is rejected.
          example: '2026-07-31T10:30:00.000Z'
        submittedAt:
          type:
          - string
          - 'null'
          format: date-time
          description: When this round was answered. Null while it is still awaiting a reply.
          example: null
        items:
          type: array
          description: What this round asks for, in the order it should be presented.
          items:
            $ref: '#/components/schemas/RfiRequestItemObject'
        link:
          type:
          - string
          - 'null'
          description: Hosted page where you can answer the request without calling this API. The same link is emailed to your compliance contact when the request is issued. Null once the link can no longer be used, which is after a submission, after compliance asks again, or once the request is closed.
          example: https://dashboard.hifi.com/production/rfi-link/rfir_2mNpXwZ7bV1aLcs3Kf9dQ#sessionToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    RfiSubmissionResult:
      type: object
      description: Confirmation that a submission was recorded.
      properties:
        rfiId:
          type: string
          format: uuid
          description: ID of the request that was answered.
          example: 7c9e1a34-5b02-4d68-91af-3e6d2b8c4075
        roundId:
          type: string
          format: uuid
          description: ID of the round that was answered.
          example: b81d4f2c-6e35-4a90-9f27-0c3e5a71d8b6
        round:
          type: integer
          description: Attempt number that was answered.
          example: 1
        status:
          type: string
          description: Status of the request after the submission.
          enum:
          - submitted
          example: submitted
        submittedAt:
          type: string
          format: date-time
          description: When the submission was recorded.
          example: '2026-07-03T09:12:44.000Z'
        responseCount:
          type: integer
          description: Number of replies recorded, which may exceed the number of request items answered.
          example: 5
    RfiPagination:
      type: object
      description: Offset-based pagination.
      properties:
        limit:
          type: integer
          description: Page size used for this response.
          example: 20
        offset:
          type: integer
          description: Number of records skipped.
          example: 0
        total:
          type: integer
          description: Total number of records matching the filters.
          example: 3
      required:
      - limit
      - offset
      - total
    RfiKind:
      type: string
      description: What the request is attached to. `onboarding` asks about the user's own KYC/KYB; `transaction` asks about a single transfer, which stays held until the request is resolved.
      enum:
      - onboarding
      - transaction
      example: onboarding
    RfiSubmissionBody:
      type: object
      description: The replies making up one submission.
      required:
      - items
      properties:
        items:
          type: array
          minItems: 1
          maxItems: 200
          description: One entry per reply.
          items:
            $ref: '#/components/schemas/RfiSubmissionItem'
  requestBodies:
    SubmitRfiBody:
      required: true
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RfiSubmissionBody'
          example:
            items:
            - requestItemId: 3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34
              fileId: file_7bV1aLcs3Kf9dQ2mNpXwZ
            - requestItemId: 3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34
              fileId: file_9aB0xY4mNpXwZ7bV1aLdt
            - requestItemId: 6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041
              answerText: Salary from the user's employer, with payslips attached.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT