Skip to content
Fluxer API

Admin reports

A report is one complaint against a message, an account or a guild, with the evidence Fluxer captured when it was filed. Use these routes to review reports, resolve them and delete them. People file reports through the public Reports resource, which defines the categories and reasons.

List reports returns this object. Get report returns the Admin report detail object, which extends it with message context. The guild, channel, webhook and message fields are copied when the report is filed. The account names are looked up when Fluxer builds the response. reporter_email, reporter_full_legal_name and reporter_country_of_residence are null unless you have report:view:reporter_pii as well as report:view.

FieldTypeDescription
report_idsnowflakeThe ID of the report
reporter_id1?snowflakeThe account that filed the report
reporter_tag1?stringThe reporter username and discriminator joined by #
reporter_username1?stringThe username of the reporter
reporter_global_name1?stringThe display name of the reporter
reporter_discriminator1?stringThe four-digit discriminator of the reporter
reporter_email?stringThe email address of the reporter
reporter_full_legal_name?stringThe legal name supplied with a Digital Services Act notice
reporter_country_of_residence?stringThe country of residence supplied with a Digital Services Act notice
reported_atISO8601 timestampWhen the report was filed
statusintegerThe report status
report_typeintegerThe report type
category?stringThe report category
reason??stringThe report reason, or null when filed without a report flow
reason_label??stringThe English label of the reason
reason_highest_priority??booleanWhether moderators see this reason first
flow??report flow answers objectThe answers the reporter gave in the report flow
reporter_good_faith_confirmed??booleanWhether the reporter of a Digital Services Act notice confirmed good faith
additional_info?stringThe free-text detail the reporter supplied
reported_user_id2?snowflakeThe reported account
reported_user_tag2?stringThe reported username and discriminator joined by #
reported_user_username2?stringThe username of the reported account
reported_user_global_name2?stringThe display name of the reported account
reported_user_discriminator2?stringThe four-digit discriminator of the reported account
reported_user_avatar_hash2?stringThe avatar hash of the reported account
reported_user_bot?2?booleanWhether the reported account is a bot
reported_webhook_id?2?snowflakeThe webhook that sent the reported message
reported_webhook_name?2?stringThe name the reported message was sent under
reported_webhook_avatar_hash?2?stringThe avatar hash the reported message was sent with
reported_webhook_default_name?2?stringThe name set on the webhook itself
reported_webhook_default_avatar_hash?2?stringThe avatar hash set on the webhook itself
reported_webhook_type?2?integerThe webhook type
reported_webhook_application_id?2?snowflakeThe application whose bot created the webhook
reported_webhook_channel_id?2?snowflakeThe channel the webhook belonged to
reported_webhook_guild_id?2?snowflakeThe guild the webhook belonged to
reported_webhook_created_at?2?ISO8601 timestampWhen the webhook was created
reported_webhook_creator_id?2?snowflakeThe account that created the webhook
reported_webhook_creator_tag?2?stringThe creator username and discriminator joined by #
reported_webhook_creator_username?2?stringThe username of the creator
reported_webhook_creator_global_name?2?stringThe display name of the creator
reported_webhook_creator_discriminator?2?stringThe four-digit discriminator of the creator
reported_webhook_creator_avatar_hash?2?stringThe avatar hash of the creator
reported_guild_id?snowflakeThe reported guild
reported_guild_name?stringThe name of the reported guild
reported_guild_icon_hash?stringThe icon hash of the reported guild
reported_message_id?snowflakeThe reported message, or null for a user or guild report
reported_channel_id?snowflakeThe channel the reported content was sent in
reported_channel_name?stringThe channel name, or null for a direct message channel
reported_channel_nsfw?booleanWhether the reported channel was NSFW, or is now when the report captured no value
reported_guild_invite_code?stringThe invite code the reporter sent with a guild report
reported_guild_nsfw_level?integerThe guild NSFW level, or the current level when the report captured no value
reported_guild_nsfw??booleanWhether the reported guild was marked NSFW
reported_guild_content_warning_level??integerThe guild content warning level
reported_guild_content_warning_text??stringThe guild content warning text (at most 200 characters)
reported_channel_nsfw_override??booleanThe NSFW override set on the channel itself
reported_channel_content_warning_level??integerThe content warning level set on the channel itself
reported_channel_content_warning_text??stringThe content warning text set on the channel itself (at most 200 characters)
reported_channel_effective_nsfw??booleanWhether the channel was NSFW after applying the guild setting
reported_channel_effective_content_warning_level??integerThe channel content warning level after applying the guild setting
reported_channel_effective_content_warning_text??stringThe channel content warning text after applying the guild setting
resolved_at?ISO8601 timestampWhen the report was resolved, or null while pending
resolved_by_admin_id?snowflakeThe admin who resolved the report, or null while pending
public_comment?stringThe comment shown to the reporter (at most 512 characters)

1 Null for an anonymous Digital Services Act notice, which is filed without an account

2 A report on a webhook message has null reported_user_* fields and has the webhook fields set instead. On every other report, the webhook fields are null

{
"report_id": "1502771904419102720",
"reporter_id": "1483920011884392448",
"reporter_tag": "wren#0042",
"reporter_email": null,
"reported_at": "2026-03-04T18:22:10.441Z",
"status": 0,
"report_type": 0,
"category": "harassment",
"reason": "harassment",
"reason_label": "Harassment or bullying",
"reason_highest_priority": false,
"flow": {
"revision_hash": "6b1f0c9e2a7d4413",
"surface": "in_app",
"locale": "de",
"steps": [
{"screen_id": "root_message", "screen_title": "Report message", "option_id": "abuse", "option_label": "Abusive or harmful content", "items": []},
{"screen_id": "abuse", "screen_title": "What does it involve?", "option_id": "harassment", "option_label": "Bullying, harassment or stalking", "items": []}
]
},
"reporter_good_faith_confirmed": null,
"additional_info": null,
"reported_user_id": "1490118377238528000",
"reported_user_bot": false,
"reported_guild_id": "1471002884199612416",
"reported_message_id": "1502771119476146176",
"reported_channel_id": "1471002884199612420",
"reported_channel_nsfw": false,
"reported_guild_nsfw_level": 0,
"resolved_at": null,
"resolved_by_admin_id": null,
"public_comment": null
}
ValueNameDescription
0PENDINGThe report is waiting for review
1RESOLVEDThe report was reviewed and resolved
ValueNameDescription
0MESSAGEA message was reported
1USERA user was reported
2GUILDA guild was reported

The detail object extends the Admin report object with these fields, which only Get report returns.

FieldTypeDescription
mutual_dm_channel_id?snowflakeThe DM channel the reporter and reported account share, on a USER report
message_contextarray[report message context object]The messages captured around the reported message
message_responsesarray[message object]The current state of the same messages, without deleted ones
reported_profile_snapshot??report profile snapshot objectThe reported profile as it was when the report was filed
legal_hold_until??ISO8601 timestampWhen the legal hold ends, or null without one
legal_hold_reason??stringWhy the report is held
notes?array[report note object]The internal notes on the report, oldest first

A copy of a message as it was when the report was filed. A message report captures the reported message and up to 25 messages before and after it. User and guild reports capture none. Attachment copies stay when the original is deleted.

FieldTypeDescription
idsnowflakeThe ID of the message
channel_idsnowflakeThe channel the message was sent in
channel_nsfw?booleanThe current NSFW state of the channel
channel_content_warning_level??integerAlways null
channel_content_warning_text??stringAlways null
guild_id?snowflakeThe guild the report is about or was filed from
guild_nsfw_level?integerThe current guild NSFW level
guild_nsfw??booleanAlways null
guild_content_warning_level??integerAlways null
guild_content_warning_text??stringAlways null
contentstringThe message content, empty when it had none
timestampISO8601 timestampWhen the message was sent
attachmentsarray[report message attachment object]The attachment copies
author_idsnowflakeThe author, or the webhook ID for a webhook message
author_usernamestringThe author username, or the name a webhook message was sent under
author_global_name?stringAlways null
author_discriminatorstringThe four-digit author discriminator, 0000 for a webhook message
author_avatar?stringThe author avatar hash
webhook_id??snowflakeThe webhook that sent the message
author_bot??booleanWhether the author account is a bot
missing_attachments?array[report missing attachment object]Attachments Fluxer could not copy

When the author's account was already deleted, the copy has the username DeletedUser and the discriminator 0000.

FieldTypeDescription
idsnowflakeThe ID of the attachment
filenamestringThe file name
urlstringThe download URL for the copy, valid for five minutes
nsfw?booleanWhether the attachment was marked NSFW
content_type?stringThe MIME type
width?integerThe width in pixels, or null for a non-image
height?integerThe height in pixels, or null for a non-image
size??integerThe size in bytes

An attachment Fluxer could not copy into the report. It has no download URL.

FieldTypeDescription
idsnowflakeThe ID of the attachment
filenamestringThe file name
nsfw?booleanWhether the attachment was marked NSFW
content_type?stringThe MIME type
width?integerThe width in pixels, or null for a non-image
height?integerThe height in pixels, or null for a non-image
size?integerThe size in bytes

The reported profile as it was when the report was filed, with copies of its images.

FieldTypeDescription
captured_atISO8601 timestampWhen the snapshot was taken
user?snapshot user objectThe reported account, or null on a guild report
member?snapshot member objectThe guild profile of the reported account, when the report is about a guild
guild?snapshot guild objectThe reported guild, on a guild report only
FieldTypeDescription
idsnowflakeThe ID of the account
username?stringThe username
discriminator?stringThe four-digit discriminator
global_name?stringThe display name
bio?stringThe profile bio
pronouns?stringThe pronouns
avatar?snapshot asset objectThe avatar
banner?snapshot asset objectThe profile banner
FieldTypeDescription
guild_idsnowflakeThe guild the profile belongs to
nick?stringThe guild nickname
bio?stringThe guild profile bio
pronouns?stringThe guild profile pronouns
joined_at?ISO8601 timestampWhen the account joined the guild
avatar?snapshot asset objectThe guild avatar
banner?snapshot asset objectThe guild profile banner
FieldTypeDescription
idsnowflakeThe ID of the guild
name?stringThe guild name
vanity_url_code?stringThe vanity invite code
icon?snapshot asset objectThe icon
banner?snapshot asset objectThe banner
splash?snapshot asset objectThe invite splash
FieldTypeDescription
hashstringThe asset hash when the report was filed
url?stringThe download URL for the copy, valid for five minutes, or null when the copy failed

The answers a reporter gave in a report flow, with English labels from the current catalog.

FieldTypeDescription
revision_hashstringThe revision hash the reporter's client sent
surfacestringThe report flow surface, in_app or dsa
locale?stringThe locale the reporter saw the flow in
stepsarray[report flow answer step object]The answered screens in order
FieldTypeDescription
screen_idstringThe ID of the screen
screen_titlestringThe English title of the screen
option_id?stringThe ID of the chosen option, or null on a checklist or info screen
option_label?stringThe English label of the chosen option
itemsarray[report flow answer item object]The checked checklist items
FieldTypeDescription
idstringThe ID of the item
labelstringThe English label of the item

An entry in the report reason catalog, as List report reasons returns it.

FieldTypeDescription
keystringThe reason key stored on a report
labelstringThe English label
highest_prioritybooleanWhether moderators see reports with this reason first
legacy_category_messagestringThe category a message report stores
legacy_category_userstringThe category a user report stores
legacy_category_guildstringThe category a guild report stores

Update report returns this object.

FieldTypeDescription
report_idsnowflakeThe ID of the report
statusintegerThe report status, always RESOLVED
resolved_at?ISO8601 timestampWhen the report was resolved
public_comment?stringThe comment shown to the reporter, or null when notify_reporter was false

Set report legal hold returns this object.

FieldTypeDescription
report_idsnowflakeThe ID of the report
legal_hold_until?ISO8601 timestampWhen the hold ends, or null when the report has no hold
legal_hold_reason?stringWhy the report is held, or null when the report has no hold

A note is for admins only, and Fluxer never shows it to the reporter or the reported account. A note can't be edited, and it's deleted with its report.

FieldTypeDescription
note_idsnowflakeThe ID of the note
author_idsnowflakeThe admin who wrote it
bodystringThe note
created_atISO8601 timestampWhen it was written

A pending report is kept until it is resolved. A resolved report is deleted with its notes and evidence copies 365 days after resolved_at, and you can change the number of days with FLUXER_REPORT_RETENTION_DAYS on worker, which runs retention once a day. Three kinds of report are kept longer.

  • A child_safety report is kept at least 365 days after it was resolved, even when FLUXER_REPORT_RETENTION_DAYS is lower.
  • A report linked from an enforcement decision is kept at least 365 days after the newest such decision.
  • A report with a legal hold is kept until the hold ends.

Every report, pending or resolved, loses its message context, profile snapshot, additional info and evidence copies 365 days after it was filed, unless it has a legal hold. The record and its notes stay.

When a report is resolved as no_violation and isn't one of the reports above, its message context, profile snapshot, additional info and evidence copies are deleted 184 days after it was resolved, and the rest of the record is deleted when the retention period ends.

GET/v1/admin/reportsAudit reason

Returns a page of Admin report objects. You need report:view.

FieldTypeDescription
q?1stringFree-text query (1-1024 characters)
status?pending | resolvedFilter by report status
report_type?message | user | guildFilter by report type
category?stringFilter by category (1-128 characters)
reason?stringFilter by report reason key (1-64 characters)
reporter_id?snowflakeFilter by reporter
reported_user_id?snowflakeFilter by reported account
reported_webhook_id?snowflakeFilter by the webhook that sent the reported message
reported_guild_id?snowflakeFilter by reported guild
reported_channel_id?snowflakeFilter by reported channel
guild_context_id?snowflakeFilter by the guild the report was filed from
resolved_by_admin_id?snowflakeFilter by the admin who resolved the report
sort_by?2created_at | reported_at | resolved_atSort field (default reported_at)
sort_order?2asc | descSort direction (default desc)
limit?integerMaximum reports to return (1-200, default 50)
offset?integerReports to skip (0-10000, default 0)

1 Matches category, additional_info, reported_guild_name and reported_channel_name

2 Ignored when status is the only filter, and those results are always newest first by reported_at

FieldTypeDescription
reportsarray[Admin report object]The reports in this page
totalintegerThe number of matching reports
offsetintegerThe offset of this page
limitintegerThe limit of this page
StatusBodyCondition
200response bodyThe page was returned
403error responseFEATURE_TEMPORARILY_DISABLED when the instance has no search backend

The rate limit is 200 requests per minute, on the admin:lookup bucket.

GET/v1/admin/report-reasonsAudit reason

Returns every report reason with the category it stores for each report type. You need report:view.

FieldTypeDescription
reasonsarray[report reason object]Every reason, in catalog order
StatusBodyCondition
200response bodyThe catalog was returned

The rate limit is 200 requests per minute, on the admin:lookup bucket.

GET/v1/admin/reports/{report_id}Audit reason

Returns an Admin report detail object. You need report:view.

StatusBodyCondition
200Admin report detail objectThe report was returned
404error responseUNKNOWN_REPORT when the report doesn't exist

The rate limit is 200 requests per minute, on the admin:lookup bucket.

PATCH/v1/admin/reports/{report_id}Audit reason

Resolves a pending report and returns a report resolution object. You need report:resolve.

FieldTypeDescription
statusresolvedThe new status
public_comment?stringThe comment shown to the reporter (0-512 characters)
notify_reporter?1booleanWhether the notice to the reporter includes public_comment (default true)
resolutionstringactioned, no_violation or duplicate
outcome?stringremoved, warned, restricted, action_taken or no_violation
duplicate_of?snowflakeThe report this one repeats

1 The reporter gets a notice either way. False leaves the comment out of the notice and off the report, and Fluxer keeps it only in the audit entry as internal_comment

The resolution decides which of the other fields you send.

resolutionoutcomeduplicate_of
actionedRequired, any value except no_violationNot allowed
no_violationOptional, only no_violationNot allowed
duplicateNot allowed, copied from the duplicate_of reportRequired, and not this report

The outcome is one of these values.

OutcomeDescription
removedThe reported content, profile field or guild was removed
warnedThe account responsible was warned, and the reporter is told action was taken
restrictedThe reported account was restricted
action_takenFluxer acted another way and doesn't tell the reporter how
no_violationThe reported content breaks no rule

Schedule user deletion with deletion reason 3, 4, 5, 6, 8, 11, 17, 18, 20, 21 or 22 also resolves the pending reports against that account with the outcome restricted and no comment, except reports in the child_safety, underage_user and self_harm categories. An enforcement decision resolves the pending reports it links.

StatusBodyCondition
200report resolution objectThe report was resolved
400error responseREPORT_ALREADY_RESOLVED when the report is already resolved
400error responseINVALID_FORM_BODY with REPORT_OUTCOME_INVALID when outcome or duplicate_of doesn't fit resolution
404error responseUNKNOWN_REPORT when the report or the duplicate_of report doesn't exist

The reporter gets a system DM with the outcome, which sends Channel Create and Message Create, and an email when the account has an email address. A Digital Services Act notice and an instance with direct messages turned off get the email only. Fluxer sends nothing when the reporter's account is deleted, when it was barred from reporting at the time of the report, or when the report is a duplicate of one with no outcome yet.

The rate limit is 200 requests per minute, on the admin:lookup bucket.

GET/v1/admin/reports/{report_id}/notesAudit reason

Returns the notes on a report, oldest first. You need report:view.

FieldTypeDescription
notesarray[report note object]The notes on the report, oldest first
StatusBodyCondition
200response bodyThe notes were returned
404error responseUNKNOWN_REPORT when the report doesn't exist

The rate limit is 200 requests per minute, on the admin:lookup bucket.

POST/v1/admin/reports/{report_id}/notesAudit reason

Adds a note to a report, pending or resolved, and returns it. You need report:resolve.

FieldTypeDescription
bodystringThe note (1-2000 characters)
StatusBodyCondition
200report note objectThe note was added
400error responseINVALID_FORM_BODY when body is empty or over 2000 characters
404error responseUNKNOWN_REPORT when the report doesn't exist

The rate limit is 100 requests per minute, on the admin:user:modify bucket.

POST/v1/admin/reports/{report_id}/legal-holdAudit reason

Places or clears a legal hold and returns a report legal hold object. You need report:resolve. Retention doesn't delete a held report until the hold ends, and a new hold replaces the old one.

FieldTypeDescription
legal_hold_until?ISO8601 timestampWhen the hold ends (in the future), or null to clear the hold
legal_hold_reason??stringWhy the report is held (1-512 characters), required to place a hold
StatusBodyCondition
200report legal hold objectThe hold was placed or cleared
400error responseINVALID_FORM_BODY when legal_hold_until isn't in the future or a hold has no reason
404error responseUNKNOWN_REPORT when the report doesn't exist

The rate limit is 200 requests per minute, on the admin:lookup bucket.

DELETE/v1/admin/reports/{report_id}Audit reason

Deletes a report with its notes and evidence copies right away, without telling the reporter. You need report:delete.

StatusBodyCondition
204emptyThe report was deleted
404error responseUNKNOWN_REPORT when the report doesn't exist
409error responseREPORT_UNDER_LEGAL_HOLD when the report has a legal hold that hasn't ended

The rate limit is 200 requests per minute, on the admin:lookup bucket.