Stop a wave of abusive sign-ups
See new accounts that share an email domain, network or server name, block what they share, and act on every matching account at once.
When a script signs up hundreds of accounts on your storefront, they share something: an email domain, the network they came from, or the name they give their servers. We look for that and raise it to your team as a pattern. From a pattern your team blocks what the accounts share, so new ones stop, and acts on every account that matches it in one bulk run.
Before you begin
Section titled Before you begin| Task | Lowest role |
|---|---|
| Read patterns, rules and bulk runs | Tier 3 support |
| Suspend or unsuspend the orders of every matching account | Tier 3 support |
| Block or dismiss a pattern, add or remove a rule | Org admin |
| Pause, ban or end the orders of every matching account, or suspend them with a deletion date | Org admin, after the step-up check |
An org admin passes the step-up check within the 10 minutes before a run that ends orders or accounts (Sign in to the staff console).
How patterns work
Section titled How patterns workEvery 5 minutes we count the accounts that signed up, and the free servers ordered, in the last hour. A value opens a pattern when enough different accounts share it:
| What they share | Opens a pattern at |
|---|---|
| The email domain | 20 accounts |
| The network they signed up from (IPv4 /24, IPv6 /48) | 10 accounts |
| The network they ordered free servers from | 10 accounts |
| The server name, with trailing numbers left out | 10 accounts |
We leave out the large mail providers, such as gmail.com and outlook.com, and a domain you allowed with a rule. A pattern with nothing new for 24 hours reads resolved, and so does a blocked one once its block has ended.
When a pattern opens on an email domain that none of your accounts older than 30 days uses, counting its subdomains, we block the domain for 24 hours at once and the pattern reads blocked. New sign-ups on it are refused while you decide (Blocked email domains). If a new wave arrives on the domain after that block has ended, we block it again for 24 hours. Each block we make is in your audit log as abuse.pattern.block, made by the system.
Find the accounts behind a pattern
Section titled Find the accounts behind a pattern- Open
/staff/abuse, which is Abuse under People in the sidebar. The staff home page also lists open patterns and the domains we blocked automatically under Patterns to review, with when each automatic block lifts. - The Patterns tab lists open patterns. Each row shows the shared value and its kind, how many accounts shared it in the last hour and in all, and when it was first and last seen. Choose another status (blocked, dismissed, resolved or all) or one kind to narrow the list.
- From a pattern's menu, choose View accounts to open the customer list filtered to its accounts, or View servers for their servers in every status.
Block or dismiss a pattern
Section titled Block or dismiss a patternFrom a pattern's menu, an admin chooses Block for 24 hours, Block with no end, or Dismiss for 7 days, and confirms. A block takes a reason if you want one, kept on the rule for the next person. Once a block has ended, the pattern says so and offers the block again.
- Blocking a pattern writes the rule its kind needs: the email domain, the network, or the server name. The API takes any number of hours, or no end.
- Dismissing a pattern closes it for 7 days, however many accounts share the value; the API takes 1 to 90 days. A rule it already has stays.
A blocked email domain refuses sign-ups and free orders. A blocked network refuses free orders from it, and a blocked server name refuses free orders that use it. Accounts that already exist keep working until you act on them.
Rules
Section titled RulesA rule blocks or allows one email domain, network or server name on your storefront. The Rules tab lists your brand's rules and Coritan's, which apply to every storefront; you can read Coritan's but not remove them.
To add one, an admin chooses Add rule on the Rules tab and fills in:
- The kind: an email domain such as
whateverbro.com, a network such as203.0.113.0/24, or a server name. - The action. Block refuses the value. Allow keeps a domain out of patterns and out of automatic blocks, and makes a network count as a home connection. Count as VPN or hosting, for a network only, means a free order from it needs a qualifying Discord link (How free servers work).
- How long it lasts: 24 hours, 7 days, 30 days or no end.
- A reason, if you want one.
A network rule names at most a /8 (IPv4) or a /16 (IPv6). Remove, in a rule's menu, takes one of your brand's rules away.
Act on every matching account
Section titled Act on every matching accountA bulk run applies one action to every account or server a filter matches, up to 20,000 at a time, and works through them in the background, 100 at a time. It takes the same filters as the customer list and the server list, and a pattern as a filter. For an email-domain pattern that is the accounts on the domain and its subdomains that signed up no more than 30 days before the pattern was first seen, so long-standing customers on the same domain are left out. For the other kinds it is the accounts that made the pattern.
- Open the accounts: View accounts on a pattern, or filter
/staff/customersyourself, for example by email domain and sign-up date. The same steps work on/staff/servers. - Tick the whole page, then choose Select all matching customers in the bar at the bottom. The bar then counts every match. When every match fits on one page, the bar offers no such choice: the action then applies to the ticked accounts at once, without a run.
- Choose the action in the bar. On customers that is Suspend servers, Unsuspend servers, Terminate servers, Pause accounts or Ban accounts. Pausing suspends the account and every order on it and ends its sessions; unsuspending the account on its page brings it back. Banning ends its sessions and ends every order it has.
- In the dialog, check the action and enter a reason. Opening a ticket for each customer, and for a termination the cancellation email, are off unless you turn them on. An admin can add a deletion date to a suspension.
- Confirm. To terminate, pause or ban, type the phrase the dialog shows, which names the action and the count, such as
pause 9876 customers.
The progress dialog shows how many the run has worked through, applied and skipped. Cancel run stops it before its next 100; what it already did stays done. Every run and its progress stays on the Abuse page's Bulk runs tab.
Through the API:
- Ask how many the filter matches with
POST /staff/abuse/bulk-runs/preview. - Start the run with the same filter, that count as
expected_total, the action and a reason. The actions aresuspendandunsuspend(the orders),terminate(end the orders),pause(suspend the account and its orders, which ends its sessions; unsuspending brings it back) andban(ban the account, which ends its sessions, and end its orders). - Follow its progress with
GET /staff/abuse/bulk-runs/{uuid}, and stop it withPOST /staff/abuse/bulk-runs/{uuid}/cancel. What it already did stays done.
A run opens support tickets and emails customers only when you ask it to. Each member may start 6 runs an hour.
With the API
Section titled With the APIcurl -X POST "https://api.coritan.com/api/v1/orgs/acme/staff/abuse/bulk-runs/preview" \
-H "Authorization: Bearer $STAFF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"target": "customers", "filter": {"email_domain": "whateverbro.com"}}'
The answer holds total. Start the run with it:
curl -X POST "https://api.coritan.com/api/v1/orgs/acme/staff/abuse/bulk-runs" \
-H "Authorization: Bearer $STAFF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"target": "customers", "filter": {"email_domain": "whateverbro.com"}, "expected_total": 9876, "action": "pause", "reason": "Bot sign-ups"}'
GET /staff/abuse/patterns lists patterns, with status set to open, blocked, dismissed, resolved or all. POST /staff/abuse/patterns/{id}/block takes hours (or null for no end), and POST /staff/abuse/patterns/{id}/dismiss takes days. GET, POST and DELETE /staff/abuse/rules list, add and remove rules.
Troubleshooting
Section titled Troubleshooting409withselection_changed- The filter matches a different number of accounts than you sent, usually because more signed up.
totalin the answer is the new count; check it and start the run again. 422withselection_too_large- More than 20,000 match. Narrow the filter, for example by sign-up date.
422withinvalid_filter- A run needs at least one filter that narrows the list, so it never acts on your whole storefront by accident.
allas a status or an audience, and a search of only*, narrow nothing. 403 Ending orders or accounts, or pausing them, needs an org admin- Ask an org admin to start the run.
Related
Section titled RelatedAPI operations on this page
| Method | Path | What it does |
|---|---|---|
GET | /api/v1/orgs/{org_slug}/staff/abuse/bulk-runs | The brand's bulk runs, newest first, as {"runs": [...], "total": N} |
POST | /api/v1/orgs/{org_slug}/staff/abuse/bulk-runs | Start one action over every account or server a filter matches |
POST | /api/v1/orgs/{org_slug}/staff/abuse/bulk-runs/preview | How many accounts or servers a run with this filter would act on |
GET | /api/v1/orgs/{org_slug}/staff/abuse/bulk-runs/{uuid} | One bulk run and its progress |
POST | /api/v1/orgs/{org_slug}/staff/abuse/bulk-runs/{uuid}/cancel | Stop a run that has not finished |
GET | /api/v1/orgs/{org_slug}/staff/abuse/patterns | List the values that many of your new accounts share within an hour |
POST | /api/v1/orgs/{org_slug}/staff/abuse/patterns/{pattern_id}/block | Block a pattern's value for your brand, and mark the pattern blocked |
POST | /api/v1/orgs/{org_slug}/staff/abuse/patterns/{pattern_id}/dismiss | Dismiss a pattern for 1 to 90 days |
GET | /api/v1/orgs/{org_slug}/staff/abuse/rules | List the email domains, networks and server names your brand blocks or allows |
POST | /api/v1/orgs/{org_slug}/staff/abuse/rules | Block or allow an email domain, a network or a server name for your brand |
DELETE | /api/v1/orgs/{org_slug}/staff/abuse/rules/{rule_id} | Delete one of your brand's rules, so the value it matched is let in again |