RFI case
Audience: partners integrating with our push notification service.
Scope: events whose
eventvalue starts withv1.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
| Event | When it triggers |
|---|---|
v1.rfi.case.opened | A new RFI case has been raised against the customer. The case is OPEN and awaiting customer response. |
v1.rfi.case.closed | All questions are answered, all document requests are satisfied, and the case has been closed by Hubpay. |
v1.rfi.case.cancelled | The 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
- Hubpay raises a new RFI case. You receive
rfi.case.openedwith the full item counts so you can surface the request to the customer. - The customer answers questions and attaches documents through the Responding to RFI endpoints.
- Once every item is resolved and Hubpay accepts the responses, the case is closed and you receive
rfi.case.closed. - If Hubpay decides the case is no longer needed (for example a superseded ask), the case is cancelled
and you receive
rfi.case.cancelledinstead. 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.
| Field | Type | Events | Description |
|---|---|---|---|
rfiId | string | All | UUID of the RFI case. Matches relatedObject.id. |
caseNumber | string | All | Human-readable case reference (e.g. RFI-20260611-9F3A21B7). Stable for the lifetime of the case. Always present. |
subjectType | string | All | What the case is about — ONBOARDING_APPLICATION or TRANSACTION. |
subjectId | string | All | UUID of the subject resource (e.g. the application or transaction the case relates to). |
subjectReference | string | All | Human-readable reference for the subject. Omitted when null (onboarding RFIs). |
status | string | All | Case status after the transition — OPEN, CLOSED, or CANCELLED. |
questionCount | string | All | Number of questions on the case (as a string). |
documentRequestCount | string | All | Number of document requests on the case (as a string). |
customerDisplayMessage | string | All | Free-text message from the Hubpay reviewer, safe to show the customer directly. May be empty. |
closedBy | string | closed | Identifier of the reviewer that closed the case. |
closedAt | string | closed | ISO-8601 timestamp the case was closed. |
cancelledBy | string | cancelled | Identifier of the reviewer that cancelled the case. |
cancelledAt | string | cancelled | ISO-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.