Needs an API key. Changes the Rules settings of one of your apps, which changes live signup blocking for that app: the next real signups are scored and refused under the new settings. Send only the settings to change. The others stay as they are. Setting mode to "enforce" starts refusing signups marked block, and "shadow" stops refusing any. If one value is wrong, nothing changes and the answer says which. Returns the app's rules afterwards, with the settings that changed. Confirm the change with the user first. A key made for one app changes that app, so leave out "app". An older all-apps key needs "app".
View input schema
{
"type": "object",
"properties": {
"app": {
"type": "string",
"pattern": "^app_[0-9a-f]{24}$",
"maxLength": 28,
"description": "The app id (app_...). Leave it out with a key made for one app. An older all-apps key needs it."
},
"mode": {
"type": "string",
"enum": [
"shadow",
"enforce"
],
"description": "enforce refuses signups. shadow only logs."
},
"challenge_at": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"description": "The score that marks challenge."
},
"block_at": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"description": "The score that marks block. Higher than challenge_at."
},
"challenge_action": {
"type": "string",
"enum": [
"allow",
"block"
],
"description": "What the Supabase and Ory hooks do with a signup marked challenge."
},
"block_message": {
"type": "string",
"description": "The message a refused person sees, 200 characters at most after we trim spaces from both ends. Empty restores our default, which we word to fit the reason for each refusal."
},
"why_link": {
"type": "boolean",
"description": "Add the \"Why was this refused?\" link to refusals."
},
"velocity": {
"type": "object",
"description": "Earlier signups in the window before a velocity rule adds points: 0 turns one off, or 2 to 10,000. app counts this app. account counts all your apps and is 0 or at least app.",
"properties": {
"subnet": {
"type": "object",
"properties": {
"app": {
"type": "integer",
"oneOf": [
{
"const": 0
},
{
"type": "integer",
"minimum": 2,
"maximum": 10000
}
],
"description": "0 turns this count off. Otherwise 2 to 10000."
},
"account": {
"type": "integer",
"oneOf": [
{
"const": 0
},
{
"type": "integer",
"minimum": 2,
"maximum": 10000
}
],
"description": "0 turns this count off. Otherwise 2 to 10000."
}
},
"additionalProperties": false
},
"asn": {
"type": "object",
"properties": {
"app": {
"type": "integer",
"oneOf": [
{
"const": 0
},
{
"type": "integer",
"minimum": 2,
"maximum": 10000
}
],
"description": "0 turns this count off. Otherwise 2 to 10000."
},
"account": {
"type": "integer",
"oneOf": [
{
"const": 0
},
{
"type": "integer",
"minimum": 2,
"maximum": 10000
}
],
"description": "0 turns this count off. Otherwise 2 to 10000."
}
},
"additionalProperties": false
},
"inbox": {
"type": "object",
"properties": {
"app": {
"type": "integer",
"oneOf": [
{
"const": 0
},
{
"type": "integer",
"minimum": 2,
"maximum": 10000
}
],
"description": "0 turns this count off. Otherwise 2 to 10000."
}
},
"additionalProperties": false
},
"pattern": {
"type": "object",
"properties": {
"app": {
"type": "integer",
"oneOf": [
{
"const": 0
},
{
"type": "integer",
"minimum": 2,
"maximum": 10000
}
],
"description": "0 turns this count off. Otherwise 2 to 10000."
},
"account": {
"type": "integer",
"oneOf": [
{
"const": 0
},
{
"type": "integer",
"minimum": 2,
"maximum": 10000
}
],
"description": "0 turns this count off. Otherwise 2 to 10000."
}
},
"additionalProperties": false
},
"domain": {
"type": "object",
"properties": {
"app": {
"type": "integer",
"oneOf": [
{
"const": 0
},
{
"type": "integer",
"minimum": 2,
"maximum": 10000
}
],
"description": "0 turns this count off. Otherwise 2 to 10000."
},
"account": {
"type": "integer",
"oneOf": [
{
"const": 0
},
{
"type": "integer",
"minimum": 2,
"maximum": 10000
}
],
"description": "0 turns this count off. Otherwise 2 to 10000."
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"checks": {
"type": "object",
"description": "Per check: \"default\" (our points), \"off\", \"challenge\" (always challenge) or \"block\" (always block, for checks that do not already block). A check above your plan keeps its setting.",
"properties": {
"disposable_domain": {
"type": "string",
"enum": [
"default",
"off",
"challenge"
]
},
"stale_list_domain": {
"type": "string",
"enum": [
"default",
"off",
"challenge",
"block"
]
},
"burner_mx": {
"type": "string",
"enum": [
"default",
"off",
"challenge"
]
},
"free_subdomain_mail": {
"type": "string",
"enum": [
"default",
"off",
"challenge",
"block"
]
},
"repeat_inbox": {
"type": "string",
"enum": [
"default",
"off",
"challenge",
"block"
]
},
"relay_service": {
"type": "string",
"enum": [
"default",
"off",
"challenge",
"block"
]
},
"role_account": {
"type": "string",
"enum": [
"default",
"off",
"challenge",
"block"
]
},
"datacenter_ip": {
"type": "string",
"enum": [
"default",
"off",
"challenge",
"block"
]
},
"vpn_ip": {
"type": "string",
"enum": [
"default",
"off",
"challenge",
"block"
]
},
"tor_exit": {
"type": "string",
"enum": [
"default",
"off",
"challenge",
"block"
]
},
"hijacked_network": {
"type": "string",
"enum": [
"default",
"off",
"challenge",
"block"
]
},
"residential_proxy": {
"type": "string",
"enum": [
"default",
"off",
"challenge",
"block"
]
},
"ai_agent": {
"type": "string",
"enum": [
"default",
"off",
"challenge",
"block"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}