Run a site
Abuse reports
abuse-report-service
Reporting a post, a reply or a profile, and the administrators' queue of what was reported. Optional: an installation may not run it (abuse-reports.md).
Report something
/abuse-reportsNobody is told: the person reported never learns of the report or who made it, and administrators find it in their queue. A thing the viewer cannot see answers exactly as one that does not exist, so that reporting is no way to find out what is hidden. Twenty reports an hour at most. With reason_key rule, it breaks one of the rules everybody ticked, named by its title in rule: the site's (rule_profile_id 0, from GET /site) or those of the group or event it is in, or is (its id).
Who: Somebody signed in, with account:write
Body application/json
detailsstringWhat the reporter adds in their own words. Needed where the reason says so. At most 1000 characters.reason_keystringrequiredWhy, by the reason's key (GET /abuse-reports/reasons). At most 64 characters.rulestringWith reason_key "rule": the rule broken, by its title as the reporter read it, and whose rule it is: 0 for the site's, or the group or event the reported thing belongs to (roadmap row 102, part 6). At most 100 characters.rule_profile_idintegerAt least 0.target_idintegerrequiredThe id of what is reported: a post, a reply, a profile. At least 1.
Answers
- 200the viewer had reported it already; their report was updated
- 201reported
- 400
own_content, it is the viewer's own;reason_not_applicable, the reason is not for this kind of thing;details_required, the reason needs the reporter's own words;rule_required,ruleis empty;rule_not_applicable, it is not one of that profile's rules, or the thing is not in that profile; or not well formed, without a bodyRefusal application/json - 401no token, or one that has expired
- 403the viewer may not do this
- 404there is no such thing that the viewer can see
- 429too many reports in the last hour
Request
curl -X POST "https://api.example.org/abuse-reports" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"details": "string",
"reason_key": "string",
"rule": "string",
"rule_profile_id": 42,
"target_id": 42
}'
const response = await fetch('https://api.example.org/abuse-reports', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"details": "string",
"reason_key": "string",
"rule": "string",
"rule_profile_id": 42,
"target_id": 42
}),
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/abuse-reports",
headers={"Authorization": f"Bearer {token}"},
json={
"details": "string",
"reason_key": "string",
"rule": "string",
"rule_profile_id": 42,
"target_id": 42
},
)
answer = response.json()
Report something
/abuse-reports/Nobody is told: the person reported never learns of the report or who made it, and administrators find it in their queue. A thing the viewer cannot see answers exactly as one that does not exist, so that reporting is no way to find out what is hidden. Twenty reports an hour at most. With reason_key rule, it breaks one of the rules everybody ticked, named by its title in rule: the site's (rule_profile_id 0, from GET /site) or those of the group or event it is in, or is (its id).
Who: Somebody signed in, with account:write
Body application/json
detailsstringWhat the reporter adds in their own words. Needed where the reason says so. At most 1000 characters.reason_keystringrequiredWhy, by the reason's key (GET /abuse-reports/reasons). At most 64 characters.rulestringWith reason_key "rule": the rule broken, by its title as the reporter read it, and whose rule it is: 0 for the site's, or the group or event the reported thing belongs to (roadmap row 102, part 6). At most 100 characters.rule_profile_idintegerAt least 0.target_idintegerrequiredThe id of what is reported: a post, a reply, a profile. At least 1.
Answers
- 200the viewer had reported it already; their report was updated
- 201reported
- 400
own_content, it is the viewer's own;reason_not_applicable, the reason is not for this kind of thing;details_required, the reason needs the reporter's own words;rule_required,ruleis empty;rule_not_applicable, it is not one of that profile's rules, or the thing is not in that profile; or not well formed, without a bodyRefusal application/json - 401no token, or one that has expired
- 403the viewer may not do this
- 404there is no such thing that the viewer can see
- 429too many reports in the last hour
Request
curl -X POST "https://api.example.org/abuse-reports/" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"details": "string",
"reason_key": "string",
"rule": "string",
"rule_profile_id": 42,
"target_id": 42
}'
const response = await fetch('https://api.example.org/abuse-reports/', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"details": "string",
"reason_key": "string",
"rule": "string",
"rule_profile_id": 42,
"target_id": 42
}),
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/abuse-reports/",
headers={"Authorization": f"Bearer {token}"},
json={
"details": "string",
"reason_key": "string",
"rule": "string",
"rule_profile_id": 42,
"target_id": 42
},
)
answer = response.json()
Cases
/abuse-reports/casesWhat was reported, one case for each thing, however many reported it.
Who: An administrator, with actors:read
Parameters
statusstringin queryWhich cases:open(the default),actionedordismissed. One ofopen,actioned,dismissed.reasonstringin queryOnly cases with a report that gave this reason, by its key. At most 64 characters.startintegerin queryHow many to pass over. At least 0.limitintegerin queryThe most to send: 20 unless asked, 100 at most. At least 0.langstringin queryThe language to word the reasons in. Accept-Language when left out.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not do this
Request
curl "https://api.example.org/abuse-reports/cases" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/abuse-reports/cases', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/abuse-reports/cases",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"data": [
{
"decided_at": "2026-10-27T09:30:00Z",
"decided_by": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"avatar_urls": null,
"body": null,
"comment_count": null,
"content": null,
"cover_urls": null,
"created_at": null,
"editor": null,
"event": null,
"feed": null,
"files": null,
"follower_count": null,
"id": null,
"is_admined_by_viewer": null,
"is_blocked_by_viewer": null,
"is_following_viewer": null,
"is_leading_viewer": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"is_subscribed_by_viewer": null,
"language": null,
"likes_count": null,
"link_preview": null,
"media_removed": null,
"mimetype": null,
"name": null,
"origin_domain": null,
"owner": null,
"parent": null,
"pinned": null,
"portrait_urls": null,
"quote": null,
"quote_count": null,
"quote_id": null,
"repost_count": null,
"root": null,
"root_id": null,
"title": null,
"type": null,
"uri": null,
"verified": null,
"video": null
},
"decision_action": "string",
"decision_note": "string",
"first_reported_at": "2026-10-27T09:30:00Z",
"id": 42,
"last_reported_at": "2026-10-27T09:30:00Z",
"reasons": [
null
],
"report_count": 1,
"status": "string",
"target": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"avatar_urls": null,
"body": null,
"comment_count": null,
"content": null,
"cover_urls": null,
"created_at": null,
"editor": null,
"event": null,
"feed": null,
"files": null,
"follower_count": null,
"id": null,
"is_admined_by_viewer": null,
"is_blocked_by_viewer": null,
"is_following_viewer": null,
"is_leading_viewer": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"is_subscribed_by_viewer": null,
"language": null,
"likes_count": null,
"link_preview": null,
"media_removed": null,
"mimetype": null,
"name": null,
"origin_domain": null,
"owner": null,
"parent": null,
"pinned": null,
"portrait_urls": null,
"quote": null,
"quote_count": null,
"quote_id": null,
"repost_count": null,
"root": null,
"root_id": null,
"title": null,
"type": null,
"uri": null,
"verified": null,
"video": null
},
"target_gone": false,
"target_id": 42,
"target_owner": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"avatar_urls": null,
"body": null,
"comment_count": null,
"content": null,
"cover_urls": null,
"created_at": null,
"editor": null,
"event": null,
"feed": null,
"files": null,
"follower_count": null,
"id": null,
"is_admined_by_viewer": null,
"is_blocked_by_viewer": null,
"is_following_viewer": null,
"is_leading_viewer": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"is_subscribed_by_viewer": null,
"language": null,
"likes_count": null,
"link_preview": null,
"media_removed": null,
"mimetype": null,
"name": null,
"origin_domain": null,
"owner": null,
"parent": null,
"pinned": null,
"portrait_urls": null,
"quote": null,
"quote_count": null,
"quote_id": null,
"repost_count": null,
"root": null,
"root_id": null,
"title": null,
"type": null,
"uri": null,
"verified": null,
"video": null
},
"target_type": "string",
"written_by": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"avatar_urls": null,
"body": null,
"comment_count": null,
"content": null,
"cover_urls": null,
"created_at": null,
"editor": null,
"event": null,
"feed": null,
"files": null,
"follower_count": null,
"id": null,
"is_admined_by_viewer": null,
"is_blocked_by_viewer": null,
"is_following_viewer": null,
"is_leading_viewer": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"is_subscribed_by_viewer": null,
"language": null,
"likes_count": null,
"link_preview": null,
"media_removed": null,
"mimetype": null,
"name": null,
"origin_domain": null,
"owner": null,
"parent": null,
"pinned": null,
"portrait_urls": null,
"quote": null,
"quote_count": null,
"quote_id": null,
"repost_count": null,
"root": null,
"root_id": null,
"title": null,
"type": null,
"uri": null,
"verified": null,
"video": null
}
}
],
"pagination": {
"limit": 1,
"offset": 1,
"total": 1
}
}
One case
/abuse-reports/cases/{id}With each report, and the earlier cases about the same thing.
Who: An administrator, with actors:read
Parameters
idintegerrequiredin pathThe case's id.langstringin queryThe language to word the reasons in. Accept-Language when left out.
Answers
- 200OKabusereport.CaseDetail application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not do this
- 404there is no such case
Request
curl "https://api.example.org/abuse-reports/cases/<id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/abuse-reports/cases/<id>', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/abuse-reports/cases/<id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"decided_at": "2026-10-27T09:30:00Z",
"decided_by": {
"access": "string",
"alias": "string",
"author": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"authorized": {
"add_follower": null,
"administration": null,
"audiences": null,
"block_from_owner": null,
"comment": null,
"composers": null,
"delete": null,
"download": null,
"edit": null,
"hide": null,
"invite": null,
"like": null,
"pin": null,
"quote": null
},
"avatar_urls": {
"key": null
},
"body": "string",
"comment_count": 1,
"content": "string",
"cover_urls": {
"key": null
},
"created_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"event": {
"address": null,
"cancelled_at": null,
"capacity": null,
"ends_at": null,
"going_count": null,
"has_address": null,
"has_online_url": null,
"host": null,
"is_full": null,
"maybe_count": null,
"online_url": null,
"open_to_host_followers": null,
"starts_at": null,
"state": null,
"timezone_name": null,
"viewer_rsvp": null
},
"feed": {
"definition": null,
"icon": null
},
"files": [
null
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_leading_viewer": false,
"is_liked_by_viewer": false,
"is_reposted_by_viewer": false,
"is_saved_by_viewer": false,
"is_subscribed_by_viewer": false,
"language": "en",
"likes_count": 1,
"link_preview": {
"description": null,
"image": null,
"site_name": null,
"title": null,
"url": null
},
"media_removed": {
"alts": null,
"count": null,
"gone": null
},
"mimetype": "string",
"name": "string",
"origin_domain": "string",
"owner": {
"alias": null,
"avatar_urls": null,
"body": null,
"id": null,
"is_following_viewer": null,
"is_leading_viewer": null,
"name": null,
"type": null
},
"parent": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"body": null,
"content": null,
"cover_urls": null,
"created_at": null,
"files": null,
"id": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"link_preview": null,
"name": null,
"owner": null,
"portrait_urls": null,
"title": null,
"type": null,
"video": null
},
"pinned": false,
"portrait_urls": {
"key": null
},
"quote": {
"post": null,
"state": null
},
"quote_count": 1,
"quote_id": 42,
"repost_count": 1,
"root": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"body": null,
"content": null,
"cover_urls": null,
"created_at": null,
"files": null,
"id": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"link_preview": null,
"name": null,
"owner": null,
"portrait_urls": null,
"title": null,
"type": null,
"video": null
},
"root_id": 42,
"title": "string",
"type": "string",
"uri": "https://example.org/",
"verified": false,
"video": {
"duration": null,
"files": null,
"height": null,
"loop": null,
"poster": null,
"width": null
}
},
"decision_action": "string",
"decision_note": "string",
"first_reported_at": "2026-10-27T09:30:00Z",
"id": 42,
"last_reported_at": "2026-10-27T09:30:00Z",
"previous": [
{
"decided_at": "2026-10-27T09:30:00Z",
"decided_by": null,
"decision_action": "string",
"decision_note": "string",
"first_reported_at": "2026-10-27T09:30:00Z",
"id": 42,
"last_reported_at": "2026-10-27T09:30:00Z",
"reasons": [
null
],
"report_count": 1,
"status": "string",
"target": null,
"target_gone": false,
"target_id": 42,
"target_owner": null,
"target_type": "string",
"written_by": null
}
],
"reasons": [
{
"count": 1,
"key": "string",
"label": "string"
}
],
"report_count": 1,
"reports": [
{
"created_at": "2026-10-27T09:30:00Z",
"details": "string",
"id": 42,
"reason_key": "string",
"reason_label": "string",
"reporter": null,
"reporter_id": 42,
"rule": "string",
"rule_profile": null,
"rule_profile_id": 42,
"updated_at": "2026-10-27T09:30:00Z"
}
],
"status": "string",
"target": {
"access": "string",
"alias": "string",
"author": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"authorized": {
"add_follower": null,
"administration": null,
"audiences": null,
"block_from_owner": null,
"comment": null,
"composers": null,
"delete": null,
"download": null,
"edit": null,
"hide": null,
"invite": null,
"like": null,
"pin": null,
"quote": null
},
"avatar_urls": {
"key": null
},
"body": "string",
"comment_count": 1,
"content": "string",
"cover_urls": {
"key": null
},
"created_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"event": {
"address": null,
"cancelled_at": null,
"capacity": null,
"ends_at": null,
"going_count": null,
"has_address": null,
"has_online_url": null,
"host": null,
"is_full": null,
"maybe_count": null,
"online_url": null,
"open_to_host_followers": null,
"starts_at": null,
"state": null,
"timezone_name": null,
"viewer_rsvp": null
},
"feed": {
"definition": null,
"icon": null
},
"files": [
null
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_leading_viewer": false,
"is_liked_by_viewer": false,
"is_reposted_by_viewer": false,
"is_saved_by_viewer": false,
"is_subscribed_by_viewer": false,
"language": "en",
"likes_count": 1,
"link_preview": {
"description": null,
"image": null,
"site_name": null,
"title": null,
"url": null
},
"media_removed": {
"alts": null,
"count": null,
"gone": null
},
"mimetype": "string",
"name": "string",
"origin_domain": "string",
"owner": {
"alias": null,
"avatar_urls": null,
"body": null,
"id": null,
"is_following_viewer": null,
"is_leading_viewer": null,
"name": null,
"type": null
},
"parent": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"body": null,
"content": null,
"cover_urls": null,
"created_at": null,
"files": null,
"id": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"link_preview": null,
"name": null,
"owner": null,
"portrait_urls": null,
"title": null,
"type": null,
"video": null
},
"pinned": false,
"portrait_urls": {
"key": null
},
"quote": {
"post": null,
"state": null
},
"quote_count": 1,
"quote_id": 42,
"repost_count": 1,
"root": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"body": null,
"content": null,
"cover_urls": null,
"created_at": null,
"files": null,
"id": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"link_preview": null,
"name": null,
"owner": null,
"portrait_urls": null,
"title": null,
"type": null,
"video": null
},
"root_id": 42,
"title": "string",
"type": "string",
"uri": "https://example.org/",
"verified": false,
"video": {
"duration": null,
"files": null,
"height": null,
"loop": null,
"poster": null,
"width": null
}
},
"target_gone": false,
"target_id": 42,
"target_owner": {
"access": "string",
"alias": "string",
"author": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"authorized": {
"add_follower": null,
"administration": null,
"audiences": null,
"block_from_owner": null,
"comment": null,
"composers": null,
"delete": null,
"download": null,
"edit": null,
"hide": null,
"invite": null,
"like": null,
"pin": null,
"quote": null
},
"avatar_urls": {
"key": null
},
"body": "string",
"comment_count": 1,
"content": "string",
"cover_urls": {
"key": null
},
"created_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"event": {
"address": null,
"cancelled_at": null,
"capacity": null,
"ends_at": null,
"going_count": null,
"has_address": null,
"has_online_url": null,
"host": null,
"is_full": null,
"maybe_count": null,
"online_url": null,
"open_to_host_followers": null,
"starts_at": null,
"state": null,
"timezone_name": null,
"viewer_rsvp": null
},
"feed": {
"definition": null,
"icon": null
},
"files": [
null
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_leading_viewer": false,
"is_liked_by_viewer": false,
"is_reposted_by_viewer": false,
"is_saved_by_viewer": false,
"is_subscribed_by_viewer": false,
"language": "en",
"likes_count": 1,
"link_preview": {
"description": null,
"image": null,
"site_name": null,
"title": null,
"url": null
},
"media_removed": {
"alts": null,
"count": null,
"gone": null
},
"mimetype": "string",
"name": "string",
"origin_domain": "string",
"owner": {
"alias": null,
"avatar_urls": null,
"body": null,
"id": null,
"is_following_viewer": null,
"is_leading_viewer": null,
"name": null,
"type": null
},
"parent": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"body": null,
"content": null,
"cover_urls": null,
"created_at": null,
"files": null,
"id": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"link_preview": null,
"name": null,
"owner": null,
"portrait_urls": null,
"title": null,
"type": null,
"video": null
},
"pinned": false,
"portrait_urls": {
"key": null
},
"quote": {
"post": null,
"state": null
},
"quote_count": 1,
"quote_id": 42,
"repost_count": 1,
"root": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"body": null,
"content": null,
"cover_urls": null,
"created_at": null,
"files": null,
"id": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"link_preview": null,
"name": null,
"owner": null,
"portrait_urls": null,
"title": null,
"type": null,
"video": null
},
"root_id": 42,
"title": "string",
"type": "string",
"uri": "https://example.org/",
"verified": false,
"video": {
"duration": null,
"files": null,
"height": null,
"loop": null,
"poster": null,
"width": null
}
},
"target_type": "string",
"written_by": {
"access": "string",
"alias": "string",
"author": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"authorized": {
"add_follower": null,
"administration": null,
"audiences": null,
"block_from_owner": null,
"comment": null,
"composers": null,
"delete": null,
"download": null,
"edit": null,
"hide": null,
"invite": null,
"like": null,
"pin": null,
"quote": null
},
"avatar_urls": {
"key": null
},
"body": "string",
"comment_count": 1,
"content": "string",
"cover_urls": {
"key": null
},
"created_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"event": {
"address": null,
"cancelled_at": null,
"capacity": null,
"ends_at": null,
"going_count": null,
"has_address": null,
"has_online_url": null,
"host": null,
"is_full": null,
"maybe_count": null,
"online_url": null,
"open_to_host_followers": null,
"starts_at": null,
"state": null,
"timezone_name": null,
"viewer_rsvp": null
},
"feed": {
"definition": null,
"icon": null
},
"files": [
null
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_leading_viewer": false,
"is_liked_by_viewer": false,
"is_reposted_by_viewer": false,
"is_saved_by_viewer": false,
"is_subscribed_by_viewer": false,
"language": "en",
"likes_count": 1,
"link_preview": {
"description": null,
"image": null,
"site_name": null,
"title": null,
"url": null
},
"media_removed": {
"alts": null,
"count": null,
"gone": null
},
"mimetype": "string",
"name": "string",
"origin_domain": "string",
"owner": {
"alias": null,
"avatar_urls": null,
"body": null,
"id": null,
"is_following_viewer": null,
"is_leading_viewer": null,
"name": null,
"type": null
},
"parent": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"body": null,
"content": null,
"cover_urls": null,
"created_at": null,
"files": null,
"id": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"link_preview": null,
"name": null,
"owner": null,
"portrait_urls": null,
"title": null,
"type": null,
"video": null
},
"pinned": false,
"portrait_urls": {
"key": null
},
"quote": {
"post": null,
"state": null
},
"quote_count": 1,
"quote_id": 42,
"repost_count": 1,
"root": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"body": null,
"content": null,
"cover_urls": null,
"created_at": null,
"files": null,
"id": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"link_preview": null,
"name": null,
"owner": null,
"portrait_urls": null,
"title": null,
"type": null,
"video": null
},
"root_id": 42,
"title": "string",
"type": "string",
"uri": "https://example.org/",
"verified": false,
"video": {
"duration": null,
"files": null,
"height": null,
"loop": null,
"poster": null,
"width": null
}
}
}
Reopen a case
/abuse-reports/cases/{id}/reopenWho: An administrator, with actors:write
Parameters
idintegerrequiredin pathThe case's id.
Answers
- 204open again
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not do this
- 404there is no such case
- 409
already_open; ornewer_case_open, a later case about the same thing is openRefusal application/json
Request
curl -X POST "https://api.example.org/abuse-reports/cases/<id>/reopen" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/abuse-reports/cases/<id>/reopen', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/abuse-reports/cases/<id>/reopen",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Decide a case
/abuse-reports/cases/{id}/resolveWho: An administrator, with actors:write
Parameters
idintegerrequiredin pathThe case's id.
Body application/json
actionstringWhat was done:none,deleted,disabled,archived,blocked,removed_as_spamorother. One ofnone,deleted,disabled,archived,blocked,removed_as_spam,other.notestringWhat the administrator wants remembered of it. At most 2000 characters.statusstringrequiredactioned, something was done; ordismissed, nothing needed doing. One ofactioned,dismissed.
Answers
- 204decided
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not do this
- 404there is no such case
- 409
already_decidedRefusal application/json
Request
curl -X POST "https://api.example.org/abuse-reports/cases/<id>/resolve" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"action": "none",
"note": "string",
"status": "actioned"
}'
const response = await fetch('https://api.example.org/abuse-reports/cases/<id>/resolve', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"action": "none",
"note": "string",
"status": "actioned"
}),
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/abuse-reports/cases/<id>/resolve",
headers={"Authorization": f"Bearer {token}"},
json={
"action": "none",
"note": "string",
"status": "actioned"
},
)
answer = response.json()
How many cases are open
/abuse-reports/cases/summaryWho: An administrator, with actors:read
Answers
- 200OKabusereport.CaseSummary application/json
- 401no token, or one that has expired
- 403the viewer may not do this
Request
curl "https://api.example.org/abuse-reports/cases/summary" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/abuse-reports/cases/summary', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/abuse-reports/cases/summary",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"open": 1
}
A group's or an event's reports
/abuse-reports/profiles/{id}/casesThe cases with a report against a group's or an event's rules, newest first, each with those reports: the rule, the reporter's words and when, never who made them. For its administrators and the site's. They act on what was reported where it is, by deleting or hiding it, which closes its case; deciding the case stays with the site's administrators.
Who: Somebody signed in, with actors:read
Parameters
idintegerrequiredin pathThe group's or the event's id.statusstringin queryWhich cases:open(the default),actionedordismissed. One ofopen,actioned,dismissed.startintegerin queryHow many to pass over. At least 0.limitintegerin queryThe most to send: 20 unless asked, 100 at most. At least 0.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer administers neither it nor the site
- 404there is no such group or event
Request
curl "https://api.example.org/abuse-reports/profiles/<id>/cases" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/abuse-reports/profiles/<id>/cases', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/abuse-reports/profiles/<id>/cases",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"data": [
{
"id": 42,
"last_reported_at": "2026-10-27T09:30:00Z",
"reports": [
null
],
"status": "string",
"target": {
"access": null,
"alias": null,
"author": null,
"authorized": null,
"avatar_urls": null,
"body": null,
"comment_count": null,
"content": null,
"cover_urls": null,
"created_at": null,
"editor": null,
"event": null,
"feed": null,
"files": null,
"follower_count": null,
"id": null,
"is_admined_by_viewer": null,
"is_blocked_by_viewer": null,
"is_following_viewer": null,
"is_leading_viewer": null,
"is_liked_by_viewer": null,
"is_reposted_by_viewer": null,
"is_saved_by_viewer": null,
"is_subscribed_by_viewer": null,
"language": null,
"likes_count": null,
"link_preview": null,
"media_removed": null,
"mimetype": null,
"name": null,
"origin_domain": null,
"owner": null,
"parent": null,
"pinned": null,
"portrait_urls": null,
"quote": null,
"quote_count": null,
"quote_id": null,
"repost_count": null,
"root": null,
"root_id": null,
"title": null,
"type": null,
"uri": null,
"verified": null,
"video": null
},
"target_gone": false,
"target_id": 42,
"target_type": "string"
}
],
"pagination": {
"limit": 1,
"offset": 1,
"total": 1
}
}
What a thing may be reported for
/abuse-reports/reasonsThe installation's list, worded in the language asked for.
Who: Somebody signed in, with account:write
Parameters
typestringin queryOnly the reasons for this kind of node:node.medium.text-service.note.v1and so on. All of them when left out.langstringin queryThe language to word them in. Accept-Language when left out.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not do this
Request
curl "https://api.example.org/abuse-reports/reasons" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/abuse-reports/reasons', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/abuse-reports/reasons",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"data": [
{
"description": "string",
"key": "string",
"label": "string",
"requires_details": false
}
]
}
Written by Claude, reviewed by Rastin Mehr · About this