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

POST/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

  • detailsstring
    What the reporter adds in their own words. Needed where the reason says so. At most 1000 characters.
  • reason_keystringrequired
    Why, by the reason's key (GET /abuse-reports/reasons). At most 64 characters.
  • rulestring
    With 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_idinteger
    At least 0.
  • target_idintegerrequired
    The id of what is reported: a post, a reply, a profile. At least 1.

Answers

  • 200
    the viewer had reported it already; their report was updated
  • 201
    reported
  • 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, rule is 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 body
    Refusal application/json
  • 401
    no token, or one that has expired
  • 403
    the viewer may not do this
  • 404
    there is no such thing that the viewer can see
  • 429
    too 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
  }'

Report something

POST/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

  • detailsstring
    What the reporter adds in their own words. Needed where the reason says so. At most 1000 characters.
  • reason_keystringrequired
    Why, by the reason's key (GET /abuse-reports/reasons). At most 64 characters.
  • rulestring
    With 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_idinteger
    At least 0.
  • target_idintegerrequired
    The id of what is reported: a post, a reply, a profile. At least 1.

Answers

  • 200
    the viewer had reported it already; their report was updated
  • 201
    reported
  • 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, rule is 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 body
    Refusal application/json
  • 401
    no token, or one that has expired
  • 403
    the viewer may not do this
  • 404
    there is no such thing that the viewer can see
  • 429
    too 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
  }'

Cases

GET/abuse-reports/cases

What was reported, one case for each thing, however many reported it.

Who: An administrator, with actors:read

Parameters

  • statusstringin query
    Which cases: open (the default), actioned or dismissed. One of open, actioned, dismissed.
  • reasonstringin query
    Only cases with a report that gave this reason, by its key. At most 64 characters.
  • startintegerin query
    How many to pass over. At least 0.
  • limitintegerin query
    The most to send: 20 unless asked, 100 at most. At least 0.
  • langstringin query
    The language to word the reasons in. Accept-Language when left out.

Answers

  • 200
    OK
    object application/json
  • 400
    the request is not well formed, or a value in it is not one it may be
  • 401
    no token, or one that has expired
  • 403
    the viewer may not do this

Request

curl "https://api.example.org/abuse-reports/cases" \
  -H "Authorization: Bearer $TOKEN"

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

GET/abuse-reports/cases/{id}

With each report, and the earlier cases about the same thing.

Who: An administrator, with actors:read

Parameters

  • idintegerrequiredin path
    The case's id.
  • langstringin query
    The language to word the reasons in. Accept-Language when left out.

Answers

  • 200
    OK
    abusereport.CaseDetail application/json
  • 400
    the request is not well formed, or a value in it is not one it may be
  • 401
    no token, or one that has expired
  • 403
    the viewer may not do this
  • 404
    there is no such case

Request

curl "https://api.example.org/abuse-reports/cases/<id>" \
  -H "Authorization: Bearer $TOKEN"

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

POST/abuse-reports/cases/{id}/reopen

Who: An administrator, with actors:write

Parameters

  • idintegerrequiredin path
    The case's id.

Answers

  • 204
    open again
  • 400
    the request is not well formed, or a value in it is not one it may be
  • 401
    no token, or one that has expired
  • 403
    the viewer may not do this
  • 404
    there is no such case
  • 409
    already_open; or newer_case_open, a later case about the same thing is open
    Refusal application/json

Request

curl -X POST "https://api.example.org/abuse-reports/cases/<id>/reopen" \
  -H "Authorization: Bearer $TOKEN"

Decide a case

POST/abuse-reports/cases/{id}/resolve

Who: An administrator, with actors:write

Parameters

  • idintegerrequiredin path
    The case's id.

Body application/json

  • actionstring
    What was done: none, deleted, disabled, archived, blocked, removed_as_spam or other. One of none, deleted, disabled, archived, blocked, removed_as_spam, other.
  • notestring
    What the administrator wants remembered of it. At most 2000 characters.
  • statusstringrequired
    actioned, something was done; or dismissed, nothing needed doing. One of actioned, dismissed.

Answers

  • 204
    decided
  • 400
    the request is not well formed, or a value in it is not one it may be
  • 401
    no token, or one that has expired
  • 403
    the viewer may not do this
  • 404
    there is no such case
  • 409
    already_decided
    Refusal 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"
  }'

How many cases are open

GET/abuse-reports/cases/summary

Who: An administrator, with actors:read

Answers

Request

curl "https://api.example.org/abuse-reports/cases/summary" \
  -H "Authorization: Bearer $TOKEN"

Answer · 200

{
  "open": 1
}

A group's or an event's reports

GET/abuse-reports/profiles/{id}/cases

The 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 path
    The group's or the event's id.
  • statusstringin query
    Which cases: open (the default), actioned or dismissed. One of open, actioned, dismissed.
  • startintegerin query
    How many to pass over. At least 0.
  • limitintegerin query
    The most to send: 20 unless asked, 100 at most. At least 0.

Answers

  • 200
    OK
    object application/json
  • 400
    the request is not well formed, or a value in it is not one it may be
  • 401
    no token, or one that has expired
  • 403
    the viewer administers neither it nor the site
  • 404
    there is no such group or event

Request

curl "https://api.example.org/abuse-reports/profiles/<id>/cases" \
  -H "Authorization: Bearer $TOKEN"

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

GET/abuse-reports/reasons

The installation's list, worded in the language asked for.

Who: Somebody signed in, with account:write

Parameters

  • typestringin query
    Only the reasons for this kind of node: node.medium.text-service.note.v1 and so on. All of them when left out.
  • langstringin query
    The language to word them in. Accept-Language when left out.

Answers

  • 200
    OK
    object application/json
  • 400
    the request is not well formed, or a value in it is not one it may be
  • 401
    no token, or one that has expired
  • 403
    the viewer may not do this

Request

curl "https://api.example.org/abuse-reports/reasons" \
  -H "Authorization: Bearer $TOKEN"

Answer · 200

{
  "data": [
    {
      "description": "string",
      "key": "string",
      "label": "string",
      "requires_details": false
    }
  ]
}

Written by Claude, reviewed by Rastin Mehr · About this