A community's record that a post has been removed from it. Written in the same com.atproto.repo.applyWrites commit that deletes the social.coves.community.acceptance, so the firehose never carries a half-completed moderation action. Removal is URI-scoped and terminal: it applies to the post URI across later author edits, not only to the version it pins. A post rejected at submission time was never accepted and writes no record. Removed is exited only by an explicit moderator restore: an atomic commit deleting the removal record and writing a fresh acceptance. The record key is deterministic: the unpadded lowercase base32 encoding of the SHA-256 digest of the canonical subject AT-URI (fixed 52 characters, always rkey-safe), so each post has exactly one removal rkey per community and re-removal updates the same record.
any
Any valid record key
Properties
code
string
Required
Machine-readable reason for the removal. knownValues is an open set: federated peers may send codes this AppView has not seen yet and their records must still validate, so this MUST NOT become an enum.
maxLength: 64 bytesrule-violation, spam, off-topic, illegal-content, author-banned, moderator-discretioncreatedAt
string
datetime
Required
Timestamp when the post was removed
reason
string
Optional
Human-readable explanation of the removal, shown to the author and in the moderation log
maxLength: 10000 bytesmaxGraphemes: 1000 graphemessubject
ref
com.atproto.repo.strongRef
Required
Strong reference to the removed post. The pinned CID is audit metadata recording the version present at removal time; the removal itself applies to the post URI.
View raw schema
{
"description": "A community's record that a post has been removed from it. Written in the same com.atproto.repo.applyWrites commit that deletes the social.coves.community.acceptance, so the firehose never carries a half-completed moderation action. Removal is URI-scoped and terminal: it applies to the post URI across later author edits, not only to the version it pins. A post rejected at submission time was never accepted and writes no record. Removed is exited only by an explicit moderator restore: an atomic commit deleting the removal record and writing a fresh acceptance. The record key is deterministic: the unpadded lowercase base32 encoding of the SHA-256 digest of the canonical subject AT-URI (fixed 52 characters, always rkey-safe), so each post has exactly one removal rkey per community and re-removal updates the same record.",
"key": "any",
"record": {
"properties": {
"code": {
"description": "Machine-readable reason for the removal. knownValues is an open set: federated peers may send codes this AppView has not seen yet and their records must still validate, so this MUST NOT become an enum.",
"knownValues": [
"rule-violation",
"spam",
"off-topic",
"illegal-content",
"author-banned",
"moderator-discretion"
],
"maxLength": 64,
"type": "string"
},
"createdAt": {
"description": "Timestamp when the post was removed",
"format": "datetime",
"type": "string"
},
"reason": {
"description": "Human-readable explanation of the removal, shown to the author and in the moderation log",
"maxGraphemes": 1000,
"maxLength": 10000,
"type": "string"
},
"subject": {
"description": "Strong reference to the removed post. The pinned CID is audit metadata recording the version present at removal time; the removal itself applies to the post URI.",
"ref": "com.atproto.repo.strongRef",
"type": "ref"
}
},
"required": [
"subject",
"code",
"createdAt"
],
"type": "object"
},
"type": "record"
}