Skip to main content

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 activity
  • source_of_funds: questions about specific transactions. Always tied to a transaction
Some RFIs also move the customer back to IdentificationRequired. That pauses the customer, and funds sent to an active Autoramp are held until the RFI is resolved. Treat an RFI on a live customer as blocking, not informational.Held funds can be returned to the sender, but only manually. Contact the MoonPay team to arrange it.
Not every RFI does this. A customer can keep transacting with an open RFI, so read the customer’s status rather than assuming the RFI paused them.
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 a round_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 reaches needs_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.
Compliance page on the RFIs tab, listing three customers with request counts and needs action or submitted badges

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.
Information requests sheet showing the customer record and Questions Round 1 with four unanswered questions

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.
The same sheet after submitting, read-only with a Submitted badge, the answers echoed under each question, and a Response submitted toast
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.
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.
Returns 200 with an empty body.
This POST requires an Idempotency-Key header. See Idempotency for retry behavior.
Calling it twice for the same round returns 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

Send exactly one value per answer. A text question with boolean_value set, or a yes_no question with text_value set, returns 400. Every question marked required: true has to be answered in the same call.
Returns 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 returns 400 with a plain-text body, not JSON:
Unlike most API errors, these 400 bodies are plain text. Don’t parse them as 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.

Customer in EDD

Source of Wealth