Skip to content
Fluxer API

Blocklists

Fluxer has eight blocklists, and each one blocks one kind of value, such as an IP address, a link or a file hash. Each list has three Admin ACLs in the form ban:<list>:<verb>, with hyphens in the list name written as underscores. For example, url-domain uses ban:url_domain:check. You need check to read a list, add to add or update entries and remove to remove them.

Fluxer normalizes each value when you add or check it and stores the normalized form. The url, url-domain, file-sha and avatar-hash lists are content blocklists, and each of their entries has a category and a severity.

ValueDescription
ipIPv4 addresses, IPv6 addresses and CIDR ranges denied service
emailEmail addresses, or @example.com for a domain and its subdomains, that can't be used to sign up or be set on an account
phrase1Phrases blocked from content
urlAbsolute http and https URLs blocked from being posted
url-domainDomains or domain patterns blocked from being linked
file-shaSHA-256 hashes of files blocked from upload
avatar-hash8-character avatar hashes blocked from being set, with any a_ prefix stripped
profile-substring1Substrings blocked from one profile field

1 Matching ignores case, Unicode look-alike forms, and whitespace, punctuation or invisible characters placed between letters

A permanent suspension or an account deletion for a rule violation can block the addresses the account used in the last 30 days, through block_networks on Suspend user and Schedule user deletion. Those ip entries belong to the enforcement decision and expire after 90 days unless the request sets another length.

A decision takes over a plain entry that has an expiry and keeps the later of the two expiries, so ending the decision also removes that block. Add it again if you still want it. A permanent plain entry or another decision's entry is left as it is, and the request lists the address in skipped_ips as already_blocked.

Ending the decision or executing the account's deletion removes its entries.

A url-domain value whose leftmost label has * is a pattern. Each * matches any run of characters in that one label. For example *shop*.example.com matches shop.example.com and my-shop-2.example.com but not example.com. With match_subdomains true, a pattern or plain domain also matches every subdomain.

Fluxer refuses a pattern with 400 INVALID_FORM_BODY when * is outside the leftmost label, when that label has characters other than a-z, 0-9, - and *, or when it has more than 3 * or fewer than 3 other characters. It also refuses a pattern when the part after the leftmost label isn't a valid domain or is a public suffix such as com or co.uk.

A category says where an entry came from. The values below are the ones Fluxer uses, but category accepts any string.

ValueDescription
manualAdded by an Admin
urlhausImported from URLhaus
phishtankImported from PhishTank
google_safe_browsingImported from Google Safe Browsing
malware_bazaarImported from MalwareBazaar
ncmecImported from an NCMEC hash set
gifctImported from a GIFCT hash set
stop_nciiImported from a StopNCII hash set

Severity is only a label for moderators, and Fluxer blocks every matching entry, even one with severity 0.

ValueNameDescription
0ALLOWContent to allow
1WARNContent to warn about
2BLOCKContent to refuse
3BLOCK_AND_REPORTContent to refuse and report
ValueDescription
usernameThe account username
global_nameThe account display name
nicknameA guild nickname
bioThe profile bio
pronounsThe profile pronouns

Describes one blocklist and the fields it accepts, and List blocklists returns one for each list. Check fields and the supports_ flags before you write to a list.

FieldTypeDescription
list_typestringThe blocklist type
descriptionstringA summary of what the list matches
value_fieldstringThe body field that has the value when adding
fieldsarray[string]The other body fields the list accepts
scopedbooleanWhether every operation needs a scope, which is true only for profile-substring
supports_bulk_createbooleanWhether Bulk add blocklist entries works on the list
supports_bulk_deletebooleanWhether Bulk remove blocklist entries works on the list
supports_updatebooleanWhether Update blocklist entry works on the list

An entry stored in a blocklist. Every field is present, and a field the list doesn't use is null.

FieldTypeDescription
list_typestringThe blocklist type
valuestringThe normalized value, to send as entry_value or after (1-2048 characters)
scope?stringThe profile substring scope
category?stringThe content blocklist category
severity?integerThe content blocklist severity
source_url?stringThe feed or evidence URL
notes?stringThe internal note
content_type?stringThe media type hint of a file-sha entry
match_subdomains?booleanWhether a url-domain entry also covers subdomains
reason1?stringThe reason stored on an ip entry
expires_at?ISO8601 timestampWhen an ip entry expires
created_at?ISO8601 timestampWhen the entry was added
created_by_user_id?snowflakeThe Admin who added the entry

1 platform_admin_enforcement for an entry added through these routes, or enforcement_decision for one an enforcement decision added

{
"list_type": "url-domain",
"value": "malicious.example.com",
"scope": null,
"category": "urlhaus",
"severity": 2,
"source_url": "https://urlhaus.example.com/entry/912",
"notes": null,
"content_type": null,
"match_subdomains": true,
"reason": null,
"expires_at": null,
"created_at": "2026-01-22T07:41:19.003Z",
"created_by_user_id": "1483920011884392448"
}

What Check blocklist entry returns for one value.

FieldTypeDescription
bannedbooleanWhether the list blocks the value
expires_at?ISO8601 timestampWhen the matching ip block expires, or null when it is permanent
decision_id?snowflakeThe enforcement decision the matching ip block belongs to

The body of Add blocklist entry has the value field for its list_type and any additional fields that list accepts.

BlocklistFieldAccepted value
ipipIPv4 address, IPv6 address or CIDR range (1-45 characters)
emailemailEmail address or @domain (1-254 characters)
phrasephrasePhrase (1-500 characters)
urlurlAbsolute http or https URL (1-2048 characters)
url-domaindomainDomain or domain pattern (1-253 characters)
file-shasha256_hexExactly 64 hexadecimal characters
avatar-hashhashesArray of hashes matching ^(a_)?[0-9a-fA-F]{8}$ (1-1000 items)
profile-substringsubstringsArray of substrings (1-1000 items of 1-500 characters)
FieldTypeDescription
scope?1stringThe profile substring scope
category?2stringThe content blocklist category (1-64 characters, default manual)
severity?2integerThe content blocklist severity (0-3, default 2)
match_subdomains?booleanWhether a url-domain entry also covers subdomains (default true)
content_type?stringThe media type hint of a file-sha entry (1-128 characters)
source_url?2stringThe feed or evidence URL (1-2048 characters)
reason?stringThe reason for avatar-hash and profile-substring, kept in the audit entry (1-1024 characters)
notes?stringThe internal note, for every list but ip, email and phrase (1-1024 characters)
duration_hours?integerHours until an ip entry expires, with 0 for permanent (0-8760, default 0)

1 Required for profile-substring

2 Only for content blocklists

GET/v1/admin/blocklistsAudit reason

Returns a blocklist object for each blocklist. You need the check permission for at least one list.

FieldTypeDescription
itemsarray[blocklist object]All eight blocklists
StatusBodyCondition
200response bodyThe catalog was returned

The rate limit is 60 requests per minute, on the admin:ban:operation bucket.

GET/v1/admin/blocklists/{list_type}/entriesAudit reason

Returns a page of blocklist entry objects ordered by value. You need the list's check permission.

FieldTypeDescription
limit?integerMaximum entries to return (1-200, default 50)
after?stringReturn entries after this value (1-2048 characters)
scope?1stringThe profile substring scope to list

1 Required for profile-substring and refused with 400 INVALID_FORM_BODY on every other list

FieldTypeDescription
itemsarray[blocklist entry object]The entries in this page
has_morebooleanWhether another page exists
next_after?stringThe value to send as after for the next page, or null on the last page
StatusBodyCondition
200response bodyThe page was returned

The rate limit is 60 requests per minute, on the admin:ban:operation bucket.

POST/v1/admin/blocklists/{list_type}/entriesAudit reason

Adds a value to the list, or up to 1000 values for avatar-hash and profile-substring. You need the list's add permission.

The body is one blocklist entry creation object.

StatusBodyCondition
204emptyThe values were written
400error responseIP_BAN_DECLINED when the address is on the instance exemption list
409error responseIP_BAN_LINKED_TO_DECISION with decision_id when the address belongs to an enforcement decision

The rate limit is 60 requests per minute, on the admin:ban:operation bucket.

PUT/v1/admin/blocklists/{list_type}/entriesAudit reason

Starts a background job that adds up to 10000 hashes to the file-sha list with category manual and severity 2, and returns its ID for Get job. You need ban:file_sha:add. Every other list returns 400 INVALID_FORM_BODY.

FieldTypeDescription
sha256_listarray[string]The SHA-256 hashes to add (1-10000 items of exactly 64 characters)
FieldTypeDescription
job_idsnowflakeThe ID of the job
StatusBodyCondition
200response bodyThe job was queued

The rate limit is 60 requests per minute, on the admin:ban:operation bucket.

DELETE/v1/admin/blocklists/{list_type}/entriesAudit reason

Removes up to 1000 values from the avatar-hash or profile-substring list. You need the list's remove permission. Every other list returns 400 INVALID_FORM_BODY.

FieldTypeDescription
hashes?1array[string]Avatar hashes to remove (1-1000 items matching ^(a_)?[0-9a-fA-F]{8}$)
scope?2stringThe profile substring scope
substrings?2array[string]Substrings to remove (1-1000 items of 1-500 characters)
reason?stringIgnored
notes?stringIgnored

1 Required for avatar-hash

2 Required for profile-substring

StatusBodyCondition
204emptyThe values were removed, or had no entry

The rate limit is 60 requests per minute, on the admin:ban:operation bucket.

GET/v1/admin/blocklists/{list_type}/entries/{entry_value}Audit reason

Returns a blocklist check object saying whether the list blocks a value. You need the list's check permission. Percent-encode entry_value.

A value can be blocked without an entry of its own when an ip address is inside a stored CIDR range or a url-domain hostname or URL matches a parent domain or a pattern. The url check doesn't look at the url-domain list.

FieldTypeDescription
scope?1stringThe profile substring scope to check

1 Required for profile-substring and refused with 400 INVALID_FORM_BODY on every other list

StatusBodyCondition
200blocklist check objectThe value was checked

The rate limit is 60 requests per minute, on the admin:ban:operation bucket.

PATCH/v1/admin/blocklists/{list_type}/entries/{entry_value}Audit reason

Rewrites the fields of one entry, or creates it when it doesn't exist. You need the list's add permission. The ip, email and phrase lists return 400 INVALID_FORM_BODY.

FieldTypeDescription
scope?1stringThe profile substring scope
category?stringThe content blocklist category (1-64 characters, default manual)
severity?integerThe content blocklist severity (0-3, default 2)
match_subdomains?booleanWhether a url-domain entry also covers subdomains (default true)
content_type?stringThe media type hint of a file-sha entry (1-128 characters)
source_url?stringThe feed or evidence URL (1-2048 characters)
reason?stringThe reason, kept in the audit entry (1-1024 characters)
notes?stringThe internal note (1-1024 characters)

1 Required for profile-substring

StatusBodyCondition
204emptyThe entry was written

The rate limit is 60 requests per minute, on the admin:ban:operation bucket.

DELETE/v1/admin/blocklists/{list_type}/entries/{entry_value}Audit reason

Removes one entry. You need the list's remove permission. Percent-encode entry_value and send the value as the entry stores it. An address inside a stored CIDR range has no entry of its own, and you unblock it by removing the range.

FieldTypeDescription
scope?1stringThe profile substring scope of the entry

1 Required for profile-substring and refused with 400 INVALID_FORM_BODY on every other list

StatusBodyCondition
204emptyThe entry was removed, or there was none
409error responseIP_BAN_LINKED_TO_DECISION with decision_id when the address belongs to an enforcement decision

The rate limit is 60 requests per minute, on the admin:ban:operation bucket.

POST/v1/admin/users/{user_id}/avatar-blockAudit reason

Adds the user's current avatar hash to the avatar-hash list and returns it. You need ban:avatar_hash:add. The user keeps the avatar until you clear it with Clear user profile fields. No user can set that image again while the hash is on the list.

FieldTypeDescription
reason?stringThe reason, kept in the audit entry (1-1024 characters)
notes?stringThe internal note, which defaults to a note with the user ID (1-1024 characters)
FieldTypeDescription
hash_shortstringThe stored 8-character avatar hash
StatusBodyCondition
200response bodyThe hash was added
404error responseUNKNOWN_USER when the account doesn't exist, or NOT_FOUND when it has no avatar

The rate limit is 60 requests per minute, on the admin:ban:operation bucket.