Overview
An information request (RFI) is MoonPay Enterprise asking for more detail about one of your customers. An RFI carries questions, a request for documents, or both. You collect the answers from your customer, submit them through the API, and MoonPay reviews and closes the RFI. There are two types:probing_questions: questions about the customer or their activitysource_of_funds: questions about specific transactions. Always tied to a transaction
RFIs do not emit webhooks. Poll
GET /api/rfis to pick up new requests.Rounds
Every RFI has at least one round. Round 1 is created with the RFI. If your answers don’t settle the question, MoonPay sends a follow-up round with new questions on the same RFI. Only the latest round accepts a response. Both write endpoints take around_id and return 409 Conflict if that round is not the latest one, so read the RFI first and use the round with the highest round_number. Rounds come back sorted by round_number ascending.
Statuses
Submitting a response moves an RFI from
waiting_on_response to needs_review. A follow-up round moves it back to waiting_on_response.
Outcomes
outcome is null until the RFI is closed, then holds one of:
How it works
1
Poll for open RFIs
GET /api/rfisReturns open RFIs grouped by customer, oldest first.2
Read the latest round
Take the round with the highest
round_number. Its questions are what you need to answer, and documents_requested tells you whether documents are also needed.3
Collect documents, if requested
POST /api/rfis/{rfi_id}/rounds/{round_id}/document-link-openedSend your customer to the round’s document_upload_url to upload the files.4
Submit the response
POST /api/rfis/{rfi_id}/rounds/{round_id}/responseAnswer every required question in one call. The RFI moves to needs_review.5
Wait for the outcome
MoonPay either closes the RFI with an
outcome or sends a follow-up round. Keep polling to find out which.Answer an RFI in the dashboard
Every RFI also shows up in the Partner Dashboard, so your team can answer one without an integration. The dashboard calls the same endpoints documented below, so an RFI answered there reachesneeds_review exactly as an API response does.
1. Open the RFI queue
Compliance > RFIs: every customer with an open request, how many requests each one has, and the age of the oldest. The status column separates what you owe a response on from what is already back with MoonPay.
2. Read the request
Click the customer’s name. Questions · Round 1 lists what was asked, with the analyst’s instruction above the questions and a Needs action badge while a response is outstanding. Copy questions copies them to your clipboard to forward to your customer. Required questions carry an asterisk, and each answer box matches the question type: free text, or Yes/No with an optional details field.
3. Submit the response
Submit response stays disabled until every required question has an answer. When documents were requested, the card also shows a secure upload link, and submitting is blocked until that link has been opened. After submitting, the card turns read-only: a Submitted badge, your answers echoed under each question, a Responded timestamp, and Copy Q&A for the whole exchange. The customer’s row drops its needs-action badge.
A follow-up round arrives as a new Questions · Round 2 card on the same RFI, and the customer’s row goes back to needs action. Answer it the same way.
List open RFIs
GET /api/rfis
Returns RFIs in waiting_on_response or needs_review, grouped by customer. Customers with at least one RFI still waiting on a response come first, then the customer whose oldest RFI was sent earliest. Closed RFIs are not included.
Query parameters
Response
cursor is the customer ID to pass as cursor for the next page. It is null on the last page.
List a customer’s RFIs
GET /api/customers/{customer_id}/rfis
Returns the open RFIs for one customer as a flat array, newest first. Closed RFIs are not included here. Fetch a closed RFI by ID instead.
Get an RFI
GET /api/rfis/{rfi_id}
Returns one RFI in any status, including closed.
Response
string (UUID)
required
The RFI ID.
string (UUID)
required
The customer the RFI is about.
string (UUID)
The transaction under review. Always set for
source_of_funds, null otherwise.string
required
probing_questions or source_of_funds.string
required
waiting_on_response, needs_review, or closed.string
passed, failed, or closed. Set once the RFI is closed, null before that.array
required
One entry per round, sorted by
round_number ascending.string (ISO 8601)
required
When the first round was sent.
string (ISO 8601)
When the most recent response arrived.
null if you have not responded yet.string (ISO 8601)
When MoonPay closed the RFI.
null while it is open.Record that the upload link was opened
POST /api/rfis/{rfi_id}/rounds/{round_id}/document-link-opened
Records that the round’s document_upload_url was opened, and stamps document_link_opened_at. Call it once, when you hand the link to your customer.
When you authenticate with an API key, this call is optional: you can submit a response with documents_uploaded: true without it. A signed-in dashboard user has to open the link first, otherwise the response is rejected with 400.
200 with an empty body.
This
POST requires an Idempotency-Key header. See Idempotency for retry behavior.409. See Common errors.
Submit a response
POST /api/rfis/{rfi_id}/rounds/{round_id}/response
Submits answers for one round. One call per round: there is no partial save, so send every answer you have at once.
Body
200 with an empty body. The RFI moves to needs_review and response_received_at is set on both the round and the RFI.
This
POST requires an Idempotency-Key header. See Idempotency for retry behavior.Error response
A rejected response returns400 with a plain-text body, not JSON:
Common errors
400 is the only status that carries a body. Unlike most of the API, these endpoints return no message or trace_id on 500.