Skip to main content

RFI case

Audience: partners integrating with our push notification service.

Scope: events whose event value starts with v1.rfi.case.*

Version: 1.0


1. Overview

When our review or compliance teams need additional information from a customer, they raise a Request For Information (RFI) case. An RFI bundles one or more questions and document requests that the customer must respond to before the underlying review can complete. Whenever an RFI case transitions through its lifecycle, we emit a webhook so your system can react in real-time — surface the request to the customer, track outstanding items, or escalate when a case is closed or cancelled.

This page covers case-level lifecycle events. Per-document approve/decline events on files attached to an RFI are a separate family — see RFI document.


2. Event catalogue

EventWhen it triggers
v1.rfi.case.openedA new RFI case has been raised against the customer. The case is OPEN and awaiting customer response.
v1.rfi.case.closedAll questions are answered, all document requests are satisfied, and the case has been closed by Hubpay.
v1.rfi.case.cancelledThe case has been cancelled by Hubpay (e.g. no longer required). Customer responses are no longer needed.

All events carry relatedObjectType = rfi.case.

3. Event flow

  1. Hubpay raises a new RFI case. You receive rfi.case.opened with the full item counts so you can surface the request to the customer.
  2. The customer answers questions and attaches documents through the Responding to RFI endpoints.
  3. Once every item is resolved and Hubpay accepts the responses, the case is closed and you receive rfi.case.closed.
  4. If Hubpay decides the case is no longer needed (for example a superseded ask), the case is cancelled and you receive rfi.case.cancelled instead. No further customer action is required.

4. Additional data

Each rfi.case.* event includes the following properties in the data object. All values are strings, including the numeric counters (questionCount, documentRequestCount) — parse them accordingly.

FieldTypeEventsDescription
rfiIdstringAllUUID of the RFI case. Matches relatedObject.id.
caseNumberstringAllHuman-readable case reference (e.g. RFI-20260611-9F3A21B7). Stable for the lifetime of the case. Always present.
subjectTypestringAllWhat the case is about — ONBOARDING_APPLICATION or TRANSACTION.
subjectIdstringAllUUID of the subject resource (e.g. the application or transaction the case relates to).
subjectReferencestringAllHuman-readable reference for the subject. Omitted when null (onboarding RFIs).
statusstringAllCase status after the transition — OPEN, CLOSED, or CANCELLED.
questionCountstringAllNumber of questions on the case (as a string).
documentRequestCountstringAllNumber of document requests on the case (as a string).
customerDisplayMessagestringAllFree-text message from the Hubpay reviewer, safe to show the customer directly. May be empty.
closedBystringclosedIdentifier of the reviewer that closed the case.
closedAtstringclosedISO-8601 timestamp the case was closed.
cancelledBystringcancelledIdentifier of the reviewer that cancelled the case.
cancelledAtstringcancelledISO-8601 timestamp the case was cancelled.

5. Payload examples

rfi.case.opened

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"event": "v1.rfi.case.opened",
"accountId": "f5e6d7c8-b9a0-4321-8765-0fedcba98765",
"createdAt": "2026-05-12T09:30:00Z",
"data": {
"rfiId": "11111111-1111-1111-1111-111111111111",
"caseNumber": "RFI-20260512-9F3A21B7",
"subjectType": "ONBOARDING_APPLICATION",
"subjectId": "22222222-2222-2222-2222-222222222222",
"status": "OPEN",
"questionCount": "2",
"documentRequestCount": "1",
"customerDisplayMessage": "Please confirm the source of funds and upload a recent bank statement."
},
"relatedObject": {
"id": "11111111-1111-1111-1111-111111111111",
"type": "rfi.case"
}
}

rfi.case.closed

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"event": "v1.rfi.case.closed",
"accountId": "f5e6d7c8-b9a0-4321-8765-0fedcba98765",
"createdAt": "2026-05-13T14:22:08Z",
"data": {
"rfiId": "11111111-1111-1111-1111-111111111111",
"caseNumber": "RFI-20260512-9F3A21B7",
"subjectType": "ONBOARDING_APPLICATION",
"subjectId": "22222222-2222-2222-2222-222222222222",
"status": "CLOSED",
"questionCount": "2",
"documentRequestCount": "1",
"customerDisplayMessage": "Please confirm the source of funds and upload a recent bank statement.",
"closedBy": "reviewer-7f3a",
"closedAt": "2026-05-13T14:22:07Z"
},
"relatedObject": {
"id": "11111111-1111-1111-1111-111111111111",
"type": "rfi.case"
}
}

rfi.case.cancelled

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"event": "v1.rfi.case.cancelled",
"accountId": "f5e6d7c8-b9a0-4321-8765-0fedcba98765",
"createdAt": "2026-05-13T11:00:00Z",
"data": {
"rfiId": "11111111-1111-1111-1111-111111111111",
"caseNumber": "RFI-20260513-1A2B3C4D",
"subjectType": "TRANSACTION",
"subjectId": "33333333-3333-3333-3333-333333333333",
"status": "CANCELLED",
"questionCount": "1",
"documentRequestCount": "0",
"customerDisplayMessage": "Quick check on this transfer — please describe the purpose of the payment.",
"cancelledBy": "reviewer-7f3a",
"cancelledAt": "2026-05-13T10:59:55Z"
},
"relatedObject": {
"id": "11111111-1111-1111-1111-111111111111",
"type": "rfi.case"
}
}

See the callback documentation for the full webhook envelope schema.


6. Footnotes

Subject types and scope. v1.rfi.case.* is intentionally subject-neutral at the wire level. The family fires for every RFI case regardless of subjectType — onboarding-application RFIs and transaction RFIs both emit lifecycle events.

Per-document events. Approve/decline events for files the customer attaches to a document request are a separate family — see RFI document. The case-level family covers the case as a whole; the document family covers each attached file individually.