Moderation

Block or mute other users, list who you've blocked or muted, and report users or messages for review.

Unlike the export, GitHub, and LinkedIn integration endpoints, every endpoint on this page accepts either a session cookie or a Bearer token: they all authenticate via getCurrentUserOrSyncToken. Native, mobile, and CLI clients that authenticate with Authorization: Bearer <token> can implement the full moderation feature set.

Path parameter note. The block, mute, and user-report routes live under /api/users/{username}/…, but the value in that segment is the target user's ID (a UUID), not their handle.

Endpoint table

MethodPathAuthDescription
GET/api/user/blocksSession or BearerList users you've blocked. Supports limit, offset.
GET/api/user/mutesSession or BearerList users you've muted. Supports limit, offset.
GET/api/users/{username}/blockSession or BearerWhether you currently block this user.
POST/api/users/{username}/blockSession or BearerBlock a user (idempotent).
DELETE/api/users/{username}/blockSession or BearerUnblock a user (idempotent).
GET/api/users/{username}/muteSession or BearerWhether you currently mute this user.
POST/api/users/{username}/muteSession or BearerMute a user (idempotent).
DELETE/api/users/{username}/muteSession or BearerUnmute a user (idempotent).
POST/api/users/{username}/reportSession or BearerReport a user.
POST/api/messages/{id}/reportSession or BearerReport a message.

Report reasons

The reason field on both report endpoints must be one of:

spam · harassment · misinformation · inappropriate · other

Any other value returns 400.

Listing blocked users

GET /api/user/blocks?limit=20&offset=0

Response (200):

{
  "blockedUsers": [
    { "id": "clx9user00002", "username": "someone", "displayName": "Some One", "avatar": null }
  ],
  "pagination": { "total": 1, "limit": 20, "offset": 0, "hasMore": false }
}

limit defaults to 20 (max 100); offset defaults to 0.

Listing muted users

GET /api/user/mutes?limit=20&offset=0

Response (200):

{
  "mutedUsers": [
    { "id": "clx9user00003", "username": "another", "displayName": "An Other", "avatar": null }
  ],
  "pagination": { "total": 1, "limit": 20, "offset": 0, "hasMore": false }
}

Checking your block/mute status

GET /api/users/clx9user00002/block

Response (200): { "blocked": true }

GET /api/users/clx9user00003/mute

Response (200): { "muted": true }

Both are directional: they report only whether you block or mute the target, not whether the target blocks or mutes you. They return 401 when unauthenticated. Use them to render the correct Block/Unblock and Mute/Unmute toggle state.

Blocking and unblocking

POST /api/users/clx9user00002/block

Response (200): { "blocked": true }

Blocking is mutual: you and the blocked user become invisible to each other (feeds, search, single messages, threads, and permalinks), neither can follow/dig/reply-to/push the other, and any existing follow in either direction is removed. Unblocking (DELETE) does not restore a removed follow.

DELETE /api/users/clx9user00002/block

Response (200): { "blocked": false }

Blocking is idempotent: blocking an already-blocked user still returns { "blocked": true }, and unblocking someone you haven't blocked still returns { "blocked": false }.

Errors:

StatusCondition
400cannot_block_self: you passed your own user ID.
401Not authenticated.
404Target user not found.

Muting and unmuting

POST /api/users/clx9user00003/mute

Response (200): { "muted": true }

DELETE /api/users/clx9user00003/mute

Response (200): { "muted": false }

Muting is idempotent. On DELETE an existing mute is removed and the call succeeds silently if none exists.

Errors:

StatusCondition
400You passed your own user ID (cannot mute yourself).
401Not authenticated.
404Target user not found.

Reporting a user

POST /api/users/clx9user00002/report
Content-Type: application/json

{ "reason": "harassment", "detail": "Optional free-text context." }

Response (200): { "reported": true }

detail is optional. Reports are idempotent per reporter/target pair: reporting the same user again updates the existing report rather than creating a duplicate.

Errors:

StatusCondition
400reason missing or not one of the valid report reasons.
400You passed your own user ID (cannot report yourself).
401Not authenticated.
404Target user not found.

Reporting a message

POST /api/messages/clx9msg000001/report
Content-Type: application/json

{ "reason": "spam", "detail": "Optional free-text context." }

Response (200): { "reported": true }

detail is optional. Reports are idempotent per reporter/message pair.

Errors:

StatusCondition
400reason missing or not one of the valid report reasons.
400You are reporting your own message.
401Not authenticated.
404Message not found.
  • Moderation (Help Center): the user-facing guide to blocking, muting, and reporting.
  • Following: the follow relationships that blocking severs.
  • API overview: base URL, authentication at a glance, and response conventions.
  • API explorer: try moderation endpoints live with the interactive Swagger console.