Suspend participant from review
Suspend the participant’s relationship with your provider and resolve the
pending review in one atomic change. The suspension applies to your
provider only; the participant’s global status does not change. From
the next attempt, the participant cannot send payouts or create requests
through your provider, including from a session that is already open.
Money that a payer sends for one of their existing requests is not paid
out to them until you reactivate them or the request expires. Signing in,
payments that already started, reversals, and refunds are not affected.
Closing a review never reactivates a relationship.
Fetch the review detail first. Send its versionID as expectedVersionID
and its relationship.versionID as expectedRelationshipVersionID. Moov
Money compares both inside the write. Returns a 409 with error code
participant-review-version-conflict when either differs, and changes
neither the review nor the relationship. The problem detail does not name
the current versions. Fetch the review detail again before you retry.
When the relationship is already suspended, it keeps its original reason code and note. The review records your decision, and the relationship version still advances so an older reactivation cannot clear it.
Each suspension from a review writes a suspension relationship action
with this review’s participantReviewID, also when the relationship was
already suspended. The action carries this request’s reasonCode, its
reason as the note, and the new relationship versionID.
Returns 201 with the resolved review and the committed relationship
state. Returns a 409 with error code state-conflict when the review is
already resolved, whatever versions you send. A review from another
provider and a missing review both return 404. Returns 422 when the body
fails validation.
Send an X-Idempotency-Key header so a retried request is processed once.
Replaying the same key with the same body returns the original 201
response. Replaying it with a different body returns a 409 with error
code idempotency-key-reused. Returns a 409 with error code
idempotency-request-in-progress when a request with this key is still
running. Returns 400 when the header is missing or malformed.
Auth: API key or bearer token. Scoped to the calling provider. Requires both participant-review write access and relationship write access; missing either returns 403.
curl -X POST https://api.moov.money/providers/{providerID}/participant-reviews/{reviewID}/suspensions \
-u "$MOOV_API_KEY_ID:$MOOV_API_KEY_SECRET" \
-H "X-Moov-Version: v2026.10.00" \
-H "X-Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"expectedRelationshipVersionID": "relationship-v4",
"expectedVersionID": "review-v2",
"reason": "Unresolved identity concern",
"reasonCode": "suspected-fraud"
}'{
"review": {
"assessmentIDs": [
"ras_01HF5J9ZKQT4RXP8M2VYBN3D"
],
"assigneeUserID": "4d7c1b9e-2f3a-4e5b-8c6d-7e8f9a0b1c2d",
"createdOn": "2026-10-06T15:00:00Z",
"externalID": "customer-abc-123",
"notes": [
{
"actor": {
"callingAccountID": "acc_01HF5J9ZKQT4RXP8M2VYBN3D",
"kind": "user",
"userID": "4d7c1b9e-2f3a-4e5b-8c6d-7e8f9a0b1c2d"
},
"createdOn": "2026-10-06T15:30:00Z",
"resolvedByDisplay": {
"displayName": "Jordan Lee",
"email": "[email protected]"
},
"text": "Contacted participant"
}
],
"participantID": "3v2whagmwvbujhwbt7v3nl6ffq_user",
"reason": "Investigate sign-in activity",
"relationship": {
"suspended": true,
"versionID": "relationship-v5"
},
"resolution": {
"action": "suspend",
"actor": {
"callingAccountID": "acc_01HF5J9ZKQT4RXP8M2VYBN3D",
"kind": "user",
"userID": "4d7c1b9e-2f3a-4e5b-8c6d-7e8f9a0b1c2d"
},
"reason": "Unresolved identity concern",
"reasonCode": "suspected-fraud",
"resolvedByDisplay": {
"displayName": "Jordan Lee",
"email": "[email protected]"
},
"resolvedOn": "2026-10-06T16:00:00Z"
},
"reviewID": "8b1f6c2e-4d3a-5e7f-9a0b-1c2d3e4f5a6b",
"status": "resolved",
"versionID": "review-v3"
}
}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
requiredmap[detail:The review or relationship changed since you read it. Fetch the review again. status:409 title:Conflict type:https://api.moov.money/errors#participant-review-version-conflict]
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
requiredResponse 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.X-Idempotency-Key
string
requiredPath parameters
providerID
string
requiredreviewID
string
requiredRequest
reason
string
[1 to 512] characters
requiredother requires.reasonCode
string<enum>
requiredsuspected-fraud,
account-compromise,
customer-request,
compliance-review,
legal-hold,
policy-violation,
otherexpectedVersionID
string
requiredversionID from your latest read of the review detail.expectedRelationshipVersionID
string
requiredrelationship.versionID from the same read of the review detail.Response
review.review
object
requiredShow child attributes
review
reviewID
string
requiredparticipantID
string
requiredexternalID
string
requiredstatus
string<enum>
requiredpending,
resolvedversionID
string
requiredexpectedVersionID on your next note, assignment, or resolution.reason
stringassessmentIDs
array<string>
requiredassessmentID here. Empty when none are linked.assigneeUserID
stringcreatedOn
string<date-time>
requiredresolution
objectstatus is resolved.Show child attributes
review.resolution
action
string<enum>
requiredno_action,
suspendreason
string
requiredreasonCode
string<enum>action is
suspend. When the relationship was already suspended, the relationship
keeps its original classification and this field records your decision
only.suspected-fraud,
account-compromise,
customer-request,
compliance-review,
legal-hold,
policy-violation,
otherresolvedOn
string<date-time>
requiredactor
object
requiredShow child attributes
review.resolution.actor
kind
string<enum>
requireduser,
application,
systemuserID
stringkind is user. Omitted when kind is application or system.applicationKeyID
stringkind is application. Omitted when kind is user or system.callingAccountID
stringkind is user or application. Omitted when kind is system.resolvedByDisplay
objectactor when the review was resolved. A person shows
the name and email recorded then. An application actor and a system
actor show a fixed label. Omitted when no display was recorded; actor
still identifies who resolved the review.Show child attributes
review.resolution.resolvedByDisplay
displayName
string
requireduser actor uses the name recorded at
resolution. An application actor uses the fixed label
API application. A system actor uses the fixed label Moov Money.stringrelationship
object
requiredrelationship.versionID as expectedRelationshipVersionID when
you suspend from this review.Show child attributes
review.relationship
suspended
boolean
requiredversionID
string
requiredexpectedVersionID
on your next suspension or reactivation. It is not a relationship ID.notes
array<object>
requiredShow child attributes
review.notes[]
text
string
requiredcreatedOn
string<date-time>
requiredactor
object
requiredShow child attributes
review.notes[].actor
kind
string<enum>
requireduser,
application,
systemuserID
stringkind is user. Omitted when kind is application or system.applicationKeyID
stringkind is application. Omitted when kind is user or system.callingAccountID
stringkind is user or application. Omitted when kind is system.resolvedByDisplay
objectactor when the note was added. A person shows the
name and email recorded then. An application actor and a system actor
show a fixed label. Omitted when no display was recorded; actor still
identifies who added the note.Show child attributes
review.notes[].resolvedByDisplay
displayName
string
requireduser actor uses the name recorded at
resolution. An application actor uses the fixed label
API application. A system actor uses the fixed label Moov Money.string