- Assess an event POST
- Report an assessment's outcome POST
- Add an allow or block list entry POST
- Create a rule POST
- Remove a list entry DELETE
- Delete a rule DELETE
- Forget a user DELETE
- Retrieve an assessment GET
- Retrieve a list entry GET
- Retrieve a rule GET
- Retrieve the risk settings GET
- List assessments GET
- List allow and block list entries GET
- List rules GET
- Update a rule PATCH
- Update the risk settings PATCH
Create a rule
Rules decide after the allow and block lists and before the score thresholds: the first enabled rule (lowest position, then oldest) whose conditions match the event sets the decision to its action. Conditions test the fields listed in the docs; a field without a value (no IP, no email) never matches. At most 50 rules per environment.
bearerAuthAuthorizationBearer <token>A secret API key from the dashboard: coss_live_… for production environments, coss_test_… for sandbox environments.
Coss-Version?"2026-10-10"The API version (a date) to use for this request. Defaults to your organization's version, pinned to the latest one when it first used the API and upgraded from the dashboard. The SDK always sends the version it was built for.
"2026-10-10"application/json- body
- body
- …
name*string1 <= length <= 100enabled?booleanposition?integerDefault 0.
0 <= value <= 10000events?array<>items <= 5match?stringDefault all.
"all""any"conditions*array<>1 <= items <= 20action*RiskDecisionallow: go ahead. review: suspicious; let it through with limits, or hold it for a person. block: refuse it.
"allow""review""block"The new rule.
application/json- response
- response
- …
object*"risk_rule""risk_rule"id*stringname*stringenabled*booleanposition*integerRules are tried in ascending order.
events*array<>Events it applies to; empty: every event.
match*stringall: every condition must hold. any: one is enough.
"all""any"conditions*array<>action*RiskDecisionallow: go ahead. review: suspicious; let it through with limits, or hold it for a person. block: refuse it.
"allow""review""block"created_at*stringdate-timeupdated_at*stringdate-timeimport { Coss } from "coss";const coss = new Coss({ apiKey: process.env.COSS_API_KEY, baseUrl: "https://api.coss.com",});const { data, error } = await coss.risk.rules.create({ name: "Disposable email from a data center", events: [ "signup", ], conditions: [ { field: "email.disposable", operator: "is", value: true, }, { field: "ip.hosting", operator: "is", value: true, }, ], action: "block",});{ "object": "risk_rule", "id": "rskrule_01k7c8m4q2f3e9v6t5r1n0p8yz", "name": "Disposable email from a data center", "enabled": true, "position": 0, "events": [ "signup" ], "match": "all", "conditions": [ { "field": "email.disposable", "operator": "is", "value": true }, { "field": "ip.hosting", "operator": "is", "value": true } ], "action": "block", "created_at": "2026-01-15T09:30:00.000Z", "updated_at": "2026-01-15T09:30:00.000Z"}