RFI document
Audience: partners integrating with our push notification service.
Scope: events whose
eventvalue starts withv1.rfi.document.*Version: 1.0
1. Overview
When a customer attaches a file to an RFI document request, the file enters the same per-document review pipeline as onboarding documents — automated validation followed by manual review. Each per-file decision emits a webhook so your system can react in real-time.
These events are a distinct family from v1.onboarding.document.*. The onboarding family covers files
uploaded during initial KYB onboarding; this family covers files uploaded against an RFI document request.
The two families have separate relatedObjectType values (rfi.document vs onboarding.document) so you
can route them independently.
For case-level lifecycle events (opened, closed, cancelled), see RFI case.
2. Event catalogue
| Event | When it triggers |
|---|---|
v1.rfi.document.approved | RFI-attached document has been reviewed and accepted. |
v1.rfi.document.declined | RFI-attached document has been reviewed and not accepted. See declinedReason for the category. |
v1.rfi.document.validation_warnings | Automated validation flagged concerns. Customer must acknowledge the warning or re-upload the file. |
All events carry relatedObjectType = rfi.document.
3. Correlating events to the parent RFI
The v1.rfi.document.* payload deliberately does not include rfiId. To route an event back to the RFI
case that produced it, you need to maintain your own mapping. Get this wrong and you will silently fail to
match webhooks to RFIs in your system.
documentId is the attached document's UUID — not the upload UUIDWhen the customer attaches files to a document request, the gateway merges the uploaded files into a single
document and returns that document's UUID. The webhook emits that UUID — not the documentUploadId
returned by POST /v1/rfi/{rfiId}/documents/upload.
If you persist documentUploadId → rfiId against the upload response, your lookup will silently miss every
webhook. Persist documentId → rfiId from the attach response instead (see pattern below).
Correct partner pattern — two steps:
-
At attach time.
POST /v1/rfi/{rfiId}/document-requests/{documentRequestId}/attachreturns the updatedRfi. WalkRfi.documentRequests[]and persistdocumentId → rfiIdfor every entry wheredocumentIdis non-null.One document is created per document-request slot — multi-file uploads (e.g. front + back of an ID) merge into a single document. You will get one webhook per document, not one per uploaded file.
-
On webhook arrival. Look up
event.data.documentIdin your map to get the owningrfiId.
4. Additional data
The data payload mirrors v1.onboarding.document.* exactly — same keys, same value semantics. All values
are strings, per the platform convention.
| Field | Type | Events | Description |
|---|---|---|---|
documentId | UUID | All | The attached document's UUID (see correlation note above). Matches relatedObject.id. |
documentType | string | All | Specific type, e.g. BANK_STATEMENT, PROOF_OF_ADDRESS. See Document requirements. |
documentCategory | string | All | RFI_DOCUMENT for files attached to an RFI document request. |
status | string | All | The document status after the transition. See Document statuses. |
declinedReason | string | declined | Why the document was not accepted. See Decline reasons. |
declinedCustomerDisplayReason | string | declined | Free-text reason safe to show the customer. Written by the reviewer. |
validationStatus | string | validation_warnings | The specific warning category from automated review. See Validation status. |
validationMessage | string | validation_warnings | Human-readable warning message. Safe to show the end customer directly. |
5. Payload examples
rfi.document.approved
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"event": "v1.rfi.document.approved",
"accountId": "f5e6d7c8-b9a0-4321-8765-0fedcba98765",
"createdAt": "2026-05-13T13:50:11Z",
"data": {
"documentId": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee",
"documentType": "BANK_STATEMENT",
"documentCategory": "RFI_DOCUMENT",
"status": "APPROVED"
},
"relatedObject": {
"id": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee",
"type": "rfi.document"
}
}
rfi.document.declined
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"event": "v1.rfi.document.declined",
"accountId": "f5e6d7c8-b9a0-4321-8765-0fedcba98765",
"createdAt": "2026-05-13T13:55:42Z",
"data": {
"documentId": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee",
"documentType": "BANK_STATEMENT",
"documentCategory": "RFI_DOCUMENT",
"status": "DECLINED",
"declinedReason": "QUALITY",
"declinedCustomerDisplayReason": "Statement is illegible — please upload a clearer PDF covering the last 3 months."
},
"relatedObject": {
"id": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee",
"type": "rfi.document"
}
}
rfi.document.validation_warnings
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"event": "v1.rfi.document.validation_warnings",
"accountId": "f5e6d7c8-b9a0-4321-8765-0fedcba98765",
"createdAt": "2026-05-13T13:45:09Z",
"data": {
"documentId": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee",
"documentType": "BANK_STATEMENT",
"documentCategory": "RFI_DOCUMENT",
"status": "VALIDATION_WARNINGS",
"validationStatus": "WARNING_QUALITY_INSUFFICIENT",
"validationMessage": "The image is blurry and some figures are hard to read. Please re-upload a clearer version."
},
"relatedObject": {
"id": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee",
"type": "rfi.document"
}
}
See the callback documentation for the full webhook envelope schema.
6. Migration note for existing partners
Prior to the RFI doc-link refactor, per-document decisions on RFI-attached files were routed through
v1.onboarding.document.*. They are now routed through this dedicated v1.rfi.document.* family instead.
If your integration was previously subscribed to v1.onboarding.document.* and expected to see RFI document
decisions on it, you must additionally subscribe to v1.rfi.document.* to keep receiving those events. The
onboarding family will continue to fire for initial KYB onboarding documents only.
7. Related pages
- RFI case — lifecycle events on the parent RFI case.
- Responding to RFI — answer & attach — the partner-facing flow
that produces these documents, including how to persist
documentIdat attach time.