Skip to content

Update the risk settings

The risk.settings.update operation: PATCH /api/v1/risk/settings in the REST API and the risk_settings_update tool in the MCP server.

PATCH/api/v1/risk/settings

Changes the brand's risk rules in the mode of the request. Give only what changes: any group (newCustomer, velocity, points, thresholds, disposableEmail, wallet) and, within it, any field; the rest keeps its value (the defaults until the first change). Per-currency amounts (firstTopupMax.amounts, wallet.usageCap, integer micros as strings) and velocity.emailDomain.exemptDomains are replaced as a whole.

Each rule's action is block (the payment is refused before it reaches the card), review (it goes through, and waits in the review queue with the customer's wallet frozen) or require_3ds (the bank authenticates the customer). Thresholds must rise: threeDSecure ≤ review ≤ block (null: no score blocks). Windows are 1–168 hours. A usage cap for fresh balances (wallet.usageCapUntilAgeHours, 1–720, with wallet.usageCap) limits how much of the credits bought in that time can be reserved or spent; null turns it off.

Pass expectedVersion to refuse the change if someone else changed the settings meanwhile. Test and live mode have their own settings. Needs brands:write (owners and admins).

At a glance

  • REST: PATCH /api/v1/risk/settings
  • MCP tool: risk_settings_update
  • Operation ID: risk.settings.update
  • Scope: Brand
  • Permission: brands:write
  • Risk tier: write
  • Dry run: Supported (send Ownrecord-Dry-Run: true)
  • Idempotency: Idempotency-Key optional
  • Modes: Test and live
  • Authentication: API key with the brands:write scope
  • Since: M9

Request

Body

A JSON object (Content-Type: application/json):

FieldTypeRequiredDescription
newCustomerobjectNo
newCustomer.ageHoursinteger (1 to 8760)No
newCustomer.topupsobjectNo
newCustomer.topups.enabledbooleanNo
newCustomer.topups.limitinteger (1 to 10000)No
newCustomer.topups.windowHoursinteger (1 to 168)No
newCustomer.topups.actionone of block, review, require_3dsNo
newCustomer.firstTopupMaxobjectNo
newCustomer.firstTopupMax.enabledbooleanNo
newCustomer.firstTopupMax.amountsobjectNo
newCustomer.firstTopupMax.actionone of block, review, require_3dsNo
newCustomer.threeDSecureFirstPaymentbooleanNo
velocityobjectNo
velocity.ipNetworkobjectNo
velocity.ipNetwork.enabledbooleanNo
velocity.ipNetwork.limitinteger (1 to 10000)No
velocity.ipNetwork.windowHoursinteger (1 to 168)No
velocity.ipNetwork.actionone of block, review, require_3dsNo
velocity.ipNetwork.cardLimitinteger (1 to 10000)No
velocity.cardFingerprintobjectNo
velocity.cardFingerprint.enabledbooleanNo
velocity.cardFingerprint.limitinteger (1 to 10000)No
velocity.cardFingerprint.windowHoursinteger (1 to 168)No
velocity.cardFingerprint.actionone of block, review, require_3dsNo
velocity.emailDomainobjectNo
velocity.emailDomain.enabledbooleanNo
velocity.emailDomain.limitinteger (1 to 10000)No
velocity.emailDomain.windowHoursinteger (1 to 168)No
velocity.emailDomain.actionone of block, review, require_3dsNo
velocity.emailDomain.exemptDomainsarray of stringNo
pointsobjectNo
points.ipBillingMismatchinteger (0 to 100)No
points.cardBillingMismatchinteger (0 to 100)No
points.ipCardMismatchinteger (0 to 100)No
points.elevatedCustomerinteger (0 to 100)No
points.newCustomerinteger (0 to 100)No
thresholdsobjectNo
thresholds.threeDSecureinteger (1 to 1000)No
thresholds.reviewinteger (1 to 1000)No
thresholds.blockinteger (1 to 1000) or nullNo
disposableEmailobjectNo
disposableEmail.enabledbooleanNo
disposableEmail.actionone of block, review, require_3dsNo
walletobjectNo
wallet.usageCapUntilAgeHoursinteger (1 to 720) or nullNo
wallet.usageCapobjectNo
expectedVersioninteger (at least 0)No

Response

200 OK with a JSON object:

FieldTypeDescription
object"risk_settings"
brandIdbrd_… ID
livemodeboolean
isDefaultboolean
versioninteger (at least 0)
updatedAtdate-time or null
newCustomerobject
newCustomer.ageHoursinteger
newCustomer.topupsobject
newCustomer.topups.enabledboolean
newCustomer.topups.limitinteger
newCustomer.topups.windowHoursinteger
newCustomer.topups.actionone of block, review, require_3ds
newCustomer.firstTopupMaxobject
newCustomer.firstTopupMax.enabledboolean
newCustomer.firstTopupMax.amountsobject
newCustomer.firstTopupMax.actionone of block, review, require_3ds
newCustomer.threeDSecureFirstPaymentboolean
velocityobject
velocity.ipNetworkobject
velocity.ipNetwork.enabledboolean
velocity.ipNetwork.limitinteger
velocity.ipNetwork.windowHoursinteger
velocity.ipNetwork.actionone of block, review, require_3ds
velocity.ipNetwork.cardLimitinteger
velocity.cardFingerprintobject
velocity.cardFingerprint.enabledboolean
velocity.cardFingerprint.limitinteger
velocity.cardFingerprint.windowHoursinteger
velocity.cardFingerprint.actionone of block, review, require_3ds
velocity.emailDomainobject
velocity.emailDomain.enabledboolean
velocity.emailDomain.limitinteger
velocity.emailDomain.windowHoursinteger
velocity.emailDomain.actionone of block, review, require_3ds
velocity.emailDomain.exemptDomainsarray of string
pointsobject
points.ipBillingMismatchinteger
points.cardBillingMismatchinteger
points.ipCardMismatchinteger
points.elevatedCustomerinteger
points.newCustomerinteger
thresholdsobject
thresholds.threeDSecureinteger
thresholds.reviewinteger
thresholds.blockinteger or null
disposableEmailobject
disposableEmail.enabledboolean
disposableEmail.actionone of block, review, require_3ds
walletobject
wallet.usageCapUntilAgeHoursinteger or null
wallet.usageCapobject

Examples

Hold riskier payments sooner and cap fresh balances

HTTP
PATCH /api/v1/risk/settings
Authorization: Bearer or_test_…
Content-Type: application/json

{
  "thresholds": {
    "review": 60
  },
  "wallet": {
    "usageCapUntilAgeHours": 24,
    "usageCap": {
      "EUR": "20000000"
    }
  },
  "expectedVersion": 0
}

Response (200):

JSON
{
  "object": "risk_settings",
  "brandId": "brd_01m4ttwd3veh9apbewxheq5xh5",
  "livemode": true,
  "isDefault": false,
  "version": 1,
  "updatedAt": "2026-10-20T09:00:00.000Z",
  "newCustomer": {
    "ageHours": 168,
    "topups": {
      "enabled": true,
      "limit": 2,
      "windowHours": 24,
      "action": "block"
    },
    "firstTopupMax": {
      "enabled": true,
      "amounts": {
        "CHF": "100000000",
        "EUR": "100000000",
        "GBP": "100000000",
        "USD": "100000000"
      },
      "action": "block"
    },
    "threeDSecureFirstPayment": true
  },
  "velocity": {
    "ipNetwork": {
      "enabled": true,
      "limit": 10,
      "windowHours": 1,
      "action": "block",
      "cardLimit": 3
    },
    "cardFingerprint": {
      "enabled": true,
      "limit": 5,
      "windowHours": 24,
      "action": "block"
    },
    "emailDomain": {
      "enabled": true,
      "limit": 10,
      "windowHours": 1,
      "action": "block",
      "exemptDomains": [
        "aol.com",
        "gmail.com",
        "gmx.at",
        "gmx.de",
        "gmx.net",
        "googlemail.com",
        "hotmail.com",
        "icloud.com",
        "live.com",
        "mail.com",
        "me.com",
        "msn.com",
        "outlook.com",
        "proton.me",
        "protonmail.com",
        "t-online.de",
        "web.de",
        "yahoo.com",
        "yandex.com"
      ]
    }
  },
  "points": {
    "ipBillingMismatch": 20,
    "cardBillingMismatch": 25,
    "ipCardMismatch": 15,
    "elevatedCustomer": 40,
    "newCustomer": 10
  },
  "thresholds": {
    "threeDSecure": 20,
    "review": 60,
    "block": null
  },
  "disposableEmail": {
    "enabled": true,
    "action": "block"
  },
  "wallet": {
    "usageCapUntilAgeHours": 24,
    "usageCap": {
      "EUR": "20000000"
    }
  }
}

Try the velocity rules in test mode

HTTP
PATCH /api/v1/risk/settings
Authorization: Bearer or_test_…
Content-Type: application/json

{
  "velocity": {
    "ipNetwork": {
      "enabled": true
    },
    "cardFingerprint": {
      "enabled": true
    },
    "emailDomain": {
      "enabled": true
    }
  }
}

Response (200):

JSON
{
  "object": "risk_settings",
  "brandId": "brd_01m4ttwd3veh9apbewxheq5xh5",
  "livemode": false,
  "isDefault": false,
  "version": 1,
  "updatedAt": "2026-10-20T09:00:00.000Z",
  "newCustomer": {
    "ageHours": 168,
    "topups": {
      "enabled": false,
      "limit": 2,
      "windowHours": 24,
      "action": "block"
    },
    "firstTopupMax": {
      "enabled": false,
      "amounts": {
        "CHF": "100000000",
        "EUR": "100000000",
        "GBP": "100000000",
        "USD": "100000000"
      },
      "action": "block"
    },
    "threeDSecureFirstPayment": true
  },
  "velocity": {
    "ipNetwork": {
      "enabled": true,
      "limit": 10,
      "windowHours": 1,
      "action": "block",
      "cardLimit": 3
    },
    "cardFingerprint": {
      "enabled": true,
      "limit": 5,
      "windowHours": 24,
      "action": "block"
    },
    "emailDomain": {
      "enabled": true,
      "limit": 10,
      "windowHours": 1,
      "action": "block",
      "exemptDomains": [
        "aol.com",
        "gmail.com",
        "gmx.at",
        "gmx.de",
        "gmx.net",
        "googlemail.com",
        "hotmail.com",
        "icloud.com",
        "live.com",
        "mail.com",
        "me.com",
        "msn.com",
        "outlook.com",
        "proton.me",
        "protonmail.com",
        "t-online.de",
        "web.de",
        "yahoo.com",
        "yandex.com"
      ]
    }
  },
  "points": {
    "ipBillingMismatch": 20,
    "cardBillingMismatch": 25,
    "ipCardMismatch": 15,
    "elevatedCustomer": 40,
    "newCustomer": 10
  },
  "thresholds": {
    "threeDSecure": 20,
    "review": 75,
    "block": null
  },
  "disposableEmail": {
    "enabled": true,
    "action": "block"
  },
  "wallet": {
    "usageCapUntilAgeHours": null,
    "usageCap": {}
  }
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400A value is out of range, a currency is unknown, or the thresholds don't rise.Fix the fields listed in details.issues and send the request again.
version_conflict409The settings changed since expectedVersion, or at the same moment.Fetch the object again and retry the change.
permission_denied403You can't change this brand's settings.Ask an organization owner or admin for a role or scope that allows this action.

It can also return these common errors: api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, scope_required, resource_not_found, idempotency_key_reused, idempotency_in_progress, approval_required, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.