app.tempomusic.staff.takedownSubject

lexicons.tempomusic.fan

Documentation

Flip `moderation_status` on a subject row to a non-zero takedown class. Read paths immediately refuse to serve the subject (404 on getPost / getReply / actor reads). Re-takedown against an already-taken-down subject is permitted as a severity escalation (e.g. `reported` → `legalHold`) or to amend the reason; each call writes a new audit row. Scoped to the subject row ONLY: an account takedown flips the profile row (offensive avatar/bio case) and does not touch the account's content — hiding everything an account produced is the job of suspendAccount/banAccount, which are enforced at read time, trivially reversible and cover content posted while sanctioned. Requires the caller to be an active moderator.

main procedure

Flip `moderation_status` on a subject row to a non-zero takedown class. Read paths immediately refuse to serve the subject (404 on getPost / getReply / actor reads). Re-takedown against an already-taken-down subject is permitted as a severity escalation (e.g. `reported` → `legalHold`) or to amend the reason; each call writes a new audit row. Scoped to the subject row ONLY: an account takedown flips the profile row (offensive avatar/bio case) and does not touch the account's content — hiding everything an account produced is the job of suspendAccount/banAccount, which are enforced at read time, trivially reversible and cover content posted while sanctioned. Requires the caller to be an active moderator.

Input

Encodingapplication/json
closeAttachedReports boolean Optional

When true, all reports against this subject still in `open` or `underReview` are marked `actioned` in the same transaction; each closed report gets a `reportClosedByCascade` audit row linked to the takedown's audit id.

notifyUser boolean Optional

When true, persist a moderation notice addressed to the affected user (content author or account holder). Delivery is out of scope.

reason string Required

Free-text reason recorded in the audit log. Mandatory.

maxLength: 1000 bytes
subject union Required

No description available.

Output

Encodingapplication/json
attachedReportsClosed integer Required

Number of attached reports auto-closed in this transaction. Zero when closeAttachedReports=false, or when there were no open/under-review reports to close.

auditEntryId integer Required

No description available.

moderationStatus integer Required

Final moderation_status value on the subject row. 1 = reported, 2 = tagged, 3 = legalHold.

Errors

Forbidden Caller is not an active moderator.
InvalidRequest Malformed request: missing required field, or invalid takedown class.
SubjectNotFound The subject does not resolve to any row in the AppView projection.
Try It

Requests are sent directly from your browser. Some servers may block requests due to CORS.

Base URL for XRPC calls (e.g., https://bsky.social)
Enter valid JSON for the request body
View raw schema
{
  "type": "procedure",
  "input": {
    "schema": {
      "type": "object",
      "required": [
        "subject",
        "class",
        "reason"
      ],
      "properties": {
        "class": {
          "ref": "app.tempomusic.staff.defs#takedownClass",
          "type": "ref"
        },
        "reason": {
          "type": "string",
          "maxLength": 1000,
          "description": "Free-text reason recorded in the audit log. Mandatory."
        },
        "subject": {
          "refs": [
            "app.tempomusic.moderation.defs#postSubject",
            "app.tempomusic.moderation.defs#replySubject",
            "app.tempomusic.moderation.defs#accountSubject"
          ],
          "type": "union"
        },
        "notifyUser": {
          "type": "boolean",
          "default": false,
          "description": "When true, persist a moderation notice addressed to the affected user (content author or account holder). Delivery is out of scope."
        },
        "closeAttachedReports": {
          "type": "boolean",
          "default": true,
          "description": "When true, all reports against this subject still in `open` or `underReview` are marked `actioned` in the same transaction; each closed report gets a `reportClosedByCascade` audit row linked to the takedown's audit id."
        }
      }
    },
    "encoding": "application/json"
  },
  "errors": [
    {
      "name": "Forbidden",
      "description": "Caller is not an active moderator."
    },
    {
      "name": "InvalidRequest",
      "description": "Malformed request: missing required field, or invalid takedown class."
    },
    {
      "name": "SubjectNotFound",
      "description": "The subject does not resolve to any row in the AppView projection."
    }
  ],
  "output": {
    "schema": {
      "type": "object",
      "required": [
        "moderationStatus",
        "attachedReportsClosed",
        "auditEntryId"
      ],
      "properties": {
        "auditEntryId": {
          "type": "integer",
          "minimum": 1
        },
        "moderationStatus": {
          "type": "integer",
          "minimum": 1,
          "description": "Final moderation_status value on the subject row. 1 = reported, 2 = tagged, 3 = legalHold."
        },
        "attachedReportsClosed": {
          "type": "integer",
          "minimum": 0,
          "description": "Number of attached reports auto-closed in this transaction. Zero when closeAttachedReports=false, or when there were no open/under-review reports to close."
        }
      }
    },
    "encoding": "application/json"
  },
  "description": "Flip `moderation_status` on a subject row to a non-zero takedown class. Read paths immediately refuse to serve the subject (404 on getPost / getReply / actor reads). Re-takedown against an already-taken-down subject is permitted as a severity escalation (e.g. `reported` → `legalHold`) or to amend the reason; each call writes a new audit row. Scoped to the subject row ONLY: an account takedown flips the profile row (offensive avatar/bio case) and does not touch the account's content — hiding everything an account produced is the job of suspendAccount/banAccount, which are enforced at read time, trivially reversible and cover content posted while sanctioned. Requires the caller to be an active moderator."
}

Lexicon Garden

@