Skip to content
Fluxer API

Reports

A safety report tells moderators that a message, a user, or a guild broke the rules, and any user account can file one. A Digital Services Act notice needs no account, only a verified email address. The Admin Reports API covers reading, triaging, and closing a stored report.

OperationCredentialTarget
Report messageUser sessionOne message the reporter can read
Report userUser sessionOne account, optionally with a guild for context
Report guildUser sessionOne guild the reporter can reach
Send DSA report emailNoneAn email address to verify
Verify DSA report emailNoneA verification code, exchanged for a ticket
Create DSA reportA ticketA message, user, or guild

Fluxer discards a body member that no schema here defines, so a misspelt member is dropped without an error. A body that is not parseable JSON returns 400 INVALID_FORM_BODY with the validation code INVALID_FORMAT at the body path.

Report message, Report user, and Report guild accept a user session token only. A bot token and an OAuth2 bearer credential are both rejected with 403 ACCESS_DENIED. The account must also be claimed and email-verified. An account holding no password and no SSO identity is rejected with 400 UNCLAIMED_ACCOUNT_CANNOT_SUBMIT_REPORTS, and one whose address is unverified with 403 REPORT_EMAIL_VERIFICATION_REQUIRED. An account with the report ban flag is rejected with 403 REPORT_BANNED.

The three Digital Services Act routes require no credential. Fluxer still resolves a valid credential presented anyway, so the request draws on that account’s rate limit allowance.

Every route bucket is keyed by the authenticated user ID when a credential resolves and by client IP address otherwise. Report creation applies further policy allowances keyed by the reporter.

The instance-wide content filter screens the JSON body of Report message, Report user, Report guild, and Create DSA report before the route runs. A string of at least 3 characters matching the instance phrase blocklist, or a URL matching the instance URL blocklist, is rejected with 403 CONTENT_BLOCKED. The ticket, channel_id, message_id, user_id, and guild_id members are exempt, and so is any value shorter than 3 characters.

Every accepted submission writes one report and returns a report object. Submission emits no Gateway Dispatch.

The receipt Fluxer returns when it records a submission.

FieldTypeDescription
report_idsnowflakeThe snowflake identifying this report
status1stringReport status
reported_at2ISO8601 timestampTime the report row was written

1 Always pending

2 A Digital Services Act notice has its filing time, even when its verification code was issued much earlier

{
"report_id": "1501314428688998182",
"status": "pending",
"reported_at": "2026-08-04T11:22:19.000Z"
}

The fixed acknowledgement returned by Send DSA report email.

FieldTypeDescription
okbooleanAlways true, because a failure is reported as an error status instead
{
"ok": true
}

The single credential Create DSA report accepts. Fluxer binds the ticket to the verified address it was issued for, and that address becomes the reporter identity on the resulting notice.

FieldTypeDescription
ticket1stringThe opaque credential Create DSA report consumes

1 64 lowercase hexadecimal characters encoding 32 random bytes, valid for one hour from verification, and consumed by the first Create DSA report that presents it

{
"ticket": "6b1f0a92c73d4e58a0b1c2d3e4f5061728394a5b6c7d8e9f0a1b2c3d4e5f6071"
}
ValueDescription
pendingThe report has been recorded and no moderator decision exists yet
resolvedA moderator has closed the report
unknownThe stored status is neither of the two values above

Only pending and resolved are ever stored. A client MUST still tolerate a status it does not recognise.

A message report and the message variant of a Digital Services Act notice both draw category from this registry. A value outside it returns 400 INVALID_FORM_BODY.

ValueDescription
harassmentContent that harasses, bullies, or intimidates users
hate_speechContent promoting hatred against protected groups
violent_contentContent depicting or promoting violence
spamUnsolicited bulk messages or promotional content
nsfw_violationAdult content posted outside age-restricted channels
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 depicts child abuse
malicious_linksLinks to malware, phishing, or other malicious sites
impersonationContent falsely claiming to be another person or entity
otherOther violations not covered by specific categories

A user report and the user variant of a Digital Services Act notice both draw category from this registry. A value outside it returns 400 INVALID_FORM_BODY.

ValueDescription
harassmentUser engages in harassment, bullying, or intimidation
hate_speechUser promotes hatred against protected groups
spam_accountAccount used for spamming or bulk messaging
impersonationUser falsely claims to be another person or entity
underage_userUser appears to be under the minimum required age
inappropriate_profileProfile contains inappropriate or offensive content
otherOther violations not covered by specific categories

A guild report and the guild variant of a Digital Services Act notice both draw category from this registry. A value outside it returns 400 INVALID_FORM_BODY.

ValueDescription
harassmentGuild facilitates harassment, bullying, or intimidation
hate_speechGuild promotes hatred against protected groups
extremist_communityGuild promotes extremist or terrorist ideologies
illegal_activityGuild promotes or facilitates illegal activities
child_safetyGuild endangers minors or hosts child abuse content
raid_coordinationGuild coordinates attacks on other communities
spamGuild used for spamming or bulk messaging
malware_distributionGuild distributes malware or malicious software
otherOther violations not covered by specific categories

No instance configuration changes this registry. A value outside it returns 400 INVALID_FORM_BODY.

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
POST/v1/reports/message

Creates and returns a report object for a message the reporter can currently read.

  • The reporter must be able to open the containing channel and read the message.
  • A reporter who authored the message receives 400 CANNOT_REPORT_OWN_MESSAGE.
  • A channel that does not exist and a direct message the reporter is not a recipient of both return 404 UNKNOWN_CHANNEL.
  • A non-member and a member without VIEW_CHANNEL both return 403 MISSING_PERMISSIONS.
  • An age-restricted guild channel returns 403 NSFW_CONTENT_AGE_RESTRICTED for an account that is not age verified.
  • A message not stored under channel_id, a message with no author, and any message a reporter without READ_MESSAGE_HISTORY cannot reach all return 404 UNKNOWN_MESSAGE.
  • An author whose account no longer exists returns 404 UNKNOWN_USER.
FieldTypeDescription
channel_idsnowflakeThe ID of the channel containing the reported message
message_idsnowflakeThe ID of the reported message
categorystringMessage report category
StatusBodyCondition
200report objectReport was created
400error responseThe account is unclaimed and the request returns UNCLAIMED_ACCOUNT_CANNOT_SUBMIT_REPORTS, or the reporter is the message author and the request returns CANNOT_REPORT_OWN_MESSAGE
403error responseA body string is blocked and the request returns CONTENT_BLOCKED
403error responseThe credential is a bot token or OAuth2 bearer and the request returns ACCESS_DENIED
403error responseThe account has an outstanding required action and the request returns ACCOUNT_SUSPICIOUS_ACTIVITY
403error responseIts email is unverified and the request returns REPORT_EMAIL_VERIFICATION_REQUIRED
403error responseThe account is report banned and the request returns REPORT_BANNED
403error responseThe reporter is not a guild member or lacks VIEW_CHANNEL and the request returns MISSING_PERMISSIONS
403error responseThe channel is age restricted and the request returns NSFW_CONTENT_AGE_RESTRICTED
404error responseThe channel, the message, or the message author is not visible to the reporter
4091error responseThe reporter already reported this message, returning CONFLICT

1 The reporter, the channel, and the message form a permanent submission key. A second report of the same message by the same reporter is refused however much time has passed and whichever category it names

The operation writes one report with a frozen evidence snapshot. The snapshot records the reporter’s account ID and email address, the message author’s identity and avatar hash, the channel and guild identity, and the guild and channel NSFW and content warning state.

The snapshot also records a conversation window of up to 25 messages before the reported message, the reported message itself, and up to 25 messages after it. Each context message records its author identity, content, timestamps, type, flags, mentions, embeds, and sticker items, and each attachment is copied byte for byte. A context message whose author no longer exists is dropped from the window, and an attachment whose copy fails is dropped without failing the request. A reporter without READ_MESSAGE_HISTORY receives a window trimmed to the guild’s message history cutoff.

10 requests per hour, on the report:create bucket, which is shared with Report user and Report guild.

Four further allowances apply, each counted over one hour. One reporter creates at most 5 reports across all report types and at most 3 message reports in one channel, and one message receives at most 20 reports across all reporters. When the reported message is in a guild, one reporter creates at most 4 message reports in that guild. A duplicate submission returns 409 CONFLICT before any of the four is consumed.

POST/v1/reports/user

Creates and returns a report object for another user, optionally noting the guild in which the conduct occurred.

  • A reporter naming their own account receives 400 CANNOT_REPORT_YOURSELF.
  • A user_id that resolves to no account returns 404 UNKNOWN_USER.
  • A guild_id that resolves to no guild returns 404 UNKNOWN_GUILD.
FieldTypeDescription
user_idsnowflakeThe ID of the reported user
categorystringUser report category
guild_id?snowflakeThe ID of the guild in which the reported conduct occurred
StatusBodyCondition
200report objectReport was created
400error responseThe account is unclaimed and the request returns UNCLAIMED_ACCOUNT_CANNOT_SUBMIT_REPORTS, or the reporter is the reported user and the request returns CANNOT_REPORT_YOURSELF
403error responseA body string is blocked and the request returns CONTENT_BLOCKED
403error responseThe credential is a bot token or OAuth2 bearer and the request returns ACCESS_DENIED
403error responseThe account has an outstanding required action and the request returns ACCOUNT_SUSPICIOUS_ACTIVITY
403error responseIts email is unverified and the request returns REPORT_EMAIL_VERIFICATION_REQUIRED
403error responseThe account is report banned and the request returns REPORT_BANNED
404error responseThe reported user does not exist and the request returns UNKNOWN_USER
404error responseThe supplied guild_id does not exist and the request returns UNKNOWN_GUILD

The operation writes one report recording the reporter’s account ID and the email address on that account, the reported user’s ID and avatar hash, and, when guild_id is supplied, the guild’s ID, name, icon hash, NSFW flag, and content warning state. No message evidence is captured and no media bytes are copied.

Every accepted request writes a new report, and nothing deduplicates a repeat submission.

10 requests per hour, on the report:create bucket, which is shared with Report message and Report guild.

One reporter creates at most 5 reports each hour across all report types.

POST/v1/reports/guild

Creates and returns a report object for a guild.

  • A guild_id that resolves to no guild returns 404 UNKNOWN_GUILD.
  • The guild owner reporting their own guild returns 400 CANNOT_REPORT_OWN_GUILD.

Fluxer establishes access to the guild in one of three ways, tried in that order. A current member needs nothing further. Any reporter can report a guild with the DISCOVERABLE guild feature. Any other reporter supplies invite_code for an invite pointing at that exact guild. A reporter satisfying none of the three returns 403 CANNOT_REPORT_GUILD.

FieldTypeDescription
guild_idsnowflakeThe ID of the reported guild
categorystringGuild report category
invite_code?1stringInvite code proving access to the guild (1-64 characters)

1 Read only after the member check and the DISCOVERABLE check both fail

This route reads the bare code and accepts no invite URL. A code that resolves to no invite, or to an invite for another guild, returns 403 CANNOT_REPORT_GUILD rather than a 404.

StatusBodyCondition
200report objectReport was created
400error responseThe account is unclaimed and the request returns UNCLAIMED_ACCOUNT_CANNOT_SUBMIT_REPORTS, or the reporter owns the guild and the request returns CANNOT_REPORT_OWN_GUILD
403error responseA body string is blocked and the request returns CONTENT_BLOCKED
403error responseThe credential is a bot token or OAuth2 bearer and the request returns ACCESS_DENIED
403error responseThe account has an outstanding required action and the request returns ACCOUNT_SUSPICIOUS_ACTIVITY
403error responseIts email is unverified and the request returns REPORT_EMAIL_VERIFICATION_REQUIRED
403error responseThe account is report banned and the request returns REPORT_BANNED
403error responseAccess to the guild cannot be established and the request returns CANNOT_REPORT_GUILD
404error responseThe reported guild does not exist and the request returns UNKNOWN_GUILD

The operation writes one report recording the reporter’s account ID and the email address on that account, the guild’s ID, name, and icon hash, the guild’s NSFW flag and content warning state, and the supplied invite code when one was sent. No message evidence is captured and no media bytes are copied.

Every accepted request writes a new report, and nothing deduplicates a repeat submission.

10 requests per hour, on the report:create bucket, which is shared with Report message and Report user.

One reporter creates at most 5 reports each hour across all report types.

POST/v1/reports/dsa/email/sendUnauthenticated

Issues a Digital Services Act verification code for an email address and returns a success object.

The address must be deliverable. A domain publishing no MX record and no A or AAAA record returns 400 INVALID_FORM_BODY with the validation code INVALID_EMAIL_ADDRESS on email. A DNS lookup that fails for a transient reason is treated as deliverable. A domain result is cached for 30 minutes when it resolves and 5 minutes when it does not.

FieldTypeDescription
email1stringThe address that receives the verification code (1-254 characters)

1 Trimmed and lowercased before use, so two spellings that differ only in case address the same verification record

StatusBodyCondition
200success objectThe code was generated and handed to the email provider
400error responseThe address failed validation or its domain publishes no usable mail DNS record, and the request returns INVALID_FORM_BODY

The operation stores one verification record for the normalised address. The record expires 10 minutes after issue. It is keyed by address alone, so sending again for the same address replaces the previous code and restarts the 10 minute window. The code is nine characters in XXXX-XXXX form drawn from uppercase letters and digits.

Fluxer attempts delivery inside the request and discards the outcome. The operation creates no ticket and emits no Gateway Dispatch.

5 requests per hour, on the dsa:report:email:send bucket.

POST/v1/reports/dsa/email/verifyUnauthenticated

Consumes a verification code and returns the ticket object that Create DSA report requires.

FieldTypeDescription
email1stringThe address that received the verification code (1-254 characters)
codestringThe nine-character code in XXXX-XXXX form, using uppercase letters and digits

1 Trimmed and lowercased before the verification record is looked up, exactly as Send DSA report email normalises it

StatusBodyCondition
200ticket objectThe code matched the unexpired verification record for the address
4001error responseThe address or code failed validation, or no unexpired record matches, returning INVALID_DSA_VERIFICATION_CODE

1 An address with no verification record, an expired record, and a wrong code all produce the same error code. A malformed address or code fails schema validation and returns 400 INVALID_FORM_BODY.

The operation deletes the verification record and writes one ticket that expires one hour later. Fluxer deletes the record only on success, so a wrong guess leaves the outstanding code usable until it expires. The operation emits no Gateway Dispatch.

10 requests per hour, on the dsa:report:email:verify bucket.

POST/v1/reports/dsaUnauthenticated

Consumes a ticket, files the notice, and returns a report object.

report_type selects which extra fields the body has, and category comes from the registry that matches it.

A ticket that is unknown or past its one hour expiry returns 400 INVALID_DSA_TICKET. The ticket is consumed when the notice is written, so a notice that is rejected or rate limited leaves it usable. Nothing deduplicates a repeat notice.

FieldTypeDescription
ticketstringThe ticket returned by Verify DSA report email (1-128 characters)
report_typestringThe discriminator selecting the variant, one of message, user, or guild
categorystringThe category matching report_type, drawn from the message, user, or guild registry
additional_info?stringThe free-text context supplied by the reporter (0-1000 characters)
reporter_full_legal_namestringThe full legal name of the person filing the notice (1-160 characters)
reporter_country_of_residencestringEU country code of the reporter’s residence
reporter_fluxer_tag?1stringThe reporter’s own tag in username#1234 form (3-37 characters)

1 Validated for shape and then discarded, so Fluxer never resolves it against an account and no moderator sees it

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

1 Parsed as an absolute URL whose path is /channels/<guild_id>/<channel_id>/<message_id>. Fluxer ignores the origin and the guild segment, and reads only the channel and message segments

2 When supplied it resolves to exactly the account that authored the linked message. A mismatch returns 400 INVALID_DSA_REPORT_TARGET, and a tag that resolves to no account returns 404 UNKNOWN_USER

A value that is not an absolute URL, whose path holds fewer than four segments, whose first segment is not channels, or whose third or fourth segment is not a decimal snowflake, returns 404 UNKNOWN_MESSAGE.

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

1 Supply at least one of the two. A body that supplies neither returns 400 INVALID_FORM_BODY, and an ID or tag that resolves to no account returns 404 UNKNOWN_USER

When both are supplied they must resolve to the same account. A mismatch returns 400 INVALID_DSA_REPORT_TARGET.

FieldTypeDescription
guild_idsnowflakeThe ID of the reported guild
invite_code?1stringInvite code or invite URL for the reported guild (1-64 characters)

1 This variant checks no access to the guild, so the code is never required. When supplied it is reduced to its final / separated segment, and a complete invite URL is accepted

An unknown code returns 404 UNKNOWN_INVITE. A code that resolves to an invite of another type, or to an invite for another guild, returns 400 INVALID_DSA_REPORT_TARGET.

StatusBodyCondition
200report objectThe notice was recorded
400error responseThe ticket is unknown or expired and the request returns INVALID_DSA_TICKET, or the target could not be resolved to the reported subject and the request returns INVALID_DSA_REPORT_TARGET
403error responseA body string is blocked by content moderation and the request returns CONTENT_BLOCKED
404error responseThe referenced channel, message, user, guild, or invite does not exist

The operation resolves the target, deletes the ticket, and writes one report under a freshly generated snowflake. A message notice captures the same conversation window as Report message, including the byte copy of every attachment, and applies no permission filtering to it. A user notice records the reported user’s ID and avatar hash and nothing else about the target. A guild notice records the guild’s ID, name, icon hash, NSFW flag, content warning state, and the sanitised invite code when one was supplied.

Every notice also records additional_info, the reporter’s legal name, country of residence, and the verified address behind the ticket. A notice has no account ID even when the request presented a credential, and it discards reporter_fluxer_tag.

5 requests per hour, on the dsa:report:create bucket. The verified address behind the ticket files at most 5 reports each hour.