Skip to content

Get a risk review

The risk.reviews.get operation: GET /api/v1/risk/reviews/{id} in the REST API and the risk_reviews_get tool in the MCP server.

GET/api/v1/risk/reviews/{id}

One held payment of the review queue: its risk evaluation (the decision, the score, every reason and the signals the rules used: the email's domain, the truncated IP network, the IP, billing and card countries, the card's fingerprint), the payment and customer, and the review (pending, approved or rejected, by whom, the refund and blocklist entries of a rejection, the wallets the hold froze). An evaluation that held nothing is risk_evaluation_not_held: read it with risk.evaluations.get.

At a glance

  • REST: GET /api/v1/risk/reviews/{id}
  • MCP tool: risk_reviews_get
  • Operation ID: risk.reviews.get
  • Scope: Brand
  • Permission: customers:read
  • Risk tier: read
  • Dry run: Not supported
  • Idempotency: Not needed (read only)
  • Modes: Test and live
  • Authentication: API key with the customers:read scope
  • Since: M9

Request

Path parameters

FieldTypeDescription
idrsk_… ID

Query parameters

This operation takes no query parameters.

Response

200 OK with a JSON object:

FieldTypeDescription
idrsk_… ID
object"risk_evaluation"
livemodeboolean
brandIdbrd_… ID
subjectobject
subject.typeone of checkout_session, auto_reload
subject.checkoutSessionIdcs_… ID or null
subject.walletIdwal_… ID or null
customerIdcus_… ID or null
paymentIdpay_… ID or null
stageone of intent, payment_method, confirm, off_session
decisionone of allow, require_3ds, review, block
scoreinteger
reasonsarray of object
reasons[].codeone of 21 values, e.g. customer_blocked, customer_elevated, blocklist_email (all in the OpenAPI document)
reasons[].actionone of block, review, require_3ds, score
reasons[].pointsinteger or null
reasons[].detailstring
signalsobject
signals.emailDomainstring or null
signals.ipNetworkstring or null
signals.ipCountrystring or null
signals.billingCountrystring or null
signals.cardCountrystring or null
signals.cardFingerprintstring or null
signals.amountmoney or null
signals.topupboolean
signals.newCustomerboolean
signals.firstPaymentboolean
signals.disposableEmailboolean
historyarray of object
history[].atdate-time
history[].stageone of intent, payment_method, confirm, off_session
history[].decisionone of allow, require_3ds, review, block
history[].scoreinteger
reviewobject or null
createdAtdate-time
updatedAtdate-time

Examples

A held first top-up

HTTP
GET /api/v1/risk/reviews/rsk_01m4ttwd3veh9apbewxheq5xr1
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "id": "rsk_01m4ttwd3veh9apbewxheq5xr1",
  "object": "risk_evaluation",
  "livemode": true,
  "brandId": "brd_01m4ttwd3veh9apbewxheq5xh5",
  "subject": {
    "type": "checkout_session",
    "checkoutSessionId": "cs_01m4ttwd3veh9apbewxheq5xr4",
    "walletId": null
  },
  "customerId": "cus_01m4ttwd3veh9apbewxheq5xr5",
  "paymentId": "pay_01m4ttwd3veh9apbewxheq5xr6",
  "stage": "confirm",
  "decision": "review",
  "score": 70,
  "reasons": [
    {
      "code": "first_payment",
      "action": "require_3ds",
      "points": null,
      "detail": "The customer's first payment."
    },
    {
      "code": "new_customer",
      "action": "score",
      "points": 10,
      "detail": "A new customer."
    },
    {
      "code": "country_mismatch_ip_billing",
      "action": "score",
      "points": 20,
      "detail": "IP country DE isn't the billing country HR."
    },
    {
      "code": "country_mismatch_card_billing",
      "action": "score",
      "points": 25,
      "detail": "Card country US isn't the billing country HR."
    },
    {
      "code": "country_mismatch_ip_card",
      "action": "score",
      "points": 15,
      "detail": "IP country DE isn't the card country US."
    },
    {
      "code": "score_review",
      "action": "review",
      "points": null,
      "detail": "Score 70 ≥ 70."
    }
  ],
  "signals": {
    "emailDomain": "corp.example",
    "ipNetwork": "203.0.113.0",
    "ipCountry": "DE",
    "billingCountry": "HR",
    "cardCountry": "US",
    "cardFingerprint": "Xo1abC9dEf2GhI3j",
    "amount": {
      "amount": "90000000",
      "currency": "EUR"
    },
    "topup": true,
    "newCustomer": true,
    "firstPayment": true,
    "disposableEmail": false
  },
  "history": [
    {
      "at": "2026-10-20T09:00:00.000Z",
      "stage": "intent",
      "decision": "require_3ds",
      "score": 30
    },
    {
      "at": "2026-10-20T09:01:00.000Z",
      "stage": "payment_method",
      "decision": "review",
      "score": 70
    },
    {
      "at": "2026-10-20T09:01:30.000Z",
      "stage": "confirm",
      "decision": "review",
      "score": 70
    }
  ],
  "review": {
    "status": "pending",
    "openedAt": "2026-10-20T09:02:00.000Z",
    "decidedAt": null,
    "decidedBy": null,
    "note": null,
    "refundId": null,
    "blocklistEntryIds": [],
    "frozenWalletIds": ["wal_01m4ttwd3veh9apbewxheq5xr7"]
  },
  "createdAt": "2026-10-20T09:00:00.000Z",
  "updatedAt": "2026-10-20T09:02:00.000Z"
}

Errors

CodeHTTP statusWhenWhat to do
resource_not_found404No risk evaluation with this ID in this brand and mode.Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
risk_evaluation_not_held400The evaluation held no payment for review.Only payments the risk rules held are in the review queue (risk.reviews.list). Refund other payments with refunds.create.
permission_denied403You can't see this brand's customers.Ask an organization owner or admin for a role or scope that allows this action.

It can also return these common errors: validation_failed, api_version_unsupported, authentication_required, api_key_invalid, scope_required, dry_run_not_supported, rate_limited, internal_error.