diff --git a/public/specs/service-moderation/openapi.json b/public/specs/service-moderation/openapi.json index f6270a4..97c4c30 100644 --- a/public/specs/service-moderation/openapi.json +++ b/public/specs/service-moderation/openapi.json @@ -123,391 +123,441 @@ "type" : "string", "enum" : [ "OPEN", "COMPLETE", "INCOMPLETE" ] }, - "CompleteEvidenceCaptureRequest" : { - "description" : "Requested terminal state for an open evidence capture.", - "examples" : [ { - "status" : "COMPLETE", - "incompleteReason" : null, - "expectedMessageCount" : 12 - } ], + "CaseAssignmentFilter" : { + "type" : "string", + "enum" : [ "ANY", "ASSIGNED", "UNASSIGNED" ] + }, + "CaseAuditResponse" : { "type" : "object", - "required" : [ "status", "incompleteReason", "expectedMessageCount" ], + "required" : [ "eventId", "eventType", "actorType", "actorId", "details", "occurredAt" ], "properties" : { - "status" : { - "$ref" : "#/components/schemas/CaptureStatus" + "eventId" : { + "$ref" : "#/components/schemas/UUID" }, - "incompleteReason" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/IncompleteReason" - }, { - "type" : "null" - } ] + "eventType" : { + "type" : "string" }, - "expectedMessageCount" : { - "type" : "integer", - "format" : "int32" + "actorType" : { + "type" : "string" + }, + "actorId" : { + "type" : [ "string", "null" ] + }, + "details" : { + "$ref" : "#/components/schemas/JsonNode" + }, + "occurredAt" : { + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" } } }, - "ConfirmManualFindingRequest" : { - "description" : "Manual classification of chat evidence attached to an open case.", + "CaseDecisionRequest" : { "type" : "object", - "required" : [ "violationType", "severity", "primaryMessageId", "reason" ], "properties" : { - "violationType" : { - "$ref" : "#/components/schemas/ViolationType" - }, - "severity" : { - "$ref" : "#/components/schemas/Severity" - }, - "primaryMessageId" : { - "$ref" : "#/components/schemas/UUID" + "playerOutcome" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/PlayerCaseOutcome" + }, { + "type" : "null" + } ] }, - "supportingMessageIds" : { - "type" : "array", - "items" : { - "type" : "string", - "format" : "uuid", - "pattern" : "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}" - } + "reasonCode" : { + "type" : "string" }, - "reason" : { - "type" : "string", - "maxLength" : 2000, - "minLength" : 1, - "description" : "Required internal audit reason." + "internalReason" : { + "type" : "string" } - } + }, + "required" : [ "reasonCode", "internalReason" ] }, - "ConfirmManualFindingResponse" : { - "description" : "Minimal result of a manual finding confirmation.", + "CaseDetailResponse" : { + "description" : "Authorized Portal projection of one moderation case.", "type" : "object", - "required" : [ "findingId", "caseId", "source", "confirmedAt", "policyVersionId", "replay" ], + "required" : [ "caseId", "status", "priority", "revision", "createdAt", "updatedAt", "resolvedAt", "assignedModeratorId", "assignedAt", "reports", "audit", "primaryMessageId", "caseReference" ], "properties" : { - "findingId" : { - "$ref" : "#/components/schemas/UUID" - }, "caseId" : { "$ref" : "#/components/schemas/UUID" }, - "source" : { - "$ref" : "#/components/schemas/FindingConfirmationSource" + "status" : { + "$ref" : "#/components/schemas/CaseStatus" }, - "confirmedAt" : { + "priority" : { + "$ref" : "#/components/schemas/CasePriority" + }, + "revision" : { + "type" : "integer", + "format" : "int64" + }, + "createdAt" : { "type" : "string", "examples" : [ "2022-03-10T16:15:50Z" ], "$ref" : "#/components/schemas/Instant" }, - "policyVersionId" : { + "updatedAt" : { + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" + }, + "resolvedAt" : { + "type" : [ "string", "null" ], + "examples" : [ "2022-03-10T16:15:50Z" ], "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" + "$ref" : "#/components/schemas/Instant" }, { "type" : "null" } ] }, - "replay" : { - "type" : "boolean" - } - } - }, - "CorrectFindingRequest" : { - "description" : "Append-only correction of a confirmed moderation finding.", - "type" : "object", - "required" : [ "type", "reason" ], - "properties" : { - "type" : { - "$ref" : "#/components/schemas/FindingCorrectionType" + "assignedModeratorId" : { + "type" : [ "string", "null" ] }, - "violationType" : { + "assignedAt" : { + "type" : [ "string", "null" ], + "examples" : [ "2022-03-10T16:15:50Z" ], "anyOf" : [ { - "$ref" : "#/components/schemas/ViolationType" + "$ref" : "#/components/schemas/Instant" }, { "type" : "null" } ] }, - "severity" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/Severity" - }, { - "type" : "null" - } ] + "reports" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/CaseReportResponse" + } }, - "reason" : { + "audit" : { + "type" : [ "array", "null" ], + "items" : { + "$ref" : "#/components/schemas/CaseAuditResponse" + } + }, + "primaryMessageId" : { + "description" : "Canonical originally reported message ID stored on this case.", "type" : "string", - "maxLength" : 2000, - "minLength" : 1, - "description" : "Required internal audit reason." + "$ref" : "#/components/schemas/UUID" + }, + "caseReference" : { + "type" : "string", + "pattern" : "^C-[A-HJ-NP-Z2-9]{8}$", + "description" : "Stable internal case reference. Does not grant access.", + "examples" : [ "C-7K3M2QXY" ] } } }, - "CorrectFindingResponse" : { - "description" : "Minimal result of a finding correction.", + "CaseEvidenceResponse" : { "type" : "object", - "required" : [ "correctionId", "correctedFindingId", "replacementFindingId", "type", "correctedAt", "replay" ], + "required" : [ "messageId", "sequence", "senderPlayerId", "content", "sentAt", "role", "channel", "visibility", "participantPlayerIds", "signatureStatus" ], "properties" : { - "correctionId" : { + "messageId" : { "$ref" : "#/components/schemas/UUID" }, - "correctedFindingId" : { - "$ref" : "#/components/schemas/UUID" + "sequence" : { + "type" : "integer", + "format" : "int32" }, - "replacementFindingId" : { + "senderPlayerId" : { "anyOf" : [ { "$ref" : "#/components/schemas/UUID" }, { "type" : "null" } ] }, - "type" : { - "$ref" : "#/components/schemas/FindingCorrectionType" + "content" : { + "type" : "string" }, - "correctedAt" : { + "sentAt" : { "type" : "string", "examples" : [ "2022-03-10T16:15:50Z" ], "$ref" : "#/components/schemas/Instant" }, - "replay" : { - "type" : "boolean" + "role" : { + "$ref" : "#/components/schemas/EvidenceRole" + }, + "channel" : { + "$ref" : "#/components/schemas/MessageChannel" + }, + "visibility" : { + "$ref" : "#/components/schemas/MessageVisibility" + }, + "participantPlayerIds" : { + "type" : "array", + "items" : { + "type" : "string", + "format" : "uuid", + "pattern" : "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}" + } + }, + "signatureStatus" : { + "$ref" : "#/components/schemas/SignatureStatus" + }, + "senderPlayerName" : { + "type" : [ "string", "null" ], + "description" : "Last-known Minecraft name for the message sender." } } }, - "CreatePolicyDraftRequest" : { - "description" : "Selects the policy version copied into a new draft.", + "CaseListItemResponse" : { + "description" : "Stable, privacy-safe item in the moderation case queue.", "type" : "object", + "required" : [ "caseId", "status", "priority", "revision", "createdAt", "updatedAt", "assignedModeratorId", "assignedAt", "targetPlayerId", "category", "source", "reportCount", "evidenceStatus", "caseReference" ], "properties" : { - "basedOnPolicyVersionId" : { + "caseId" : { + "$ref" : "#/components/schemas/UUID" + }, + "status" : { + "$ref" : "#/components/schemas/CaseStatus" + }, + "priority" : { + "$ref" : "#/components/schemas/CasePriority" + }, + "revision" : { + "type" : "integer", + "format" : "int64" + }, + "createdAt" : { + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" + }, + "updatedAt" : { + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" + }, + "assignedModeratorId" : { + "type" : [ "string", "null" ] + }, + "assignedAt" : { + "type" : [ "string", "null" ], + "examples" : [ "2022-03-10T16:15:50Z" ], "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" + "$ref" : "#/components/schemas/Instant" }, { "type" : "null" } ] + }, + "targetPlayerId" : { + "$ref" : "#/components/schemas/UUID" + }, + "category" : { + "$ref" : "#/components/schemas/ReportCategory" + }, + "source" : { + "type" : [ "string", "null" ] + }, + "reportCount" : { + "type" : "integer", + "format" : "int32" + }, + "evidenceStatus" : { + "$ref" : "#/components/schemas/CaptureStatus" + }, + "caseReference" : { + "type" : "string", + "pattern" : "^C-[A-HJ-NP-Z2-9]{8}$", + "description" : "Stable internal case reference. Does not grant access.", + "examples" : [ "C-7K3M2QXY" ] + }, + "targetPlayerName" : { + "type" : [ "string", "null" ], + "description" : "Last-known Minecraft name for the target player." } } }, - "DomainModerationStatus" : { + "CasePriority" : { "type" : "string", - "enum" : [ "CLEAR", "WARNED", "RESTRICTED" ] + "enum" : [ "LOW", "NORMAL", "HIGH", "CRITICAL" ] }, - "DomainThreshold" : { + "CaseQueryPageResponse" : { "type" : "object", - "required" : [ "domain", "restrictedAt" ], + "required" : [ "items", "nextCursor" ], "properties" : { - "domain" : { - "$ref" : "#/components/schemas/RiskDomain" + "items" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/CaseListItemResponse" + } }, - "restrictedAt" : { - "type" : "integer", - "format" : "int32", - "minimum" : 1, - "description" : "Positive effective-point threshold for the restricted domain status." + "nextCursor" : { + "type" : [ "string", "null" ] } } }, - "Duration" : { + "CaseQueueTab" : { "type" : "string", - "format" : "duration" + "enum" : [ "OPEN", "MY", "COMPLETED" ] }, - "EvidenceAppendReceipt" : { - "description" : "Result of an idempotent evidence append operation.", - "examples" : [ { - "evidenceCaptureId" : "81b1174f-f634-4304-a537-31c6a416af88", - "addedCount" : 1, - "existingCount" : 0, - "storedMessageCount" : 12, - "status" : "OPEN" - } ], + "CaseReportResponse" : { "type" : "object", - "required" : [ "evidenceCaptureId", "addedCount", "existingCount", "storedMessageCount", "status" ], + "required" : [ "reportId", "type", "reporterPlayerId", "targetPlayerId", "category", "source", "submittedAt", "evidenceCaptureId", "captureStatus", "incompleteReason", "evidence" ], "properties" : { - "evidenceCaptureId" : { + "reportId" : { "$ref" : "#/components/schemas/UUID" }, - "addedCount" : { - "type" : "integer", - "format" : "int32" + "type" : { + "$ref" : "#/components/schemas/ReportType" }, - "existingCount" : { - "type" : "integer", - "format" : "int32" + "reporterPlayerId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] }, - "storedMessageCount" : { - "type" : "integer", - "format" : "int32" + "targetPlayerId" : { + "$ref" : "#/components/schemas/UUID" + }, + "category" : { + "$ref" : "#/components/schemas/ReportCategory" + }, + "source" : { + "type" : [ "string", "null" ] + }, + "submittedAt" : { + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" }, - "status" : { - "$ref" : "#/components/schemas/CaptureStatus" - } - } - }, - "EvidenceCompletionReceipt" : { - "description" : "Result of an idempotent evidence capture completion operation.", - "examples" : [ { - "evidenceCaptureId" : "81b1174f-f634-4304-a537-31c6a416af88", - "status" : "COMPLETE", - "storedMessageCount" : 12, - "changed" : true - } ], - "type" : "object", - "required" : [ "evidenceCaptureId", "status", "storedMessageCount", "changed" ], - "properties" : { "evidenceCaptureId" : { "$ref" : "#/components/schemas/UUID" }, - "status" : { + "captureStatus" : { "$ref" : "#/components/schemas/CaptureStatus" }, - "storedMessageCount" : { - "type" : "integer", - "format" : "int32" + "incompleteReason" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/IncompleteReason" + }, { + "type" : "null" + } ] }, - "changed" : { - "type" : "boolean" + "evidence" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/CaseEvidenceResponse" + } + }, + "publicReference" : { + "type" : [ "string", "null" ], + "description" : "Stored player report receipt, when available. Does not grant access.", + "examples" : [ "R-7K3M2Q" ] + }, + "targetPlayerName" : { + "type" : [ "string", "null" ], + "description" : "Last-known Minecraft name for the target player." } } }, - "EvidenceMessageRequest" : { + "CaseStatus" : { + "type" : "string", + "enum" : [ "OPEN", "IN_REVIEW", "ACTION_REQUIRED", "RESOLVED", "DISMISSED" ] + }, + "ChatMute" : { "type" : "object", - "description" : "Immutable chat message promoted to moderation evidence.", - "examples" : [ { - "messageId" : "28bb4bbf-96c4-4e9c-89b9-132553ee2e34", - "senderPlayerId" : "6be90520-6c3e-4431-a7f2-d3eadf831e17", - "content" : "Please stop sending repeated messages.", - "sentAt" : "2026-07-22T10:15:30Z", - "role" : "TARGET", - "sequence" : 0, - "channel" : "GLOBAL", - "runtimeId" : "proxy-eu-1", - "serverId" : "lobby-1", - "visibility" : "PUBLIC", - "signatureStatus" : "UNSIGNED" - } ], - "required" : [ "messageId", "senderPlayerId", "content", "sentAt", "role", "sequence", "channel", "runtimeId", "serverId", "visibility", "signatureStatus" ], + "required" : [ "id", "publicReference", "caseId", "playerId", "findingId", "environment", "revision", "status", "startsAt", "expiresAt", "safeReasonCode" ], "properties" : { - "messageId" : { - "type" : "string", - "examples" : [ "28bb4bbf-96c4-4e9c-89b9-132553ee2e34" ], + "id" : { "$ref" : "#/components/schemas/UUID" }, - "senderPlayerId" : { - "type" : "string", - "examples" : [ "6be90520-6c3e-4431-a7f2-d3eadf831e17" ], + "publicReference" : { + "type" : "string" + }, + "caseId" : { "$ref" : "#/components/schemas/UUID" }, - "content" : { - "type" : "string", - "examples" : [ "Please stop sending repeated messages." ] + "playerId" : { + "$ref" : "#/components/schemas/UUID" }, - "sentAt" : { - "type" : "string", - "examples" : [ "2026-07-22T10:15:30Z" ], - "$ref" : "#/components/schemas/Instant" + "findingId" : { + "$ref" : "#/components/schemas/UUID" }, - "role" : { - "$ref" : "#/components/schemas/EvidenceRole" + "environment" : { + "$ref" : "#/components/schemas/ModerationEnvironment" }, - "sequence" : { + "revision" : { "type" : "integer", - "format" : "int32", - "minimum" : 0, - "examples" : [ 0 ] - }, - "channel" : { - "$ref" : "#/components/schemas/MessageChannel" + "format" : "int64" }, - "runtimeId" : { - "type" : "string", - "examples" : [ "proxy-eu-1" ] + "status" : { + "$ref" : "#/components/schemas/EnforcementStatus" }, - "serverId" : { - "type" : "string", - "examples" : [ "lobby-1" ] + "startsAt" : { + "$ref" : "#/components/schemas/Instant" }, - "visibility" : { - "$ref" : "#/components/schemas/MessageVisibility" + "expiresAt" : { + "$ref" : "#/components/schemas/Instant" }, - "participantPlayerIds" : { - "type" : [ "array", "null" ], - "items" : { - "type" : "string", - "format" : "uuid", - "pattern" : "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}" - } + "safeReasonCode" : { + "type" : "string" + } + } + }, + "ChatMutePreset" : { + "type" : "object", + "required" : [ "key", "durationSeconds" ], + "properties" : { + "key" : { + "type" : "string" }, - "signedPayload" : { - "type" : [ "string", "null" ], - "format" : "byte", - "description" : "Original signed chat payload encoded as Base64." + "durationSeconds" : { + "type" : "integer", + "format" : "int64" + } + } + }, + "ChatMuteResponse" : { + "type" : "object", + "required" : [ "measure", "distribution" ], + "properties" : { + "measure" : { + "$ref" : "#/components/schemas/ChatMute" }, - "signature" : { - "type" : [ "string", "null" ], - "format" : "byte", - "description" : "Original chat signature encoded as Base64." + "distribution" : { + "$ref" : "#/components/schemas/EnforcementDistributionStatus" }, - "signatureStatus" : { - "$ref" : "#/components/schemas/SignatureStatus" + "replay" : { + "type" : "boolean" } } }, - "EvidenceRole" : { - "type" : "string", - "enum" : [ "TARGET", "CONTEXT" ] - }, - "FindingConfirmationSource" : { - "type" : "string", - "enum" : [ "MANUAL", "AUTOMATIC" ] - }, - "FindingCorrectionRelationshipResponse" : { - "description" : "Append-only correction relationship visible on a finding projection.", + "CompleteEvidenceCaptureRequest" : { + "description" : "Requested terminal state for an open evidence capture.", + "examples" : [ { + "status" : "COMPLETE", + "incompleteReason" : null, + "expectedMessageCount" : 12 + } ], "type" : "object", - "required" : [ "correctionId", "type", "replacementFindingId", "correctedAt" ], + "required" : [ "status", "incompleteReason", "expectedMessageCount" ], "properties" : { - "correctionId" : { - "$ref" : "#/components/schemas/UUID" - }, - "type" : { - "$ref" : "#/components/schemas/FindingCorrectionType" + "status" : { + "$ref" : "#/components/schemas/CaptureStatus" }, - "replacementFindingId" : { + "incompleteReason" : { "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" + "$ref" : "#/components/schemas/IncompleteReason" }, { "type" : "null" } ] }, - "correctedAt" : { - "type" : "string", - "examples" : [ "2022-03-10T16:15:50Z" ], - "$ref" : "#/components/schemas/Instant" + "expectedMessageCount" : { + "type" : "integer", + "format" : "int32" } } }, - "FindingCorrectionType" : { - "type" : "string", - "enum" : [ "INVALIDATE", "RECLASSIFY" ] - }, - "FindingQueryItemResponse" : { - "description" : "Safe portal projection of one confirmed moderation finding.", + "ConfirmManualFindingRequest" : { + "description" : "Manual classification of chat evidence attached to an open case.", "type" : "object", - "required" : [ "findingId", "findingIdentityId", "targetPlayerId", "caseId", "reportId", "primaryMessageId", "supportingMessageIds", "violationType", "severity", "source", "confirmedAt", "policyVersionId", "replacesFindingId", "correction" ], + "required" : [ "violationType", "severity", "primaryMessageId", "reason" ], "properties" : { - "findingId" : { - "$ref" : "#/components/schemas/UUID" - }, - "findingIdentityId" : { - "$ref" : "#/components/schemas/UUID" - }, - "targetPlayerId" : { - "$ref" : "#/components/schemas/UUID" - }, - "caseId" : { - "$ref" : "#/components/schemas/UUID" + "violationType" : { + "$ref" : "#/components/schemas/ViolationType" }, - "reportId" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" - }, { - "type" : "null" - } ] + "severity" : { + "$ref" : "#/components/schemas/Severity" }, "primaryMessageId" : { "$ref" : "#/components/schemas/UUID" @@ -520,11 +570,24 @@ "pattern" : "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}" } }, - "violationType" : { - "$ref" : "#/components/schemas/ViolationType" + "reason" : { + "type" : "string", + "maxLength" : 2000, + "minLength" : 1, + "description" : "Required internal audit reason." + } + } + }, + "ConfirmManualFindingResponse" : { + "description" : "Minimal result of a manual finding confirmation.", + "type" : "object", + "required" : [ "findingId", "caseId", "source", "confirmedAt", "policyVersionId", "caseRevision", "replay" ], + "properties" : { + "findingId" : { + "$ref" : "#/components/schemas/UUID" }, - "severity" : { - "$ref" : "#/components/schemas/Severity" + "caseId" : { + "$ref" : "#/components/schemas/UUID" }, "source" : { "$ref" : "#/components/schemas/FindingConfirmationSource" @@ -541,543 +604,428 @@ "type" : "null" } ] }, - "replacesFindingId" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" - }, { - "type" : "null" - } ] + "caseRevision" : { + "type" : [ "integer", "null" ], + "format" : "int64" }, - "correction" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/FindingCorrectionRelationshipResponse" - }, { - "type" : "null" - } ] + "replay" : { + "type" : "boolean" } } }, - "FindingQueryPageResponse" : { - "description" : "Cursor page of safe moderation finding projections.", + "CorrectFindingRequest" : { + "description" : "Append-only correction of a confirmed moderation finding.", "type" : "object", - "required" : [ "items", "nextCursor" ], + "required" : [ "type", "reason" ], "properties" : { - "items" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/FindingQueryItemResponse" - } + "type" : { + "$ref" : "#/components/schemas/FindingCorrectionType" }, - "nextCursor" : { - "type" : [ "string", "null" ] + "violationType" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/ViolationType" + }, { + "type" : "null" + } ] + }, + "severity" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Severity" + }, { + "type" : "null" + } ] + }, + "reason" : { + "type" : "string", + "maxLength" : 2000, + "minLength" : 1, + "description" : "Required internal audit reason." } } }, - "GlobalModerationStatus" : { - "type" : "string", - "enum" : [ "CLEAR", "WARNED", "RESTRICTED", "SUSPENDED", "BANNED" ] - }, - "IncompleteReason" : { - "type" : "string", - "enum" : [ "CONTEXT_UNAVAILABLE", "WINDOW_EXPIRED", "PRODUCER_SHUTDOWN" ] - }, - "Instant" : { - "type" : "string", - "format" : "date-time" - }, - "InternalDomainStatusResponse" : { - "description" : "Internal point and status calculation for one moderation risk domain.", - "additionalProperties" : false, + "CorrectFindingResponse" : { + "description" : "Minimal result of a finding correction.", "type" : "object", - "required" : [ "domain", "effectivePoints", "status" ], + "required" : [ "correctionId", "correctedFindingId", "replacementFindingId", "type", "correctedAt", "caseRevision", "replay" ], "properties" : { - "domain" : { - "$ref" : "#/components/schemas/RiskDomain" + "correctionId" : { + "$ref" : "#/components/schemas/UUID" }, - "effectivePoints" : { - "type" : "integer", - "format" : "int32" + "correctedFindingId" : { + "$ref" : "#/components/schemas/UUID" }, - "status" : { - "$ref" : "#/components/schemas/DomainModerationStatus" + "replacementFindingId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "type" : { + "$ref" : "#/components/schemas/FindingCorrectionType" + }, + "correctedAt" : { + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" + }, + "caseRevision" : { + "type" : [ "integer", "null" ], + "format" : "int64" + }, + "replay" : { + "type" : "boolean" } } }, - "InternalModerationStatusResponse" : { - "description" : "Internal moderation status calculation for authorized portal supporters.", - "additionalProperties" : false, + "CreateChatMuteRequest" : { "type" : "object", - "required" : [ "playerId", "domains", "pointBasedStatus", "effectiveStatus", "reasonCode", "statusSince", "earliestImprovementAt", "calculatedAt", "nextEvaluationAt", "snapshotRevision" ], + "required" : [ "operationId", "expectedCaseRevision", "presetKey", "category", "severity", "internalReason" ], "properties" : { - "playerId" : { + "operationId" : { "$ref" : "#/components/schemas/UUID" }, - "domains" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/InternalDomainStatusResponse" - } + "expectedCaseRevision" : { + "type" : "integer", + "format" : "int64" }, - "pointBasedStatus" : { - "$ref" : "#/components/schemas/GlobalModerationStatus" + "presetKey" : { + "type" : "string" }, - "effectiveStatus" : { - "$ref" : "#/components/schemas/GlobalModerationStatus" + "category" : { + "type" : "string" }, - "reasonCode" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/ModerationStatusReasonCode" - }, { - "type" : "null" - } ] + "severity" : { + "type" : "string" }, - "statusSince" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" - }, { - "type" : "null" - } ] + "internalReason" : { + "type" : "string" }, - "earliestImprovementAt" : { + "findingId" : { "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" + "$ref" : "#/components/schemas/UUID" }, { "type" : "null" } ] - }, - "calculatedAt" : { - "$ref" : "#/components/schemas/Instant" - }, - "nextEvaluationAt" : { + } + } + }, + "CreatePolicyDraftRequest" : { + "description" : "Selects the policy version copied into a new draft.", + "type" : "object", + "properties" : { + "basedOnPolicyVersionId" : { "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" + "$ref" : "#/components/schemas/UUID" }, { "type" : "null" } ] - }, - "snapshotRevision" : { - "type" : [ "integer", "null" ], - "format" : "int64" } } }, - "MessageChannel" : { + "DomainModerationStatus" : { "type" : "string", - "enum" : [ "GLOBAL", "SERVER", "GROUP", "PARTY", "PRIVATE" ] + "enum" : [ "CLEAR", "WARNED", "RESTRICTED" ] }, - "MessageVisibility" : { + "DomainThreshold" : { + "type" : "object", + "required" : [ "domain", "restrictedAt" ], + "properties" : { + "domain" : { + "$ref" : "#/components/schemas/RiskDomain" + }, + "restrictedAt" : { + "type" : "integer", + "format" : "int32", + "minimum" : 1, + "description" : "Positive effective-point threshold for the restricted domain status." + } + } + }, + "Duration" : { "type" : "string", - "enum" : [ "PUBLIC", "PRIVATE" ] + "format" : "duration" }, - "ModerationStatusReasonCode" : { + "EnforcementDistributionStatus" : { "type" : "string", - "enum" : [ "CHAT_BEHAVIOR", "SOCIAL_BEHAVIOR", "REPORT_SYSTEM_USE" ] + "enum" : [ "PENDING", "PARTIAL", "APPLIED" ] }, - "PlayerModerationStatusResponse" : { - "description" : "Player-safe projection of the current global moderation status.", - "additionalProperties" : false, + "EnforcementProxyAckRequest" : { "type" : "object", - "required" : [ "playerId", "status", "reasonCode", "statusSince", "earliestImprovementAt" ], + "required" : [ "epoch", "cursor" ], "properties" : { - "playerId" : { + "epoch" : { "$ref" : "#/components/schemas/UUID" }, - "status" : { - "$ref" : "#/components/schemas/GlobalModerationStatus" - }, - "reasonCode" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/ModerationStatusReasonCode" - }, { - "type" : "null" - } ] - }, - "statusSince" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" - }, { - "type" : "null" - } ] - }, - "earliestImprovementAt" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" - }, { - "type" : "null" - } ] + "cursor" : { + "type" : "integer", + "format" : "int64" } } }, - "PlayerReportRequest" : { - "description" : "Player report with a runtime-selected exact message anchor.", + "EnforcementStatus" : { + "type" : "string", + "enum" : [ "ACTIVE", "EXPIRED", "REVOKED" ] + }, + "EvidenceAppendReceipt" : { + "description" : "Result of an idempotent evidence append operation.", "examples" : [ { - "reporterPlayerId" : "9ad4b488-49d6-4c72-932b-98bead1fef83", - "targetPlayerId" : "6be90520-6c3e-4431-a7f2-d3eadf831e17", - "category" : "HARASSMENT", - "primaryMessageId" : "28bb4bbf-96c4-4e9c-89b9-132553ee2e34", - "origin" : { - "runtimeId" : "proxy-eu-1", - "serverId" : "lobby-1" - }, - "submittedAt" : "2026-07-22T10:15:30Z", - "initialEvidence" : [ ] + "evidenceCaptureId" : "81b1174f-f634-4304-a537-31c6a416af88", + "addedCount" : 1, + "existingCount" : 0, + "storedMessageCount" : 12, + "status" : "OPEN" } ], "type" : "object", - "required" : [ "reporterPlayerId", "targetPlayerId", "category", "primaryMessageId", "origin", "submittedAt", "initialEvidence" ], + "required" : [ "evidenceCaptureId", "addedCount", "existingCount", "storedMessageCount", "status" ], "properties" : { - "reporterPlayerId" : { - "type" : "string", - "examples" : [ "9ad4b488-49d6-4c72-932b-98bead1fef83" ], - "$ref" : "#/components/schemas/UUID" - }, - "targetPlayerId" : { - "type" : "string", - "examples" : [ "6be90520-6c3e-4431-a7f2-d3eadf831e17" ], + "evidenceCaptureId" : { "$ref" : "#/components/schemas/UUID" }, - "category" : { - "$ref" : "#/components/schemas/ReportCategory" - }, - "primaryMessageId" : { - "type" : "string", - "examples" : [ "28bb4bbf-96c4-4e9c-89b9-132553ee2e34" ], - "$ref" : "#/components/schemas/UUID" + "addedCount" : { + "type" : "integer", + "format" : "int32" }, - "origin" : { - "$ref" : "#/components/schemas/ReportOrigin" + "existingCount" : { + "type" : "integer", + "format" : "int32" }, - "submittedAt" : { - "type" : "string", - "examples" : [ "2026-07-22T10:15:30Z" ], - "$ref" : "#/components/schemas/Instant" + "storedMessageCount" : { + "type" : "integer", + "format" : "int32" }, - "initialEvidence" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/EvidenceMessageRequest" - } + "status" : { + "$ref" : "#/components/schemas/CaptureStatus" } } }, - "PolicyDocument" : { - "type" : "object", - "required" : [ "schemaVersion", "riskRules", "domainThresholds", "automaticConfirmationRules" ], - "properties" : { - "schemaVersion" : { - "type" : "integer", - "format" : "int32", - "maximum" : 2, - "minimum" : 2, - "description" : "Policy document schema version supported by this service release." + "EvidenceCompletionReceipt" : { + "description" : "Result of an idempotent evidence capture completion operation.", + "examples" : [ { + "evidenceCaptureId" : "81b1174f-f634-4304-a537-31c6a416af88", + "status" : "COMPLETE", + "storedMessageCount" : 12, + "changed" : true + } ], + "type" : "object", + "required" : [ "evidenceCaptureId", "status", "storedMessageCount", "changed" ], + "properties" : { + "evidenceCaptureId" : { + "$ref" : "#/components/schemas/UUID" }, - "riskRules" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/RiskRule" - }, - "description" : "Complete matrix of eight violation types and four severities.", - "maxItems" : 32, - "minItems" : 32 + "status" : { + "$ref" : "#/components/schemas/CaptureStatus" }, - "domainThresholds" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/DomainThreshold" - }, - "description" : "Exactly one restriction threshold for each risk domain.", - "maxItems" : 3, - "minItems" : 3 + "storedMessageCount" : { + "type" : "integer", + "format" : "int32" }, - "automaticConfirmationRules" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/AutomaticConfirmationRule" - } + "changed" : { + "type" : "boolean" } } }, - "PolicyLifecycleRequest" : { - "description" : "Audit reason for a policy lifecycle mutation.", + "EvidenceMessageRequest" : { "type" : "object", - "required" : [ "reason" ], + "description" : "Immutable chat message promoted to moderation evidence.", + "examples" : [ { + "messageId" : "28bb4bbf-96c4-4e9c-89b9-132553ee2e34", + "senderPlayerId" : "6be90520-6c3e-4431-a7f2-d3eadf831e17", + "content" : "Please stop sending repeated messages.", + "sentAt" : "2026-07-22T10:15:30Z", + "role" : "TARGET", + "sequence" : 0, + "channel" : "GLOBAL", + "runtimeId" : "proxy-eu-1", + "serverId" : "lobby-1", + "visibility" : "PUBLIC", + "signatureStatus" : "UNSIGNED" + } ], + "required" : [ "messageId", "senderPlayerId", "content", "sentAt", "role", "sequence", "channel", "runtimeId", "serverId", "visibility", "signatureStatus" ], "properties" : { - "reason" : { + "messageId" : { "type" : "string", - "maxLength" : 2000, - "minLength" : 1, - "description" : "Required audit reason." - } - } - }, - "PolicyStatus" : { - "type" : "string", - "enum" : [ "DRAFT", "SCHEDULED", "ACTIVE", "RETIRED" ] - }, - "PolicyTaxonomyResponse" : { - "description" : "Closed moderation taxonomy used by every policy document.", - "type" : "object", - "required" : [ "riskDomains", "violationTypes", "severities", "policyStatuses", "automaticConfirmationSources", "automaticConfirmationModes" ], - "properties" : { - "riskDomains" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/RiskDomain" - } + "examples" : [ "28bb4bbf-96c4-4e9c-89b9-132553ee2e34" ], + "$ref" : "#/components/schemas/UUID" }, - "violationTypes" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/ViolationTypeResponse" - } + "senderPlayerId" : { + "type" : "string", + "examples" : [ "6be90520-6c3e-4431-a7f2-d3eadf831e17" ], + "$ref" : "#/components/schemas/UUID" }, - "severities" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/Severity" - } + "content" : { + "type" : "string", + "examples" : [ "Please stop sending repeated messages." ] }, - "policyStatuses" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/PolicyStatus" - } + "sentAt" : { + "type" : "string", + "examples" : [ "2026-07-22T10:15:30Z" ], + "$ref" : "#/components/schemas/Instant" }, - "automaticConfirmationSources" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/AutomaticConfirmationSource" - } + "role" : { + "$ref" : "#/components/schemas/EvidenceRole" }, - "automaticConfirmationModes" : { - "type" : "array", + "sequence" : { + "type" : "integer", + "format" : "int32", + "minimum" : 0, + "examples" : [ 0 ] + }, + "channel" : { + "$ref" : "#/components/schemas/MessageChannel" + }, + "runtimeId" : { + "type" : "string", + "examples" : [ "proxy-eu-1" ] + }, + "serverId" : { + "type" : "string", + "examples" : [ "lobby-1" ] + }, + "visibility" : { + "$ref" : "#/components/schemas/MessageVisibility" + }, + "participantPlayerIds" : { + "type" : [ "array", "null" ], "items" : { - "$ref" : "#/components/schemas/AutomaticConfirmationMode" + "type" : "string", + "format" : "uuid", + "pattern" : "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}" } + }, + "signedPayload" : { + "type" : [ "string", "null" ], + "format" : "byte", + "description" : "Original signed chat payload encoded as Base64." + }, + "signature" : { + "type" : [ "string", "null" ], + "format" : "byte", + "description" : "Original chat signature encoded as Base64." + }, + "signatureStatus" : { + "$ref" : "#/components/schemas/SignatureStatus" } } }, - "PolicyVersionResponse" : { - "description" : "Complete immutable snapshot and lifecycle state of a policy version.", + "EvidenceRole" : { + "type" : "string", + "enum" : [ "TARGET", "CONTEXT" ] + }, + "FindingConfirmationSource" : { + "type" : "string", + "enum" : [ "MANUAL", "AUTOMATIC" ] + }, + "FindingCorrectionRelationshipResponse" : { + "description" : "Append-only correction relationship visible on a finding projection.", "type" : "object", - "required" : [ "id", "versionNumber", "status", "document", "draftRevision", "scheduledFor", "activatedAt" ], + "required" : [ "correctionId", "type", "replacementFindingId", "correctedAt" ], "properties" : { - "id" : { + "correctionId" : { "$ref" : "#/components/schemas/UUID" }, - "versionNumber" : { - "type" : "integer", - "format" : "int64" - }, - "status" : { - "$ref" : "#/components/schemas/PolicyStatus" - }, - "document" : { - "$ref" : "#/components/schemas/PolicyDocument" - }, - "draftRevision" : { - "type" : "integer", - "format" : "int64" + "type" : { + "$ref" : "#/components/schemas/FindingCorrectionType" }, - "scheduledFor" : { + "replacementFindingId" : { "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" + "$ref" : "#/components/schemas/UUID" }, { "type" : "null" } ] }, - "activatedAt" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" - }, { - "type" : "null" - } ] + "correctedAt" : { + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" } } }, - "ProblemDetails" : { - "description" : "RFC 9457 problem details returned for rejected moderation API requests.", - "examples" : [ { - "type" : "https://api.grounds.gg/problems/moderation-intake/422", - "title" : "Unprocessable Content", - "status" : 422, - "detail" : "Evidence is invalid" - } ], + "FindingCorrectionType" : { + "type" : "string", + "enum" : [ "INVALIDATE", "RECLASSIFY" ] + }, + "FindingQueryItemResponse" : { + "description" : "Safe portal projection of one confirmed moderation finding.", "type" : "object", - "required" : [ "type", "title", "status", "detail" ], + "required" : [ "findingId", "findingIdentityId", "targetPlayerId", "caseId", "reportId", "primaryMessageId", "supportingMessageIds", "violationType", "severity", "source", "confirmedAt", "policyVersionId", "replacesFindingId", "correction" ], "properties" : { - "type" : { - "type" : "string" - }, - "title" : { - "type" : "string" + "findingId" : { + "$ref" : "#/components/schemas/UUID" }, - "status" : { - "type" : "integer", - "format" : "int32" + "findingIdentityId" : { + "$ref" : "#/components/schemas/UUID" }, - "detail" : { - "type" : "string" + "targetPlayerId" : { + "$ref" : "#/components/schemas/UUID" }, - "code" : { - "type" : [ "string", "null" ] + "caseId" : { + "$ref" : "#/components/schemas/UUID" }, - "findingId" : { + "reportId" : { "anyOf" : [ { "$ref" : "#/components/schemas/UUID" }, { "type" : "null" } ] - } - } - }, - "ReplacePolicyDraftRequest" : { - "description" : "Complete validated document replacing the current draft snapshot.", - "type" : "object", - "required" : [ "document" ], - "properties" : { - "document" : { - "$ref" : "#/components/schemas/PolicyDocument" - } - } - }, - "ReportCategory" : { - "type" : "string", - "enum" : [ "HARASSMENT", "SPAM", "THREAT_OR_HATE", "ADVERTISEMENT_OR_SCAM", "OTHER" ] - }, - "ReportOrigin" : { - "type" : "object", - "description" : "Runtime origin of a report or evidence message.", - "examples" : [ { - "runtimeId" : "proxy-eu-1", - "serverId" : "lobby-1" - } ], - "required" : [ "runtimeId", "serverId" ], - "properties" : { - "runtimeId" : { - "type" : "string", - "examples" : [ "proxy-eu-1" ] }, - "serverId" : { - "type" : "string", - "examples" : [ "lobby-1" ] - } - } - }, - "ReportReceipt" : { - "description" : "Stable technical receipt returned for a report submission.", - "examples" : [ { - "reportId" : "8ca93f15-2e91-43c8-af84-faa9ea9d5669", - "caseId" : "a1637fc1-30ba-4650-b438-8040fadf92f3", - "evidenceCaptureId" : "81b1174f-f634-4304-a537-31c6a416af88", - "publicReference" : "R-7K3M2Q", - "created" : true - } ], - "type" : "object", - "required" : [ "reportId", "caseId", "evidenceCaptureId" ], - "properties" : { - "reportId" : { - "type" : "string", - "examples" : [ "8ca93f15-2e91-43c8-af84-faa9ea9d5669" ], + "primaryMessageId" : { "$ref" : "#/components/schemas/UUID" }, - "caseId" : { - "type" : "string", - "examples" : [ "a1637fc1-30ba-4650-b438-8040fadf92f3" ], - "$ref" : "#/components/schemas/UUID" + "supportingMessageIds" : { + "type" : "array", + "items" : { + "type" : "string", + "format" : "uuid", + "pattern" : "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}" + } }, - "evidenceCaptureId" : { - "type" : "string", - "examples" : [ "81b1174f-f634-4304-a537-31c6a416af88" ], - "$ref" : "#/components/schemas/UUID" + "violationType" : { + "$ref" : "#/components/schemas/ViolationType" }, - "publicReference" : { - "type" : [ "string", "null" ], - "pattern" : "^R-[A-HJ-NP-Z2-9]{6}$", - "examples" : [ "R-7K3M2Q" ] + "severity" : { + "$ref" : "#/components/schemas/Severity" }, - "created" : { - "type" : "boolean", - "examples" : [ true ] - } - } - }, - "RiskDomain" : { - "type" : "string", - "enum" : [ "CHAT", "SOCIAL", "REPORT_ABUSE" ] - }, - "RiskLedgerEntrySource" : { - "type" : "string", - "enum" : [ "MANUAL", "AUTOMATIC", "CORRECTION" ] - }, - "RiskLedgerQueryItemResponse" : { - "description" : "Internal risk ledger projection available only to authorized supporters.", - "type" : "object", - "required" : [ "ledgerEntryId", "findingId", "correctionId", "originLedgerEntryId", "riskDomain", "violationType", "severity", "signedPoints", "effectiveAt", "expiresAt", "policyVersionId", "source" ], - "properties" : { - "ledgerEntryId" : { - "$ref" : "#/components/schemas/UUID" + "source" : { + "$ref" : "#/components/schemas/FindingConfirmationSource" }, - "findingId" : { + "confirmedAt" : { + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" + }, + "policyVersionId" : { "anyOf" : [ { "$ref" : "#/components/schemas/UUID" }, { "type" : "null" } ] }, - "correctionId" : { + "replacesFindingId" : { "anyOf" : [ { "$ref" : "#/components/schemas/UUID" }, { "type" : "null" } ] }, - "originLedgerEntryId" : { + "correction" : { "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" + "$ref" : "#/components/schemas/FindingCorrectionRelationshipResponse" }, { "type" : "null" } ] - }, - "riskDomain" : { - "$ref" : "#/components/schemas/RiskDomain" - }, - "violationType" : { - "$ref" : "#/components/schemas/ViolationType" - }, - "severity" : { - "$ref" : "#/components/schemas/Severity" - }, - "signedPoints" : { - "type" : "integer", - "format" : "int32" - }, - "effectiveAt" : { - "type" : "string", - "examples" : [ "2022-03-10T16:15:50Z" ], - "$ref" : "#/components/schemas/Instant" - }, - "expiresAt" : { - "type" : "string", - "examples" : [ "2022-03-10T16:15:50Z" ], - "$ref" : "#/components/schemas/Instant" - }, - "policyVersionId" : { - "$ref" : "#/components/schemas/UUID" - }, - "source" : { - "$ref" : "#/components/schemas/RiskLedgerEntrySource" } } }, - "RiskLedgerQueryPageResponse" : { - "description" : "Cursor page of internal risk ledger entries.", + "FindingQueryPageResponse" : { + "description" : "Cursor page of safe moderation finding projections.", "type" : "object", "required" : [ "items", "nextCursor" ], "properties" : { "items" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/RiskLedgerQueryItemResponse" + "$ref" : "#/components/schemas/FindingQueryItemResponse" } }, "nextCursor" : { @@ -1085,128 +1033,266 @@ } } }, - "RiskRule" : { + "GlobalModerationStatus" : { + "type" : "string", + "enum" : [ "CLEAR", "WARNED", "RESTRICTED", "SUSPENDED", "BANNED" ] + }, + "IncompleteReason" : { + "type" : "string", + "enum" : [ "CONTEXT_UNAVAILABLE", "WINDOW_EXPIRED", "PRODUCER_SHUTDOWN" ] + }, + "Instant" : { + "type" : "string", + "format" : "date-time" + }, + "InternalDomainStatusResponse" : { + "description" : "Internal point and status calculation for one moderation risk domain.", + "additionalProperties" : false, "type" : "object", - "required" : [ "violationType", "severity", "points", "ttl", "enabled" ], + "required" : [ "domain", "effectivePoints", "status" ], "properties" : { - "violationType" : { - "$ref" : "#/components/schemas/ViolationType" - }, - "severity" : { - "$ref" : "#/components/schemas/Severity" + "domain" : { + "$ref" : "#/components/schemas/RiskDomain" }, - "points" : { + "effectivePoints" : { "type" : "integer", - "format" : "int32", - "minimum" : 1, - "description" : "Positive risk points contributed by this rule." - }, - "ttl" : { - "description" : "Positive ISO-8601 duration for which the risk contribution remains active.", - "type" : "string", - "examples" : [ "P14D" ], - "$ref" : "#/components/schemas/Duration" + "format" : "int32" }, - "enabled" : { - "type" : "boolean" + "status" : { + "$ref" : "#/components/schemas/DomainModerationStatus" } } }, - "SchedulePolicyRequest" : { - "description" : "Future activation time and audit reason for a policy draft.", + "InternalModerationStatusResponse" : { + "description" : "Internal moderation status calculation for authorized portal supporters.", + "additionalProperties" : false, "type" : "object", - "required" : [ "activateAt", "reason" ], + "required" : [ "playerId", "domains", "pointBasedStatus", "effectiveStatus", "reasonCode", "statusSince", "earliestImprovementAt", "calculatedAt", "nextEvaluationAt", "snapshotRevision" ], "properties" : { - "activateAt" : { - "description" : "Future UTC time at which the policy should become active.", - "type" : "string", - "examples" : [ "2022-03-10T16:15:50Z" ], - "$ref" : "#/components/schemas/Instant" + "playerId" : { + "$ref" : "#/components/schemas/UUID" }, - "reason" : { - "type" : "string", - "maxLength" : 2000, - "minLength" : 1, - "description" : "Required audit reason." - } - } - }, - "Severity" : { - "type" : "string", - "enum" : [ "LOW", "MEDIUM", "HIGH", "CRITICAL" ] - }, - "SignatureStatus" : { - "type" : "string", - "enum" : [ "VALID", "INVALID", "UNSIGNED", "NOT_APPLICABLE" ] - }, - "SystemMessageReportRequest" : { - "description" : "Exact message report produced by an authorized detector.", - "examples" : [ { - "targetPlayerId" : "6be90520-6c3e-4431-a7f2-d3eadf831e17", - "category" : "SPAM", - "primaryMessageId" : "28bb4bbf-96c4-4e9c-89b9-132553ee2e34", - "origin" : { - "runtimeId" : "proxy-eu-1", - "serverId" : "lobby-1" + "domains" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/InternalDomainStatusResponse" + } }, - "submittedAt" : "2026-07-22T10:15:30Z", - "source" : "static-filter", - "detectedCategory" : "SPAM", - "detectorVersion" : "2026.07", - "ruleId" : "repeated-message", - "scores" : { - "spam" : 0.97 + "pointBasedStatus" : { + "$ref" : "#/components/schemas/GlobalModerationStatus" }, - "initialEvidence" : [ ] - } ], - "type" : "object", - "required" : [ "targetPlayerId", "category", "primaryMessageId", "origin", "submittedAt", "source", "detectedCategory", "detectorVersion", "ruleId", "initialEvidence" ], - "properties" : { - "targetPlayerId" : { - "type" : "string", - "examples" : [ "6be90520-6c3e-4431-a7f2-d3eadf831e17" ], - "$ref" : "#/components/schemas/UUID" + "effectiveStatus" : { + "$ref" : "#/components/schemas/GlobalModerationStatus" }, - "category" : { - "$ref" : "#/components/schemas/ReportCategory" + "reasonCode" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/ModerationStatusReasonCode" + }, { + "type" : "null" + } ] }, - "primaryMessageId" : { - "type" : "string", - "examples" : [ "28bb4bbf-96c4-4e9c-89b9-132553ee2e34" ], - "$ref" : "#/components/schemas/UUID" + "statusSince" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] }, + "earliestImprovementAt" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + }, + "calculatedAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "nextEvaluationAt" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + }, + "snapshotRevision" : { + "type" : [ "integer", "null" ], + "format" : "int64" + } + } + }, + "JsonNode" : { + "type" : "object", + "properties" : { + "empty" : { + "type" : "boolean" + }, + "valueNode" : { + "type" : "boolean" + }, + "containerNode" : { + "type" : "boolean" + }, + "missingNode" : { + "type" : "boolean" + }, + "array" : { + "type" : "boolean" + }, + "object" : { + "type" : "boolean" + }, + "nodeType" : { + "$ref" : "#/components/schemas/JsonNodeType" + }, + "pojo" : { + "type" : "boolean" + }, + "number" : { + "type" : "boolean" + }, + "integralNumber" : { + "type" : "boolean" + }, + "floatingPointNumber" : { + "type" : "boolean" + }, + "short" : { + "type" : "boolean" + }, + "int" : { + "type" : "boolean" + }, + "long" : { + "type" : "boolean" + }, + "float" : { + "type" : "boolean" + }, + "double" : { + "type" : "boolean" + }, + "bigDecimal" : { + "type" : "boolean" + }, + "bigInteger" : { + "type" : "boolean" + }, + "textual" : { + "type" : "boolean" + }, + "boolean" : { + "type" : "boolean" + }, + "null" : { + "type" : "boolean" + }, + "binary" : { + "type" : "boolean" + } + } + }, + "JsonNodeType" : { + "type" : "string", + "enum" : [ "ARRAY", "BINARY", "BOOLEAN", "MISSING", "NULL", "NUMBER", "OBJECT", "POJO", "STRING" ] + }, + "MessageChannel" : { + "type" : "string", + "enum" : [ "GLOBAL", "SERVER", "GROUP", "PARTY", "PRIVATE" ] + }, + "MessageVisibility" : { + "type" : "string", + "enum" : [ "PUBLIC", "PRIVATE" ] + }, + "ModerationEnvironment" : { + "type" : "string", + "enum" : [ "stage", "prod" ] + }, + "ModerationStatusReasonCode" : { + "type" : "string", + "enum" : [ "CHAT_BEHAVIOR", "SOCIAL_BEHAVIOR", "REPORT_SYSTEM_USE" ] + }, + "PlayerCaseOutcome" : { + "type" : "string", + "enum" : [ "MEASURES_TAKEN", "NO_MEASURES_TAKEN" ] + }, + "PlayerModerationStatusResponse" : { + "description" : "Player-safe projection of the current global moderation status.", + "additionalProperties" : false, + "type" : "object", + "required" : [ "playerId", "status", "reasonCode", "statusSince", "earliestImprovementAt" ], + "properties" : { + "playerId" : { + "$ref" : "#/components/schemas/UUID" + }, + "status" : { + "$ref" : "#/components/schemas/GlobalModerationStatus" + }, + "reasonCode" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/ModerationStatusReasonCode" + }, { + "type" : "null" + } ] + }, + "statusSince" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + }, + "earliestImprovementAt" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + } + } + }, + "PlayerReportRequest" : { + "description" : "Player report with a runtime-selected exact message anchor.", + "examples" : [ { + "reporterPlayerId" : "9ad4b488-49d6-4c72-932b-98bead1fef83", + "targetPlayerId" : "6be90520-6c3e-4431-a7f2-d3eadf831e17", + "category" : "HARASSMENT", + "primaryMessageId" : "28bb4bbf-96c4-4e9c-89b9-132553ee2e34", "origin" : { - "$ref" : "#/components/schemas/ReportOrigin" + "runtimeId" : "proxy-eu-1", + "serverId" : "lobby-1" }, - "submittedAt" : { + "submittedAt" : "2026-07-22T10:15:30Z", + "initialEvidence" : [ ] + } ], + "type" : "object", + "required" : [ "reporterPlayerId", "targetPlayerId", "category", "primaryMessageId", "origin", "submittedAt", "initialEvidence" ], + "properties" : { + "reporterPlayerId" : { "type" : "string", - "examples" : [ "2026-07-22T10:15:30Z" ], - "$ref" : "#/components/schemas/Instant" + "examples" : [ "9ad4b488-49d6-4c72-932b-98bead1fef83" ], + "$ref" : "#/components/schemas/UUID" }, - "source" : { + "targetPlayerId" : { "type" : "string", - "examples" : [ "static-filter" ] + "examples" : [ "6be90520-6c3e-4431-a7f2-d3eadf831e17" ], + "$ref" : "#/components/schemas/UUID" }, - "detectedCategory" : { + "category" : { "$ref" : "#/components/schemas/ReportCategory" }, - "detectorVersion" : { + "primaryMessageId" : { "type" : "string", - "examples" : [ "2026.07" ] + "examples" : [ "28bb4bbf-96c4-4e9c-89b9-132553ee2e34" ], + "$ref" : "#/components/schemas/UUID" }, - "ruleId" : { - "type" : "string", - "examples" : [ "repeated-message" ] + "origin" : { + "$ref" : "#/components/schemas/ReportOrigin" }, - "scores" : { - "type" : [ "object", "null" ], - "additionalProperties" : { - "type" : "number", - "format" : "double" - }, - "examples" : [ { - "spam" : 0.97 - } ] + "submittedAt" : { + "type" : "string", + "examples" : [ "2026-07-22T10:15:30Z" ], + "$ref" : "#/components/schemas/Instant" }, "initialEvidence" : { "type" : "array", @@ -1216,320 +1302,1847 @@ } } }, - "UUID" : { + "PlayerReportState" : { "type" : "string", - "format" : "uuid", - "pattern" : "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}" + "enum" : [ "RECEIVED", "UNDER_REVIEW", "COMPLETED_MEASURES", "COMPLETED_NO_MEASURES" ] }, - "ViolationType" : { - "type" : "string", - "enum" : [ "ABUSIVE_LANGUAGE", "SPAM", "ADVERTISEMENT_OR_SCAM", "HARASSMENT", "THREAT_OR_HATE", "SEXUAL_CONTENT", "PERSONAL_DATA_EXPOSURE", "REPORT_ABUSE" ] + "PlayerReportStatusListResponse" : { + "type" : "object", + "required" : [ "items" ], + "properties" : { + "items" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/PlayerReportStatusResponse" + } + } + } }, - "ViolationTypeResponse" : { + "PlayerReportStatusResponse" : { "type" : "object", - "description" : "Fixed violation type and its code-defined risk domain.", - "required" : [ "type", "domain" ], + "required" : [ "publicReference", "state", "submittedAt", "updatedAt", "completedAt" ], "properties" : { - "type" : { - "$ref" : "#/components/schemas/ViolationType" + "publicReference" : { + "type" : "string" + }, + "state" : { + "$ref" : "#/components/schemas/PlayerReportState" + }, + "submittedAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "updatedAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "completedAt" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + } + } + }, + "PolicyDocument" : { + "type" : "object", + "required" : [ "schemaVersion", "riskRules", "domainThresholds", "automaticConfirmationRules" ], + "properties" : { + "schemaVersion" : { + "type" : "integer", + "format" : "int32", + "maximum" : 2, + "minimum" : 2, + "description" : "Policy document schema version supported by this service release." + }, + "riskRules" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/RiskRule" + }, + "description" : "Complete matrix of eight violation types and four severities.", + "maxItems" : 32, + "minItems" : 32 + }, + "domainThresholds" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/DomainThreshold" + }, + "description" : "Exactly one restriction threshold for each risk domain.", + "maxItems" : 3, + "minItems" : 3 + }, + "automaticConfirmationRules" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/AutomaticConfirmationRule" + } + } + } + }, + "PolicyLifecycleRequest" : { + "description" : "Audit reason for a policy lifecycle mutation.", + "type" : "object", + "required" : [ "reason" ], + "properties" : { + "reason" : { + "type" : "string", + "maxLength" : 2000, + "minLength" : 1, + "description" : "Required audit reason." + } + } + }, + "PolicyStatus" : { + "type" : "string", + "enum" : [ "DRAFT", "SCHEDULED", "ACTIVE", "RETIRED" ] + }, + "PolicyTaxonomyResponse" : { + "description" : "Closed moderation taxonomy used by every policy document.", + "type" : "object", + "required" : [ "riskDomains", "violationTypes", "severities", "policyStatuses", "automaticConfirmationSources", "automaticConfirmationModes" ], + "properties" : { + "riskDomains" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/RiskDomain" + } + }, + "violationTypes" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/ViolationTypeResponse" + } + }, + "severities" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Severity" + } + }, + "policyStatuses" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/PolicyStatus" + } + }, + "automaticConfirmationSources" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/AutomaticConfirmationSource" + } + }, + "automaticConfirmationModes" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/AutomaticConfirmationMode" + } + } + } + }, + "PolicyVersionResponse" : { + "description" : "Complete immutable snapshot and lifecycle state of a policy version.", + "type" : "object", + "required" : [ "id", "versionNumber", "status", "document", "draftRevision", "scheduledFor", "activatedAt" ], + "properties" : { + "id" : { + "$ref" : "#/components/schemas/UUID" + }, + "versionNumber" : { + "type" : "integer", + "format" : "int64" + }, + "status" : { + "$ref" : "#/components/schemas/PolicyStatus" + }, + "document" : { + "$ref" : "#/components/schemas/PolicyDocument" + }, + "draftRevision" : { + "type" : "integer", + "format" : "int64" + }, + "scheduledFor" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + }, + "activatedAt" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + } + } + }, + "ProblemDetails" : { + "description" : "RFC 9457 problem details returned for rejected moderation API requests.", + "examples" : [ { + "type" : "https://api.grounds.gg/problems/moderation-intake/422", + "title" : "Unprocessable Content", + "status" : 422, + "detail" : "Evidence is invalid" + } ], + "type" : "object", + "required" : [ "type", "title", "status", "detail" ], + "properties" : { + "type" : { + "type" : "string" + }, + "title" : { + "type" : "string" + }, + "status" : { + "type" : "integer", + "format" : "int32" + }, + "detail" : { + "type" : "string" + }, + "code" : { + "type" : [ "string", "null" ] + }, + "findingId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + } + } + }, + "ReassignCaseRequest" : { + "type" : "object", + "required" : [ "moderatorId", "reason" ], + "properties" : { + "moderatorId" : { + "type" : [ "string", "null" ] + }, + "reason" : { + "type" : "string" + } + } + }, + "RegisterEnforcementProxyRequest" : { + "type" : "object", + "required" : [ "bootNonce" ], + "properties" : { + "bootNonce" : { + "$ref" : "#/components/schemas/UUID" + } + } + }, + "ReplacePolicyDraftRequest" : { + "description" : "Complete validated document replacing the current draft snapshot.", + "type" : "object", + "required" : [ "document" ], + "properties" : { + "document" : { + "$ref" : "#/components/schemas/PolicyDocument" + } + } + }, + "ReportCategory" : { + "type" : "string", + "enum" : [ "HARASSMENT", "SPAM", "THREAT_OR_HATE", "ADVERTISEMENT_OR_SCAM", "OTHER" ] + }, + "ReportOrigin" : { + "type" : "object", + "description" : "Runtime origin of a report or evidence message.", + "examples" : [ { + "runtimeId" : "proxy-eu-1", + "serverId" : "lobby-1" + } ], + "required" : [ "runtimeId", "serverId" ], + "properties" : { + "runtimeId" : { + "type" : "string", + "examples" : [ "proxy-eu-1" ] + }, + "serverId" : { + "type" : "string", + "examples" : [ "lobby-1" ] + } + } + }, + "ReportReceipt" : { + "description" : "Stable technical receipt returned for a report submission.", + "examples" : [ { + "reportId" : "8ca93f15-2e91-43c8-af84-faa9ea9d5669", + "caseId" : "a1637fc1-30ba-4650-b438-8040fadf92f3", + "evidenceCaptureId" : "81b1174f-f634-4304-a537-31c6a416af88", + "publicReference" : "R-7K3M2Q", + "created" : true + } ], + "type" : "object", + "required" : [ "reportId", "caseId", "evidenceCaptureId" ], + "properties" : { + "reportId" : { + "type" : "string", + "examples" : [ "8ca93f15-2e91-43c8-af84-faa9ea9d5669" ], + "$ref" : "#/components/schemas/UUID" + }, + "caseId" : { + "type" : "string", + "examples" : [ "a1637fc1-30ba-4650-b438-8040fadf92f3" ], + "$ref" : "#/components/schemas/UUID" + }, + "evidenceCaptureId" : { + "type" : "string", + "examples" : [ "81b1174f-f634-4304-a537-31c6a416af88" ], + "$ref" : "#/components/schemas/UUID" + }, + "publicReference" : { + "type" : [ "string", "null" ], + "pattern" : "^R-[A-HJ-NP-Z2-9]{6}$", + "examples" : [ "R-7K3M2Q" ] + }, + "created" : { + "type" : "boolean", + "examples" : [ true ] + } + } + }, + "ReportType" : { + "type" : "string", + "enum" : [ "PLAYER_REPORT", "SYSTEM_MESSAGE_REPORT" ] + }, + "RevokeChatMuteRequest" : { + "type" : "object", + "required" : [ "operationId", "expectedRevision", "internalReason" ], + "properties" : { + "operationId" : { + "$ref" : "#/components/schemas/UUID" + }, + "expectedRevision" : { + "type" : "integer", + "format" : "int64" + }, + "internalReason" : { + "type" : "string" + } + } + }, + "RiskDomain" : { + "type" : "string", + "enum" : [ "CHAT", "SOCIAL", "REPORT_ABUSE" ] + }, + "RiskLedgerEntrySource" : { + "type" : "string", + "enum" : [ "MANUAL", "AUTOMATIC", "CORRECTION" ] + }, + "RiskLedgerQueryItemResponse" : { + "description" : "Internal risk ledger projection available only to authorized supporters.", + "type" : "object", + "required" : [ "ledgerEntryId", "findingId", "correctionId", "originLedgerEntryId", "riskDomain", "violationType", "severity", "signedPoints", "effectiveAt", "expiresAt", "policyVersionId", "source" ], + "properties" : { + "ledgerEntryId" : { + "$ref" : "#/components/schemas/UUID" + }, + "findingId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "correctionId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "originLedgerEntryId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "riskDomain" : { + "$ref" : "#/components/schemas/RiskDomain" + }, + "violationType" : { + "$ref" : "#/components/schemas/ViolationType" + }, + "severity" : { + "$ref" : "#/components/schemas/Severity" + }, + "signedPoints" : { + "type" : "integer", + "format" : "int32" + }, + "effectiveAt" : { + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" + }, + "expiresAt" : { + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" + }, + "policyVersionId" : { + "$ref" : "#/components/schemas/UUID" + }, + "source" : { + "$ref" : "#/components/schemas/RiskLedgerEntrySource" + } + } + }, + "RiskLedgerQueryPageResponse" : { + "description" : "Cursor page of internal risk ledger entries.", + "type" : "object", + "required" : [ "items", "nextCursor" ], + "properties" : { + "items" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/RiskLedgerQueryItemResponse" + } + }, + "nextCursor" : { + "type" : [ "string", "null" ] + } + } + }, + "RiskRule" : { + "type" : "object", + "required" : [ "violationType", "severity", "points", "ttl", "enabled" ], + "properties" : { + "violationType" : { + "$ref" : "#/components/schemas/ViolationType" + }, + "severity" : { + "$ref" : "#/components/schemas/Severity" + }, + "points" : { + "type" : "integer", + "format" : "int32", + "minimum" : 1, + "description" : "Positive risk points contributed by this rule." + }, + "ttl" : { + "description" : "Positive ISO-8601 duration for which the risk contribution remains active.", + "type" : "string", + "examples" : [ "P14D" ], + "$ref" : "#/components/schemas/Duration" + }, + "enabled" : { + "type" : "boolean" + } + } + }, + "SchedulePolicyRequest" : { + "description" : "Future activation time and audit reason for a policy draft.", + "type" : "object", + "required" : [ "activateAt", "reason" ], + "properties" : { + "activateAt" : { + "description" : "Future UTC time at which the policy should become active.", + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" + }, + "reason" : { + "type" : "string", + "maxLength" : 2000, + "minLength" : 1, + "description" : "Required audit reason." + } + } + }, + "Severity" : { + "type" : "string", + "enum" : [ "LOW", "MEDIUM", "HIGH", "CRITICAL" ] + }, + "SignatureStatus" : { + "type" : "string", + "enum" : [ "VALID", "INVALID", "UNSIGNED", "NOT_APPLICABLE" ] + }, + "SystemMessageReportRequest" : { + "description" : "Exact message report produced by an authorized detector.", + "examples" : [ { + "targetPlayerId" : "6be90520-6c3e-4431-a7f2-d3eadf831e17", + "category" : "SPAM", + "primaryMessageId" : "28bb4bbf-96c4-4e9c-89b9-132553ee2e34", + "origin" : { + "runtimeId" : "proxy-eu-1", + "serverId" : "lobby-1" + }, + "submittedAt" : "2026-07-22T10:15:30Z", + "source" : "static-filter", + "detectedCategory" : "SPAM", + "detectorVersion" : "2026.07", + "ruleId" : "repeated-message", + "scores" : { + "spam" : 0.97 + }, + "initialEvidence" : [ ] + } ], + "type" : "object", + "required" : [ "targetPlayerId", "category", "primaryMessageId", "origin", "submittedAt", "source", "detectedCategory", "detectorVersion", "ruleId", "initialEvidence" ], + "properties" : { + "targetPlayerId" : { + "type" : "string", + "examples" : [ "6be90520-6c3e-4431-a7f2-d3eadf831e17" ], + "$ref" : "#/components/schemas/UUID" + }, + "category" : { + "$ref" : "#/components/schemas/ReportCategory" + }, + "primaryMessageId" : { + "type" : "string", + "examples" : [ "28bb4bbf-96c4-4e9c-89b9-132553ee2e34" ], + "$ref" : "#/components/schemas/UUID" + }, + "origin" : { + "$ref" : "#/components/schemas/ReportOrigin" + }, + "submittedAt" : { + "type" : "string", + "examples" : [ "2026-07-22T10:15:30Z" ], + "$ref" : "#/components/schemas/Instant" + }, + "source" : { + "type" : "string", + "examples" : [ "static-filter" ] + }, + "detectedCategory" : { + "$ref" : "#/components/schemas/ReportCategory" + }, + "detectorVersion" : { + "type" : "string", + "examples" : [ "2026.07" ] + }, + "ruleId" : { + "type" : "string", + "examples" : [ "repeated-message" ] + }, + "scores" : { + "type" : [ "object", "null" ], + "additionalProperties" : { + "type" : "number", + "format" : "double" + }, + "examples" : [ { + "spam" : 0.97 + } ] + }, + "initialEvidence" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/EvidenceMessageRequest" + } + } + } + }, + "UUID" : { + "type" : "string", + "format" : "uuid", + "pattern" : "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}" + }, + "ViolationType" : { + "type" : "string", + "enum" : [ "ABUSIVE_LANGUAGE", "SPAM", "ADVERTISEMENT_OR_SCAM", "HARASSMENT", "THREAT_OR_HATE", "SEXUAL_CONTENT", "PERSONAL_DATA_EXPOSURE", "REPORT_ABUSE" ] + }, + "ViolationTypeResponse" : { + "type" : "object", + "description" : "Fixed violation type and its code-defined risk domain.", + "required" : [ "type", "domain" ], + "properties" : { + "type" : { + "$ref" : "#/components/schemas/ViolationType" + }, + "domain" : { + "$ref" : "#/components/schemas/RiskDomain" + } + } + } + }, + "securitySchemes" : { + "bearerAuth" : { + "type" : "http", + "description" : "Service JWT with the grounds-services audience.", + "scheme" : "bearer", + "bearerFormat" : "JWT" + } + } + }, + "info" : { + "description" : "Internal REST API for moderation reports, evidence, and policy management.", + "title" : "Moderation API", + "version" : "0.7.0" + }, + "tags" : [ { + "name" : "Automatic moderation findings" + }, { + "name" : "Moderation cases" + }, { + "name" : "Moderation evidence" + }, { + "name" : "Moderation findings" + }, { + "name" : "Moderation intake" + }, { + "name" : "Moderation policy" + }, { + "name" : "Moderation status" + } ], + "paths" : { + "/v1/moderation/cases" : { + "get" : { + "tags" : [ "Moderation cases" ], + "parameters" : [ { + "name" : "assignment", + "in" : "query", + "schema" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/CaseAssignmentFilter" + }, { + "type" : "null" + } ] + }, + "required" : true + }, { + "name" : "category", + "in" : "query", + "schema" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/ReportCategory" + }, { + "type" : "null" + } ] + }, + "required" : true + }, { + "name" : "createdBefore", + "in" : "query", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "cursor", + "in" : "query", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "limit", + "in" : "query", + "schema" : { + "type" : [ "integer", "null" ], + "format" : "int32" + }, + "required" : true + }, { + "name" : "priority", + "in" : "query", + "schema" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/CasePriority" + }, { + "type" : "null" + } ] + }, + "required" : true + }, { + "name" : "source", + "in" : "query", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "status", + "in" : "query", + "schema" : { + "type" : [ "array", "null" ], + "items" : { + "$ref" : "#/components/schemas/CaseStatus" + } + }, + "required" : true + }, { + "name" : "tab", + "in" : "query", + "schema" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/CaseQueueTab" + }, { + "type" : "null" + } ] + }, + "required" : true + }, { + "name" : "targetPlayerId", + "in" : "query", + "schema" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "required" : true + }, { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Portal-Permissions", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/CaseQueryPageResponse" + } + } + } + } + }, + "security" : [ { + "bearerAuth" : [ ] + } ], + "summary" : "List" + } + }, + "/v1/moderation/cases/{caseId}" : { + "get" : { + "tags" : [ "Moderation cases" ], + "parameters" : [ { + "name" : "caseId", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Portal-Permissions", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/CaseDetailResponse" + } + } + } + } + }, + "security" : [ { + "bearerAuth" : [ ] + } ], + "summary" : "Detail" + } + }, + "/v1/moderation/cases/{caseId}/chat-mutes" : { + "get" : { + "parameters" : [ { + "name" : "caseId", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Portal-Permissions", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/ChatMuteResponse" + } + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "List", + "tags" : [ "Chat Mute Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + }, + "post" : { + "parameters" : [ { + "name" : "caseId", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Portal-Permissions", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/CreateChatMuteRequest" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Create", + "tags" : [ "Chat Mute Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/cases/{caseId}/claim" : { + "post" : { + "tags" : [ "Moderation cases" ], + "parameters" : [ { + "name" : "caseId", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "Idempotency-Key", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "If-Match", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Portal-Permissions", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + } + }, + "security" : [ { + "bearerAuth" : [ ] + } ], + "summary" : "Claim" + } + }, + "/v1/moderation/cases/{caseId}/dismiss" : { + "post" : { + "tags" : [ "Moderation cases" ], + "parameters" : [ { + "name" : "caseId", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "Idempotency-Key", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "If-Match", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Portal-Permissions", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/CaseDecisionRequest" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "400" : { + "description" : "Bad Request" + } + }, + "security" : [ { + "bearerAuth" : [ ] + } ], + "summary" : "Dismiss" + } + }, + "/v1/moderation/cases/{caseId}/findings" : { + "post" : { + "summary" : "Confirm a finding from a moderation case", + "description" : "Confirms one manual finding from primary and optional supporting case evidence.", + "tags" : [ "Moderation findings" ], + "parameters" : [ { + "in" : "path", + "name" : "caseId", + "required" : true, + "schema" : { + "format" : "uuid", + "type" : "string" + } + }, { + "description" : "Stable UUID for one logical finding confirmation.", + "in" : "header", + "name" : "Idempotency-Key", + "required" : true, + "schema" : { + "format" : "uuid", + "type" : [ "string", "null" ] + } + }, { + "description" : "Quoted current case revision, for example \"3\".", + "in" : "header", + "name" : "If-Match", + "required" : true, + "schema" : { + "type" : [ "string", "null" ] + } + }, { + "description" : "Authenticated portal actor supplied by the trusted portal BFF.", + "in" : "header", + "name" : "X-Grounds-Actor-Id", + "required" : true, + "schema" : { + "type" : [ "string", "null" ] + } + }, { + "description" : "Comma-separated effective case permissions supplied by the portal BFF.", + "in" : "header", + "name" : "X-Grounds-Portal-Permissions", + "required" : true, + "schema" : { + "type" : [ "string", "null" ], + "enum" : [ "moderation.case.decide" ] + } + }, { + "description" : "Optional request correlation identifier.", + "in" : "header", + "name" : "X-Request-Id", + "required" : false, + "schema" : { + "type" : [ "string", "null" ] + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/ConfirmManualFindingRequest" + } + } + }, + "required" : true + }, + "responses" : { + "201" : { + "description" : "Finding confirmed.", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/ConfirmManualFindingResponse" + } + } + } + }, + "200" : { + "description" : "Idempotent replay of a confirmed finding.", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/ConfirmManualFindingResponse" + } + } + } + }, + "400" : { + "description" : "Invalid JSON or idempotency key.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "401" : { + "description" : "Authentication is missing or invalid.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "403" : { + "description" : "Portal actor context is not authorized.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "404" : { + "description" : "The moderation case was not found.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "409" : { + "description" : "Case, idempotency, or finding identity conflicts with state.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "422" : { + "description" : "The finding classification or evidence selection is invalid.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "503" : { + "description" : "Moderation storage is unavailable.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security" : [ { + "bearerAuth" : [ ] + } ] + }, + "get" : { + "summary" : "List findings for a moderation case", + "description" : "Returns stable cursor-based safe finding projections for one case.", + "tags" : [ "Moderation findings" ], + "parameters" : [ { + "in" : "path", + "name" : "caseId", + "required" : true, + "schema" : { + "format" : "uuid", + "type" : "string" + } + }, { + "description" : "Opaque cursor returned by the previous page.", + "in" : "query", + "name" : "cursor", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "description" : "Page size from 1 to 100; defaults to 50.", + "in" : "query", + "name" : "limit", + "schema" : { + "maximum" : 100, + "minimum" : 1, + "type" : [ "integer", "null" ], + "default" : 50 + }, + "required" : true + }, { + "description" : "Authenticated portal actor supplied by the trusted portal BFF.", + "in" : "header", + "name" : "X-Grounds-Actor-Id", + "required" : true, + "schema" : { + "type" : [ "string", "null" ] + } + }, { + "description" : "Exact effective portal permission for this operation.", + "in" : "header", + "name" : "X-Grounds-Portal-Permission", + "required" : true, + "schema" : { + "type" : [ "string", "null" ], + "enum" : [ "moderation.risk.view" ] + } + }, { + "description" : "Optional request correlation identifier.", + "in" : "header", + "name" : "X-Request-Id", + "required" : false, + "schema" : { + "type" : [ "string", "null" ] + } + } ], + "responses" : { + "200" : { + "description" : "Finding page.", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/FindingQueryPageResponse" + } + } + } + }, + "401" : { + "description" : "Authentication is missing.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "403" : { + "description" : "Portal actor is not authorized.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "422" : { + "description" : "Cursor or limit is invalid.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "503" : { + "description" : "Moderation storage is unavailable.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/cases/{caseId}/reassignment" : { + "post" : { + "tags" : [ "Moderation cases" ], + "parameters" : [ { + "name" : "caseId", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "Idempotency-Key", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "If-Match", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Portal-Permissions", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/ReassignCaseRequest" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "400" : { + "description" : "Bad Request" + } + }, + "security" : [ { + "bearerAuth" : [ ] + } ], + "summary" : "Reassign" + } + }, + "/v1/moderation/cases/{caseId}/release" : { + "post" : { + "tags" : [ "Moderation cases" ], + "parameters" : [ { + "name" : "caseId", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "Idempotency-Key", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "If-Match", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] }, - "domain" : { - "$ref" : "#/components/schemas/RiskDomain" + "required" : true + }, { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Portal-Permissions", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } } - } + }, + "security" : [ { + "bearerAuth" : [ ] + } ], + "summary" : "Release" } }, - "securitySchemes" : { - "bearerAuth" : { - "type" : "http", - "description" : "Service JWT with the grounds-services audience.", - "scheme" : "bearer", - "bearerFormat" : "JWT" - } - } - }, - "info" : { - "description" : "Internal REST API for moderation reports, evidence, and policy management.", - "title" : "Moderation API", - "version" : "0.2.0" - }, - "tags" : [ { - "name" : "Automatic moderation findings" - }, { - "name" : "Moderation evidence" - }, { - "name" : "Moderation findings" - }, { - "name" : "Moderation intake" - }, { - "name" : "Moderation policy" - }, { - "name" : "Moderation status" - } ], - "paths" : { - "/v1/moderation/cases/{caseId}/findings" : { + "/v1/moderation/cases/{caseId}/resolve" : { "post" : { - "summary" : "Confirm a finding from a moderation case", - "description" : "Confirms one manual finding from primary and optional supporting case evidence.", - "tags" : [ "Moderation findings" ], + "tags" : [ "Moderation cases" ], "parameters" : [ { - "in" : "path", "name" : "caseId", + "in" : "path", "required" : true, "schema" : { - "format" : "uuid", - "type" : "string" + "$ref" : "#/components/schemas/UUID" } }, { - "description" : "Stable UUID for one logical finding confirmation.", - "in" : "header", "name" : "Idempotency-Key", - "required" : true, + "in" : "header", "schema" : { - "format" : "uuid", "type" : [ "string", "null" ] - } + }, + "required" : true }, { - "description" : "Authenticated portal actor supplied by the trusted portal BFF.", + "name" : "If-Match", "in" : "header", - "name" : "X-Grounds-Actor-Id", - "required" : true, "schema" : { "type" : [ "string", "null" ] - } + }, + "required" : true }, { - "description" : "Exact effective portal permission for this operation.", + "name" : "X-Grounds-Actor-Id", "in" : "header", - "name" : "X-Grounds-Portal-Permission", - "required" : true, "schema" : { - "type" : [ "string", "null" ], - "enum" : [ "moderation.finding.confirm" ] - } + "type" : [ "string", "null" ] + }, + "required" : true }, { - "description" : "Optional request correlation identifier.", + "name" : "X-Grounds-Portal-Permissions", "in" : "header", - "name" : "X-Request-Id", - "required" : false, "schema" : { "type" : [ "string", "null" ] - } + }, + "required" : true } ], "requestBody" : { "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/ConfirmManualFindingRequest" + "$ref" : "#/components/schemas/CaseDecisionRequest" } } }, "required" : true }, "responses" : { - "201" : { - "description" : "Finding confirmed.", + "200" : { + "description" : "OK", "content" : { "application/json" : { - "schema" : { - "$ref" : "#/components/schemas/ConfirmManualFindingResponse" - } + "schema" : { } } } }, + "400" : { + "description" : "Bad Request" + } + }, + "security" : [ { + "bearerAuth" : [ ] + } ], + "summary" : "Resolve" + } + }, + "/v1/moderation/chat-mute-presets" : { + "get" : { + "parameters" : [ { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Portal-Permissions", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { "200" : { - "description" : "Idempotent replay of a confirmed finding.", + "description" : "OK", "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/ConfirmManualFindingResponse" + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/ChatMutePreset" + } } } } }, - "400" : { - "description" : "Invalid JSON or idempotency key.", + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Presets", + "tags" : [ "Chat Mute Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/events" : { + "get" : { + "parameters" : [ { + "name" : "afterCursor", + "in" : "query", + "schema" : { + "type" : "integer", + "format" : "int64", + "default" : 0 + }, + "required" : true + }, { + "name" : "epoch", + "in" : "query", + "schema" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "required" : true + }, { + "name" : "limit", + "in" : "query", + "schema" : { + "type" : "integer", + "format" : "int32", + "default" : 100 + }, + "required" : true + }, { + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } + "application/json" : { + "schema" : { } } } }, "401" : { - "description" : "Authentication is missing or invalid.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "description" : "Not Authorized" }, "403" : { - "description" : "Portal actor context is not authorized.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "description" : "Not Allowed" + } + }, + "summary" : "Events", + "tags" : [ "Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/sessions" : { + "post" : { + "parameters" : [ { + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] }, - "404" : { - "description" : "The moderation case was not found.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } + "required" : true + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/RegisterEnforcementProxyRequest" } } }, - "409" : { - "description" : "Case, idempotency, or finding identity conflicts with state.", + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } + "application/json" : { + "schema" : { } } } }, - "422" : { - "description" : "The finding classification or evidence selection is invalid.", + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Register", + "tags" : [ "Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/sessions/{id}" : { + "delete" : { + "parameters" : [ { + "name" : "id", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } + "application/json" : { + "schema" : { } } } }, - "503" : { - "description" : "Moderation storage is unavailable.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" } }, + "summary" : "Close", + "tags" : [ "Enforcement Proxy Resource" ], "security" : [ { "bearerAuth" : [ ] } ] - }, - "get" : { - "summary" : "List findings for a moderation case", - "description" : "Returns stable cursor-based safe finding projections for one case.", - "tags" : [ "Moderation findings" ], + } + }, + "/v1/moderation/enforcement-proxy/sessions/{id}/acks" : { + "post" : { "parameters" : [ { + "name" : "id", "in" : "path", - "name" : "caseId", "required" : true, "schema" : { - "format" : "uuid", - "type" : "string" + "$ref" : "#/components/schemas/UUID" } }, { - "description" : "Opaque cursor returned by the previous page.", - "in" : "query", - "name" : "cursor", + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", "schema" : { "type" : [ "string", "null" ] }, "required" : true - }, { - "description" : "Page size from 1 to 100; defaults to 50.", - "in" : "query", - "name" : "limit", - "schema" : { - "maximum" : 100, - "minimum" : 1, - "type" : [ "integer", "null" ], - "default" : 50 + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/EnforcementProxyAckRequest" + } + } }, "required" : true - }, { - "description" : "Authenticated portal actor supplied by the trusted portal BFF.", - "in" : "header", - "name" : "X-Grounds-Actor-Id", - "required" : true, - "schema" : { - "type" : [ "string", "null" ] + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" } - }, { - "description" : "Exact effective portal permission for this operation.", - "in" : "header", - "name" : "X-Grounds-Portal-Permission", + }, + "summary" : "Acknowledge", + "tags" : [ "Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/sessions/{id}/heartbeat" : { + "post" : { + "parameters" : [ { + "name" : "id", + "in" : "path", "required" : true, "schema" : { - "type" : [ "string", "null" ], - "enum" : [ "moderation.risk.view" ] + "$ref" : "#/components/schemas/UUID" } }, { - "description" : "Optional request correlation identifier.", + "name" : "X-Grounds-Moderation-Environment", "in" : "header", - "name" : "X-Request-Id", - "required" : false, "schema" : { "type" : [ "string", "null" ] - } + }, + "required" : true } ], "responses" : { "200" : { - "description" : "Finding page.", + "description" : "OK", "content" : { "application/json" : { - "schema" : { - "$ref" : "#/components/schemas/FindingQueryPageResponse" - } + "schema" : { } } } }, "401" : { - "description" : "Authentication is missing.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "description" : "Not Authorized" }, "403" : { - "description" : "Portal actor is not authorized.", + "description" : "Not Allowed" + } + }, + "summary" : "Heartbeat", + "tags" : [ "Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/snapshot" : { + "get" : { + "parameters" : [ { + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } + "application/json" : { + "schema" : { } } } }, - "422" : { - "description" : "Cursor or limit is invalid.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Snapshot", + "tags" : [ "Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcements/{id}/revoke" : { + "post" : { + "parameters" : [ { + "name" : "id", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + }, { + "name" : "X-Grounds-Portal-Permissions", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/RevokeChatMuteRequest" } } }, - "503" : { - "description" : "Moderation storage is unavailable.", + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", "content" : { - "application/problem+json" : { + "application/json" : { "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" + "$ref" : "#/components/schemas/ChatMuteResponse" } } } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" } }, + "summary" : "Revoke", + "tags" : [ "Chat Mute Resource" ], "security" : [ { "bearerAuth" : [ ] } ] @@ -1825,6 +3438,14 @@ "format" : "uuid", "type" : [ "string", "null" ] } + }, { + "description" : "Quoted current case revision, for example \"3\".", + "in" : "header", + "name" : "If-Match", + "required" : true, + "schema" : { + "type" : [ "string", "null" ] + } }, { "description" : "Authenticated portal actor supplied by the trusted portal BFF.", "in" : "header", @@ -1834,13 +3455,13 @@ "type" : [ "string", "null" ] } }, { - "description" : "Exact effective portal permission for this operation.", + "description" : "Comma-separated effective case permissions supplied by the portal BFF.", "in" : "header", - "name" : "X-Grounds-Portal-Permission", + "name" : "X-Grounds-Portal-Permissions", "required" : true, "schema" : { "type" : [ "string", "null" ], - "enum" : [ "moderation.finding.correct" ] + "enum" : [ "moderation.case.decide" ] } }, { "description" : "Optional request correlation identifier.", @@ -2088,6 +3709,72 @@ } ] } }, + "/v1/moderation/player-reports/status" : { + "get" : { + "summary" : "List the reporting player's safe report statuses", + "tags" : [ "Moderation intake" ], + "parameters" : [ { + "name" : "X-Grounds-Player-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlayerReportStatusListResponse" + } + } + } + } + }, + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/player-reports/{publicReference}/status" : { + "get" : { + "summary" : "Get the reporting player's safe report status", + "description" : "Returns no evidence, moderator identity, internal reason, or target details.", + "tags" : [ "Moderation intake" ], + "parameters" : [ { + "name" : "publicReference", + "in" : "path", + "required" : true, + "schema" : { + "type" : "string" + } + }, { + "name" : "X-Grounds-Player-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlayerReportStatusResponse" + } + } + } + } + }, + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, "/v1/moderation/players/{playerId}/findings" : { "get" : { "summary" : "List findings for a player",