Flag payment for review
Place one of your payments in review with your reason. The review is pending from the response onward, and it holds the payment at its next admission step until you resolve it or the hold ends.
You can flag a payout in initiated, authorized, accepted, or
payout_failed, and a request in created, authenticated, funded, or
disbursement_failed. Returns a 409 with error code state-conflict when
the payment is in any other state, because it has no admission step left.
That problem carries no review member.
The review’s subject is the payment’s sender or requester, taken from the payment; the body does not select a subject.
The hold ends at the returned review’s holdExpiresOn. The hold ending
does not resolve the review: the review stays pending until you resolve it.
A payment has one pending review at a time. Flagging again while one is
pending returns a 409 with error code review-pending; that problem’s
review member carries the existing review.
Returns 201 with the pending review. A payment that is missing or that
belongs to another provider returns 404. Returns 422 when reason fails
validation.
Auth: API key or bearer token. Scoped to the calling provider.
curl -X POST https://api.moov.money/providers/{providerID}/payments/{paymentID}/reviews \
-u "$MOOV_API_KEY_ID:$MOOV_API_KEY_SECRET" \
-H "X-Moov-Version: v2026.10.00" \
-H "Content-Type: application/json" \
-d '{
"reason": "Payout amount above review threshold"
}'{
"review": {
"assessmentLevel": "high",
"assessmentScore": 0,
"counterparty": {
"displayName": "Jane Doe",
"externalID": "C-2077",
"funding": {
"disabledOn": "2026-10-08T12:00:00Z",
"displayName": "Checking",
"fundingType": "bank_account",
"last4": "5612",
"providerSourceID": "src_01HF5J9ZKQT4RXP8M2VYBN3D"
},
"participantID": "counterparty-id_user",
"phoneNumber": "+15555551234"
},
"createdOn": "2026-08-31T12:00:00Z",
"flaggedParticipantID": "3v2whagmwvbujhwbt7v3nl6ffq_user",
"flaggedRole": "sender",
"initiator": {
"displayName": "Jane Smith",
"externalID": "C-1042",
"funding": {
"disabledOn": "2026-10-08T12:00:00Z",
"displayName": "Checking",
"fundingType": "bank_account",
"last4": "5612",
"providerSourceID": "src_01HF5J9ZKQT4RXP8M2VYBN3D"
},
"participantID": "participant-id_user",
"status": "active"
},
"payout": {
"amount": {
"currency": {
"code": "USD",
"decimalPlaces": 2,
"name": "US Dollar",
"numericCode": "840"
},
"value": "100.00"
},
"payoutID": "pay_01HF5J9ZKQT4RXP8M2VYBN3D",
"recipientName": "Jane Doe",
"status": "initiated"
},
"reason": "Payout amount above review threshold",
"request": {
"amount": {
"currency": {
"code": "USD",
"decimalPlaces": 2,
"name": "US Dollar",
"numericCode": "840"
},
"value": "100.00"
},
"createdOn": "2026-08-31T12:00:00Z",
"requestID": "01HF5J9ZKQT4RXP8M2VYBN3D_req",
"status": "created"
},
"reviewID": "prv_01HF5J9ZKQT4RXP8M2VYBN3D",
"riskAssessmentID": "ras_01HF5J9ZKQT4RXP8M2VYBN3D",
"status": "pending",
"type": "payout"
}
}Response body application/problem+json
application/problem+json.
From v2026.10.00, every error response that has a body uses this schema.type
string
requiredhttps://api.moov.money/errors#<code> (for
example invalid-request, idempotency-key-reused, or
idempotency-request-in-progress). Treat the value as
an opaque constant and do not fetch it. about:blank means the HTTP
status code says everything there is to know.title
string
requiredstatus
integer<int32>
requireddetail
stringinstance
stringerrors
array<object>Show child attributes
errors[]
pointer
string
requireddetail
string
requiredreview member.Response body application/problem+json
review is an extension member of the problem detail, present only
when a pending review already exists.type
string
requiredhttps://api.moov.money/errors#<code> (for
example invalid-request, idempotency-key-reused, or
idempotency-request-in-progress). Treat the value as
an opaque constant and do not fetch it. about:blank means the HTTP
status code says everything there is to know.title
string
requiredstatus
integer<int32>
requireddetail
stringinstance
stringerrors
array<object>Show child attributes
errors[]
pointer
string
requireddetail
string
requiredreview
objectShow child attributes
review
reviewID
string
requiredtype
string<enum>
requiredpayout carries the payout summary; request carries the request summary.payout,
requeststatus
string<enum>
requiredpending,
approved,
rejectedreason
stringriskAssessmentID
stringpayout
objectShow child attributes
review.payout
payoutID
string
requiredamount
object
requiredShow child attributes
review.payout.amount
value
string
requiredcurrency
object
requiredShow child attributes
review.payout.amount.currency
code
string
requireddecimalPlaces
integer<uint8>
requiredcode. Required.numericCode
stringname
stringrecipientName
stringstatus
string<enum>
requiredinitiated,
authorized,
accepted,
claiming,
completed,
failed,
payout_failed,
cancelled,
expired,
deniedrequest
objectShow child attributes
review.request
requestID
string
requiredamount
object
requiredShow child attributes
review.request.amount
value
string
requiredcurrency
object
requiredShow child attributes
review.request.amount.currency
code
string
requireddecimalPlaces
integer<uint8>
requiredcode. Required.numericCode
stringname
stringstatus
string<enum>
requiredcreated,
authenticated,
declined,
cancelled,
expired,
paying,
funded,
disbursing,
disbursement_failed,
completed,
reversing,
reversal_failed,
reversed,
deniedmemo
stringexpiresOn
string<date-time>
requiredcreatedOn
string<date-time>
requiredcreatedOn
string<date-time>
requiredholdExpiresOn
string<date-time>resolvedOn
string<date-time>assessmentScore
number<double>assessmentLevel
string<enum>assessmentScore is present. Omitted when no level was recorded, for
example when the risk check was unavailable.low,
medium,
high,
very_highflaggedParticipantID
stringflaggedRole
string<enum>sender,
requester,
payerinitiator
objectShow child attributes
review.initiator
participantID
string
requiredexternalID
stringdisplayName
stringstatus
string<enum>active,
disabled,
pending,
deniedfunding
objectShow child attributes
review.initiator.funding
fundingType
string<enum>
requiredcard,
bank_accountdisplayName
stringlast4
stringcard, or of the bank account number for bank_account. Omitted when unknown. At most 4 characters.providerSourceID
stringproviderSourceID you registered for this funding source. Present
only when the instrument is a registered funding source of your
participant. Omitted for a payout that sent a provider source token
with no registered funding source.disabledOn
string<date-time>providerSourceID is omitted.counterparty
objectinitiator applies. Fields that are unbound or
not known are omitted. Omitted when no counterparty is recorded.Show child attributes
review.counterparty
displayName
stringphoneNumber
stringparticipantID
stringexternalID
stringfunding
objectShow child attributes
review.counterparty.funding
fundingType
string<enum>
requiredcard,
bank_accountdisplayName
stringlast4
stringcard, or of the bank account number for bank_account. Omitted when unknown. At most 4 characters.providerSourceID
stringproviderSourceID you registered for this funding source. Present
only when the instrument is a registered funding source of your
participant. Omitted for a payout that sent a provider source token
with no registered funding source.disabledOn
string<date-time>providerSourceID is omitted.Response body application/problem+json
application/problem+json.
From v2026.10.00, every error response that has a body uses this schema.type
string
requiredhttps://api.moov.money/errors#<code> (for
example invalid-request, idempotency-key-reused, or
idempotency-request-in-progress). Treat the value as
an opaque constant and do not fetch it. about:blank means the HTTP
status code says everything there is to know.title
string
requiredstatus
integer<int32>
requireddetail
stringinstance
stringerrors
array<object>Show child attributes
errors[]
pointer
string
requireddetail
string
requiredRetry-After.Response body application/problem+json
application/problem+json.
From v2026.10.00, every error response that has a body uses this schema.type
string
requiredhttps://api.moov.money/errors#<code> (for
example invalid-request, idempotency-key-reused, or
idempotency-request-in-progress). Treat the value as
an opaque constant and do not fetch it. about:blank means the HTTP
status code says everything there is to know.title
string
requiredstatus
integer<int32>
requireddetail
stringinstance
stringerrors
array<object>Show child attributes
errors[]
pointer
string
requireddetail
string
requiredHeaders
X-Moov-Version
stringv2026.10.00). When omitted, the server applies its default version.Path parameters
providerID
string
requiredpaymentID
string
requiredRequest
reason
string
[1 to 512] characters
requiredResponse
review.review
object
requiredShow child attributes
review
reviewID
string
requiredtype
string<enum>
requiredpayout carries the payout summary; request carries the request summary.payout,
requeststatus
string<enum>
requiredpending,
approved,
rejectedreason
stringriskAssessmentID
stringpayout
objectShow child attributes
review.payout
payoutID
string
requiredamount
object
requiredShow child attributes
review.payout.amount
value
string
requiredcurrency
object
requiredShow child attributes
review.payout.amount.currency
code
string
requireddecimalPlaces
integer<uint8>
requiredcode. Required.numericCode
stringname
stringrecipientName
stringstatus
string<enum>
requiredinitiated,
authorized,
accepted,
claiming,
completed,
failed,
payout_failed,
cancelled,
expired,
deniedrequest
objectShow child attributes
review.request
requestID
string
requiredamount
object
requiredShow child attributes
review.request.amount
value
string
requiredcurrency
object
requiredShow child attributes
review.request.amount.currency
code
string
requireddecimalPlaces
integer<uint8>
requiredcode. Required.numericCode
stringname
stringstatus
string<enum>
requiredcreated,
authenticated,
declined,
cancelled,
expired,
paying,
funded,
disbursing,
disbursement_failed,
completed,
reversing,
reversal_failed,
reversed,
deniedmemo
stringexpiresOn
string<date-time>
requiredcreatedOn
string<date-time>
requiredcreatedOn
string<date-time>
requiredholdExpiresOn
string<date-time>resolvedOn
string<date-time>assessmentScore
number<double>assessmentLevel
string<enum>assessmentScore is present. Omitted when no level was recorded, for
example when the risk check was unavailable.low,
medium,
high,
very_highflaggedParticipantID
stringflaggedRole
string<enum>sender,
requester,
payerinitiator
objectShow child attributes
review.initiator
participantID
string
requiredexternalID
stringdisplayName
stringstatus
string<enum>active,
disabled,
pending,
deniedfunding
objectShow child attributes
review.initiator.funding
fundingType
string<enum>
requiredcard,
bank_accountdisplayName
stringlast4
stringcard, or of the bank account number for bank_account. Omitted when unknown. At most 4 characters.providerSourceID
stringproviderSourceID you registered for this funding source. Present
only when the instrument is a registered funding source of your
participant. Omitted for a payout that sent a provider source token
with no registered funding source.disabledOn
string<date-time>providerSourceID is omitted.counterparty
objectinitiator applies. Fields that are unbound or
not known are omitted. Omitted when no counterparty is recorded.Show child attributes
review.counterparty
displayName
stringphoneNumber
stringparticipantID
stringexternalID
stringfunding
objectShow child attributes
review.counterparty.funding
fundingType
string<enum>
requiredcard,
bank_accountdisplayName
stringlast4
stringcard, or of the bank account number for bank_account. Omitted when unknown. At most 4 characters.providerSourceID
stringproviderSourceID you registered for this funding source. Present
only when the instrument is a registered funding source of your
participant. Omitted for a payout that sent a provider source token
with no registered funding source.disabledOn
string<date-time>providerSourceID is omitted.