Skip to content
Fluxer API

Reports

A report tells the instance's moderators that a message, a user profile or a guild breaks the rules. A signed-in user reports a message or a profile by answering a report flow, and anyone with a verified email address can file a Digital Services Act notice without an account. Moderators work with stored reports through the Admin Reports API.

A Digital Services Act notice takes three calls, Send DSA report email, Verify DSA report email and Create DSA report, and the reporter gets a receipt email with the report ID when the notice is filed.

Fluxer keeps a copy of the reported content and profile when a report is filed, and editing or deleting the content afterwards doesn't change it.

A report flow is the set of screens a reporter answers before a report is filed. Get report flow returns every screen of one flow, already translated, and a client renders the flow from that response.

Screen kindField that is setWhat the reporter does
ChoiceoptionsPicks one option
ChecklistchecklistTicks at least min_checked items and continues
Infonext_screen_idReads the text and continues

The reporter starts at start_screen_id and follows each outcome until one has the type submit, and this path is the walk. Each screen on the walk adds one step to the submission, and the report is filed under the reason of the final submit outcome. An end outcome finishes the walk without a report.

revision_hash identifies the structure of one flow variant and changes whenever a screen, option, item or outcome changes. A submission sends back the hash of the flow the reporter answered.

WalkHashResult
ValidCurrent or outdatedThe report is filed
InvalidCurrent400 INVALID_REPORT_FLOW_ANSWERS with step_index
InvalidOutdated409 REPORT_FLOW_OUTDATED, and the client fetches the flow again and restarts the walk
FieldTypeDescription
target_typestringReport flow target type
surfacestringReport flow surface
revision_hashstringThe revision hash of this variant (16 hexadecimal characters)
localestringThe locale the copy was rendered in
start_screen_idstringThe ID of the screen a walk starts on
guidelines_url?stringThe instance's community guidelines page, or null when the instance has none
screensarray[report flow screen object]Every screen of the variant
noticesarray[report flow notice object]Every notice an end outcome lists
{
"target_type": "user",
"surface": "dsa",
"revision_hash": "9c41d2a07e5b18f3",
"locale": "en-US",
"start_screen_id": "profile_parts",
"guidelines_url": "https://example.com/guidelines",
"screens": [
{
"id": "profile_parts",
"title": "Which parts of their profile are a problem?",
"subtitle": "Pick as many as you need.",
"urgent": false,
"options": [],
"options_heading": null,
"checklist": {
"items": [
{"id": "photo", "label": "Pictures", "description": "What they use as avatar and banner"},
{"id": "name", "label": "Names", "description": "Username, display name or community nickname"}
],
"min_checked": 1,
"outcome": {"type": "screen", "screen_id": "root_user", "reason": null, "notice_id": null, "url": null}
},
"next_screen_id": null
}
],
"notices": []
}
FieldTypeDescription
idstringThe screen ID, unique within the flow
titlestringThe question or heading
subtitle?stringText shown under the title
urgentbooleanWhether the screen covers threats, self-harm, a risk to a minor or another serious harm, and needs an urgency notice
optionsarray[report flow option object]The options in display order, empty on a checklist screen
options_heading?stringA heading shown above the options
checklist?report flow checklist objectThe checklist, set only on a checklist screen
next_screen_id?stringThe screen the Next button leads to, set only on an info screen
FieldTypeDescription
idstringThe option ID, unique within its screen
labelstringThe option text
outcomereport flow outcome objectWhat choosing the option does

Every field is present, and the ones that don't apply to type are null.

FieldTypeDescription
typestringReport flow outcome type
screen_id?stringThe next screen when type is screen
reason?stringThe report reason when type is submit
notice_id?stringThe notice to show when type is end, or null for the thank-you screen
url?stringThe page to open when type is link
FieldTypeDescription
itemsarray[report flow checklist item object]The items in display order
min_checkedintegerThe fewest items the reporter must tick
outcomereport flow outcome objectWhere the screen leads, a screen or submit outcome
FieldTypeDescription
idstringThe item ID, unique within its checklist
labelstringThe item text
description?stringA second line shown under the label

A notice says why a walk ended without a report.

FieldTypeDescription
idstringThe notice ID
titlestringThe notice heading
bodystringThe notice text

A step is one answered screen in a submission. A choice screen's step sends option_id, a checklist screen's step sends item_ids and an info screen's step sends neither.

FieldTypeDescription
screen_idstringThe ID of the screen (1-48 characters)
option_id?stringThe ID of the chosen option (1-48 characters)
item_ids?array[string]The IDs of the ticked items (1-32 IDs of 1-48 characters)
FieldTypeDescription
report_idsnowflakeThe ID of the report
statusstringReport status, always pending on a new report
reported_atISO8601 timestampWhen the report was filed
FieldTypeDescription
okbooleanAlways true
FieldTypeDescription
ticketstringThe credential for Create DSA report, valid for one hour
ValueDescription
pendingNo moderator has resolved the report
resolvedA moderator closed the report
unknownA status this API version doesn't know
ValueDescription
messageA message
userA user profile
guildA guild, on the dsa surface only
ValueDescription
in_appThe flow a signed-in client shows (the default)
dsaThe flow the public Digital Services Act form shows
ValueDescription
screenGo to the screen in screen_id
submitShow a summary, then file a report under reason
endFinish without a report and show the notice in notice_id, or a thank-you screen
linkOpen url and stay on the current screen

A report filed through a flow stores one of these reasons. Each reason maps to a category for each target type, and List report reasons returns that mapping. Handle a reason value you don't know, because new reasons can appear.

ValueDescription
spamSpam
fake_accountFake or deceptive account
platform_abuseScraping, automation or other platform abuse
account_tradingBuying or selling accounts, logins or card details
metric_manipulationFaked member or reaction counts
harassmentHarassment or bullying
unwanted_contactStalking or unwanted contact
raidRaid or coordinated attack
false_claims_about_personFalse claims used to target a person
hate_slursSlurs, hateful symbols or stereotypes
hate_dehumanizingDehumanizing a group
hate_incitementCalls for violence or exclusion against a group
atrocity_denialGenocide or atrocity denial or celebration
lgbtq_targetingMisgendering, deadnaming, outing or identity denial
conversion_therapyPromoting conversion therapy
hate_otherOther attacks on people for who they are
violent_threatThreat of violence
violence_incitementEncouraging violence or instructions to harm
violence_glorificationGlorifying real-world violence
graphic_violenceReal violence shown to shock
terrorism_extremismTerrorism or violent extremism
harmful_false_claimsFalse claims likely to cause serious harm
deceptive_synthetic_mediaFake or AI media presented as real
sexual_unwantedSexual images or messages nobody asked for
adult_content_unmarkedAdult content outside an 18+ space
intimate_image_abuseIntimate images shared without consent
sexual_exploitationSexual exploitation, coercion or trafficking
minor_fictional_sexualizationSexualized fictional child
minor_sexualizationSexual comments about minors
minor_sexual_contactFlirting with or sexually messaging a minor
minor_sexual_contentA minor sharing sexual content themselves
csamChild sexual abuse material
minor_groomingGrooming a minor
minor_contactPredatory contact with a minor
minor_in_adult_spaceA minor in an 18+ space
minor_dating_communityCommunity for dating between minors
doxxingPrivate information shared without consent
underageUnder the minimum age
wellbeing_concernWorried about someone's safety
self_harm_promotionEncouraging self-harm or sharing methods
suicide_promotionEncouraging suicide
eating_disorder_promotionEncouraging disordered eating
self_harm_graphicGraphic self-harm images
self_harm_pressurePressuring someone to harm themselves
impersonation_staffPretending to be staff or support
impersonation_personImpersonating a person
impersonation_public_figureImpersonating a well-known person
impersonation_organizationImpersonating a company, brand or group
fraudConning people out of money or accounts
illegal_goodsDrug, weapon or other illegal sales
illegal_activityOther illegal activity
malware_phishingPhishing, malware or hacking attempts
ban_evasionGetting around a ban
permits_violationsCommunity allows serious rule-breaking
copyrightCopyright or trademark complaint
otherSomething not listed

Every report stores one of these categories.

ValueDescription
harassmentHarassment, bullying or intimidation
hate_speechHatred against protected groups
violent_contentContent showing or promoting violence
extremist_communityA guild promoting extremist or terrorist ideologies
raid_coordinationA guild coordinating attacks on other communities
spamUnsolicited bulk messages or promotional content
spam_accountAn account used for spamming
nsfw_violationAdult content outside age-restricted channels
inappropriate_profileInappropriate or offensive profile content
illegal_activityContent promoting or facilitating illegal activities
doxxingContent revealing private personal information
self_harmContent promoting self-harm or suicide
child_safetyContent that endangers minors or shows child abuse
underage_userSomeone who appears to be under the minimum age
malicious_linksLinks to malware, phishing or other malicious sites
malware_distributionDistribution of malware
impersonationFalsely claiming to be another person or entity
otherAnything the other categories don't cover
ValueDescription
ATAustria
BEBelgium
BGBulgaria
HRCroatia
CYCyprus
CZCzechia
DKDenmark
EEEstonia
FIFinland
FRFrance
DEGermany
GRGreece
HUHungary
IEIreland
ITItaly
LVLatvia
LTLithuania
LULuxembourg
MTMalta
NLNetherlands
PLPoland
PTPortugal
RORomania
SKSlovakia
SISlovenia
ESSpain
SESweden
GET/v1/reports/flows/{target_type}Unauthenticated

Returns the report flow object for one target type and surface, translated into one locale.

FieldTypeDescription
surface?stringReport flow surface (default in_app)
locale?stringThe language tag to translate into (1-35 characters), defaulting to the request locale
StatusBodyCondition
200report flow objectThe flow was returned
400error responseINVALID_FORM_BODY for an unknown target type or surface, or guild outside the dsa surface

The rate limit is 40 requests per 10 seconds, on the report:list bucket.

POST/v1/reports/flows/message/submissions

Files a report about a message from the reporter's answers to the in_app message flow and returns a report object. It needs a user session token, and the reporter must be able to read the message.

FieldTypeDescription
channel_idsnowflakeThe ID of the channel the message is in
message_idsnowflakeThe ID of the reported message
revision_hashstringThe revision hash of the flow the reporter answered (1-64 characters)
stepsarray[report flow step object]The answered screens in walk order (1-16 steps)
locale?stringThe language tag the reporter saw the flow in (1-35 characters)
StatusBodyCondition
200report objectThe report was filed
400error responseINVALID_REPORT_FLOW_ANSWERS when the answers don't fit the current flow
400error responseUNCLAIMED_ACCOUNT_CANNOT_SUBMIT_REPORTS for an unclaimed account while interaction_tier is legacy
400error responseCANNOT_REPORT_OWN_MESSAGE when the reporter wrote the message
403error responseREPORT_EMAIL_VERIFICATION_REQUIRED for an unverified email while interaction_tier is legacy
403error responseREPORT_BANNED when the account is banned from reporting
403error responseMISSING_PERMISSIONS when the reporter can't view the channel
404error responseUNKNOWN_CHANNEL or UNKNOWN_MESSAGE when the reporter can't see the channel or message
404error responseUNKNOWN_USER when the author's account no longer exists
409error responseREPORT_FLOW_OUTDATED when the answers came from an outdated flow
409error responseCONFLICT when the reporter reported this message in the last 365 days

The rate limit is 10 requests per hour, on the report:create bucket. One reporter can file at most 5 reports an hour across the report routes, and Rate limits lists the lower limits for one channel, guild or message. When interaction_tier is enforced, an account that isn't verified can still report, up to 5 reports a day for the account and 10 a day from one IP address.

POST/v1/reports/flows/user/submissions

Files a report about a user's profile from the reporter's answers to the in_app user flow and returns a report object. It needs a user session token.

FieldTypeDescription
user_idsnowflakeThe ID of the reported user
guild_id?snowflakeThe ID of the guild the reporter saw the profile in
revision_hashstringThe revision hash of the flow the reporter answered (1-64 characters)
stepsarray[report flow step object]The answered screens in walk order (1-16 steps)
locale?stringThe language tag the reporter saw the flow in (1-35 characters)
StatusBodyCondition
200report objectThe report was filed
400error responseINVALID_REPORT_FLOW_ANSWERS when the answers don't fit the current flow
400error responseUNCLAIMED_ACCOUNT_CANNOT_SUBMIT_REPORTS for an unclaimed account while interaction_tier is legacy
400error responseCANNOT_REPORT_YOURSELF when the report is about the reporter's own account
403error responseREPORT_EMAIL_VERIFICATION_REQUIRED for an unverified email while interaction_tier is legacy
403error responseREPORT_BANNED when the account is banned from reporting
404error responseUNKNOWN_USER when user_id isn't an account, or is the system account
404error responseUNKNOWN_GUILD when guild_id isn't a guild the reporter is in
409error responseREPORT_FLOW_OUTDATED when the answers came from an outdated flow
409error responseCONFLICT when the reporter reported this user in the last 24 hours

The rate limit is 10 requests per hour, on the report:create bucket. One reporter can file at most 5 reports an hour across the report routes. When interaction_tier is enforced, an account that isn't verified can still report, up to 5 reports a day for the account and 10 a day from one IP address.

POST/v1/reports/dsa/email/sendUnauthenticated

Sends a Digital Services Act verification code to an email address and returns a success object. The code expires after 10 minutes, and one address can get one code per minute and 3 per hour.

FieldTypeDescription
emailstringThe address that gets the code (1-254 characters)
StatusBodyCondition
200success objectThe code was sent
400error responseEMAIL_UNAVAILABLE_ON_INSTANCE when the instance uses username sign-in
400error responseINVALID_FORM_BODY when the address is invalid or its domain can't receive mail
503error responseSERVICE_UNAVAILABLE when the email couldn't be sent

The rate limit is 5 requests per hour, on the dsa:report:email:send bucket.

POST/v1/reports/dsa/email/verifyUnauthenticated

Exchanges a verification code for a ticket object. Each address gets 5 attempts in 10 minutes, and a sixth attempt deletes the code until you send a new one.

FieldTypeDescription
emailstringThe address that got the code (1-254 characters)
codestringThe code in XXXX-XXXX form
StatusBodyCondition
200ticket objectThe code matched
400error responseINVALID_DSA_VERIFICATION_CODE when the code is wrong or expired, or attempts ran out
400error responseEMAIL_UNAVAILABLE_ON_INSTANCE when the instance uses username sign-in

The rate limit is 10 requests per hour, on the dsa:report:email:verify bucket.

POST/v1/reports/dsaUnauthenticated

Files a Digital Services Act notice about a message, user or guild and returns a report object. This is the only way to report a guild. Walk the flow with surface=dsa and send the fields for your report_type. The ticket is used up only when the notice is filed.

FieldTypeDescription
ticketstringThe ticket from Verify DSA report email (1-128 characters)
report_typestringThe target type of the notice
revision_hashstringThe revision hash of the dsa flow the reporter answered (1-64 characters)
stepsarray[report flow step object]The answered screens in walk order (1-16 steps)
additional_infostringThe reporter's explanation of the problem (1-1000 characters)
good_faith_confirmedbooleanMust be true, confirming the notice is accurate and complete
reporter_full_legal_name?1stringThe reporter's full legal name (1-160 characters)
reporter_country_of_residencestringThe reporter's EU country code
locale?stringThe language tag the reporter saw the flow in (1-35 characters)

1 Required unless the walk ends in the child_safety category

FieldTypeDescription
message_link1stringThe link to the reported message (1-2048 characters)
reported_user_tag?stringThe author's tag in username#1234 form, or the username (1-37 characters)

1 An absolute URL with the path /channels/{guild_id}/{channel_id}/{message_id}, with @me in place of the guild ID for a direct message

FieldTypeDescription
user_id?1snowflakeThe ID of the reported user
user_tag?1stringThe user's tag in username#1234 form, or the username (1-37 characters)

1 Send at least one, and when you send both they must be the same account

FieldTypeDescription
guild_idsnowflakeThe ID of the reported guild
invite_code?stringAn invite code or URL for the guild (1-64 characters)
StatusBodyCondition
200report objectThe notice was filed
400error responseINVALID_DSA_TICKET when the ticket is unknown or expired
400error responseINVALID_DSA_REPORT_TARGET when the user ID and tag point to different accounts, or the invite isn't for guild_id
400error responseINVALID_REPORT_FLOW_ANSWERS when the answers don't fit the current dsa flow
404error responseUNKNOWN_MESSAGE when the message link or author tag doesn't match a message
404error responseUNKNOWN_USER, UNKNOWN_GUILD or UNKNOWN_INVITE when the reported user, guild or invite doesn't exist
409error responseREPORT_FLOW_OUTDATED when the answers came from an outdated flow

The rate limit is 5 requests per hour, on the dsa:report:create bucket.