From cd21da0caac23c48866f298d30d169efb0fb318d Mon Sep 17 00:00:00 2001 From: "grounds-openapi-publisher[bot]" <309496835+grounds-openapi-publisher[bot]@users.noreply.github.com> Date: Thu, 22 Oct 2026 00:10:50 +0000 Subject: [PATCH] docs: update service-moderation api snapshot --- public/specs/service-moderation/openapi.json | 5860 ++++++++++++++---- 1 file changed, 4761 insertions(+), 1099 deletions(-) diff --git a/public/specs/service-moderation/openapi.json b/public/specs/service-moderation/openapi.json index f6270a4..fed2bc6 100644 --- a/public/specs/service-moderation/openapi.json +++ b/public/specs/service-moderation/openapi.json @@ -2,6 +2,10 @@ "openapi" : "3.1.0", "components" : { "schemas" : { + "AppealStatus" : { + "type" : "string", + "enum" : [ "SUBMITTED", "IN_REVIEW", "ACCEPTED", "REJECTED", "WITHDRAWN" ] + }, "AppendEvidenceMessagesRequest" : { "description" : "Additional immutable messages for an open evidence capture.", "examples" : [ { @@ -73,6 +77,96 @@ "type" : "string", "enum" : [ "STATIC_FILTER", "OPENAI_MODERATION", "SELF_HOSTED_MODEL" ] }, + "AutomaticEnforcementAction" : { + "type" : "string", + "enum" : [ "MESSAGE_BLOCK", "MESSAGE_DELETE", "CHAT_MUTE" ] + }, + "AutomaticEnforcementMode" : { + "type" : "string", + "enum" : [ "SHADOW", "ENFORCED" ] + }, + "AutomaticEnforcementOutcome" : { + "type" : "string", + "enum" : [ "SHADOW", "BLOCKED", "CREATED", "UNSUPPORTED", "NOT_ALLOWED", "SKIPPED_ALREADY_CONFIRMED" ] + }, + "AutomaticEnforcementRequest" : { + "type" : "object", + "required" : [ "action" ], + "properties" : { + "action" : { + "$ref" : "#/components/schemas/AutomaticEnforcementAction" + }, + "durationSeconds" : { + "type" : [ "integer", "null" ], + "format" : "int64" + } + } + }, + "AutomaticEnforcementResult" : { + "type" : "object", + "required" : [ "action", "outcome" ], + "properties" : { + "action" : { + "$ref" : "#/components/schemas/AutomaticEnforcementAction" + }, + "outcome" : { + "$ref" : "#/components/schemas/AutomaticEnforcementOutcome" + }, + "enforcementId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "publicReference" : { + "type" : [ "string", "null" ] + } + } + }, + "AutomaticEnforcementRule" : { + "type" : "object", + "required" : [ "source", "ruleId", "ruleVersion", "violationType", "action", "mode", "enabled" ], + "properties" : { + "source" : { + "$ref" : "#/components/schemas/AutomaticConfirmationSource" + }, + "ruleId" : { + "type" : "string", + "minLength" : 1 + }, + "ruleVersion" : { + "type" : "string", + "minLength" : 1 + }, + "violationType" : { + "$ref" : "#/components/schemas/ViolationType" + }, + "action" : { + "$ref" : "#/components/schemas/AutomaticEnforcementAction" + }, + "maximumDuration" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Duration" + }, { + "type" : "null" + } ] + }, + "mode" : { + "$ref" : "#/components/schemas/AutomaticEnforcementMode" + }, + "enabled" : { + "type" : "boolean" + }, + "shadowPolicyVersionId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + } + } + }, "AutomaticFindingDecisionRequest" : { "description" : "Immutable classification result for one stored system message report.", "type" : "object", @@ -89,6 +183,13 @@ "type" : "number", "maximum" : 1, "minimum" : 0 + }, + "enforcement" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/AutomaticEnforcementRequest" + }, { + "type" : "null" + } ] } } }, @@ -112,1242 +213,4691 @@ }, "replay" : { "type" : "boolean" + }, + "enforcement" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/AutomaticEnforcementResult" + }, { + "type" : "null" + } ] } } }, "AutomaticFindingOutcome" : { "type" : "string", - "enum" : [ "CONFIRMED", "SHADOW", "NOT_ALLOWED", "NO_ACTIVE_POLICY", "INSUFFICIENT_EVIDENCE", "ALREADY_CONFIRMED" ] + "enum" : [ "CONFIRMED", "SHADOW", "NOT_ALLOWED", "NO_ACTIVE_POLICY", "INSUFFICIENT_EVIDENCE", "ALREADY_CONFIRMED", "UNSUPPORTED_ENFORCEMENT" ] }, "CaptureStatus" : { "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" : { + "reports" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/CaseReportResponse" + } + }, + "audit" : { + "type" : [ "array", "null" ], + "items" : { + "$ref" : "#/components/schemas/CaseAuditResponse" + } + }, + "primaryMessageId" : { + "description" : "Canonical originally reported message ID stored on this case.", + "type" : [ "string", "null" ], "anyOf" : [ { - "$ref" : "#/components/schemas/Severity" + "$ref" : "#/components/schemas/UUID" }, { "type" : "null" } ] }, - "reason" : { + "caseReference" : { "type" : "string", - "maxLength" : 2000, - "minLength" : 1, - "description" : "Required internal audit reason." + "pattern" : "^C-[A-HJ-NP-Z2-9]{8}$", + "description" : "Stable internal case reference. Does not grant access.", + "examples" : [ "C-7K3M2QXY" ] + }, + "origin" : { + "type" : "string" + }, + "targetPlayerId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] } } }, - "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" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" - }, { - "type" : "null" - } ] - } - } - }, - "DomainModerationStatus" : { - "type" : "string", - "enum" : [ "CLEAR", "WARNED", "RESTRICTED" ] - }, - "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", - "format" : "duration" - }, - "EvidenceAppendReceipt" : { - "description" : "Result of an idempotent evidence append operation.", - "examples" : [ { - "evidenceCaptureId" : "81b1174f-f634-4304-a537-31c6a416af88", - "addedCount" : 1, - "existingCount" : 0, - "storedMessageCount" : 12, - "status" : "OPEN" - } ], - "type" : "object", - "required" : [ "evidenceCaptureId", "addedCount", "existingCount", "storedMessageCount", "status" ], - "properties" : { - "evidenceCaptureId" : { + "caseId" : { "$ref" : "#/components/schemas/UUID" }, - "addedCount" : { - "type" : "integer", - "format" : "int32" - }, - "existingCount" : { - "type" : "integer", - "format" : "int32" - }, - "storedMessageCount" : { - "type" : "integer", - "format" : "int32" - }, "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" + "$ref" : "#/components/schemas/CaseStatus" }, - "status" : { - "$ref" : "#/components/schemas/CaptureStatus" + "priority" : { + "$ref" : "#/components/schemas/CasePriority" }, - "storedMessageCount" : { + "revision" : { "type" : "integer", - "format" : "int32" - }, - "changed" : { - "type" : "boolean" - } - } - }, - "EvidenceMessageRequest" : { - "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" ], - "properties" : { - "messageId" : { - "type" : "string", - "examples" : [ "28bb4bbf-96c4-4e9c-89b9-132553ee2e34" ], - "$ref" : "#/components/schemas/UUID" - }, - "senderPlayerId" : { - "type" : "string", - "examples" : [ "6be90520-6c3e-4431-a7f2-d3eadf831e17" ], - "$ref" : "#/components/schemas/UUID" + "format" : "int64" }, - "content" : { + "createdAt" : { "type" : "string", - "examples" : [ "Please stop sending repeated messages." ] + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" }, - "sentAt" : { + "updatedAt" : { "type" : "string", - "examples" : [ "2026-07-22T10:15:30Z" ], + "examples" : [ "2022-03-10T16:15:50Z" ], "$ref" : "#/components/schemas/Instant" }, - "role" : { - "$ref" : "#/components/schemas/EvidenceRole" + "assignedModeratorId" : { + "type" : [ "string", "null" ] }, - "sequence" : { - "type" : "integer", - "format" : "int32", - "minimum" : 0, - "examples" : [ 0 ] + "assignedAt" : { + "type" : [ "string", "null" ], + "examples" : [ "2022-03-10T16:15:50Z" ], + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] }, - "channel" : { - "$ref" : "#/components/schemas/MessageChannel" + "targetPlayerId" : { + "$ref" : "#/components/schemas/UUID" }, - "runtimeId" : { - "type" : "string", - "examples" : [ "proxy-eu-1" ] + "category" : { + "$ref" : "#/components/schemas/ReportCategory" }, - "serverId" : { - "type" : "string", - "examples" : [ "lobby-1" ] + "source" : { + "type" : [ "string", "null" ] }, - "visibility" : { - "$ref" : "#/components/schemas/MessageVisibility" + "reportCount" : { + "type" : "integer", + "format" : "int32" }, - "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}" - } + "evidenceStatus" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/CaptureStatus" + }, { + "type" : "null" + } ] }, - "signedPayload" : { - "type" : [ "string", "null" ], - "format" : "byte", - "description" : "Original signed chat payload encoded as Base64." + "caseReference" : { + "type" : "string", + "pattern" : "^C-[A-HJ-NP-Z2-9]{8}$", + "description" : "Stable internal case reference. Does not grant access.", + "examples" : [ "C-7K3M2QXY" ] }, - "signature" : { + "targetPlayerName" : { "type" : [ "string", "null" ], - "format" : "byte", - "description" : "Original chat signature encoded as Base64." + "description" : "Last-known Minecraft name for the target player." }, - "signatureStatus" : { - "$ref" : "#/components/schemas/SignatureStatus" + "origin" : { + "type" : "string" } } }, - "EvidenceRole" : { - "type" : "string", - "enum" : [ "TARGET", "CONTEXT" ] - }, - "FindingConfirmationSource" : { + "CasePriority" : { "type" : "string", - "enum" : [ "MANUAL", "AUTOMATIC" ] + "enum" : [ "LOW", "NORMAL", "HIGH", "CRITICAL" ] }, - "FindingCorrectionRelationshipResponse" : { - "description" : "Append-only correction relationship visible on a finding projection.", + "CaseQueryPageResponse" : { "type" : "object", - "required" : [ "correctionId", "type", "replacementFindingId", "correctedAt" ], + "required" : [ "items", "nextCursor" ], "properties" : { - "correctionId" : { - "$ref" : "#/components/schemas/UUID" - }, - "type" : { - "$ref" : "#/components/schemas/FindingCorrectionType" - }, - "replacementFindingId" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" - }, { - "type" : "null" - } ] + "items" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/CaseListItemResponse" + } }, - "correctedAt" : { - "type" : "string", - "examples" : [ "2022-03-10T16:15:50Z" ], - "$ref" : "#/components/schemas/Instant" + "nextCursor" : { + "type" : [ "string", "null" ] } } }, - "FindingCorrectionType" : { + "CaseQueueTab" : { "type" : "string", - "enum" : [ "INVALIDATE", "RECLASSIFY" ] + "enum" : [ "OPEN", "MY", "COMPLETED" ] }, - "FindingQueryItemResponse" : { - "description" : "Safe portal projection of one confirmed moderation finding.", + "CaseReportResponse" : { "type" : "object", - "required" : [ "findingId", "findingIdentityId", "targetPlayerId", "caseId", "reportId", "primaryMessageId", "supportingMessageIds", "violationType", "severity", "source", "confirmedAt", "policyVersionId", "replacesFindingId", "correction" ], + "required" : [ "reportId", "type", "reporterPlayerId", "targetPlayerId", "category", "source", "submittedAt", "evidenceCaptureId", "captureStatus", "incompleteReason", "evidence" ], "properties" : { - "findingId" : { - "$ref" : "#/components/schemas/UUID" - }, - "findingIdentityId" : { - "$ref" : "#/components/schemas/UUID" - }, - "targetPlayerId" : { + "reportId" : { "$ref" : "#/components/schemas/UUID" }, - "caseId" : { - "$ref" : "#/components/schemas/UUID" + "type" : { + "$ref" : "#/components/schemas/ReportType" }, - "reportId" : { + "reporterPlayerId" : { "anyOf" : [ { "$ref" : "#/components/schemas/UUID" }, { "type" : "null" } ] }, - "primaryMessageId" : { + "targetPlayerId" : { "$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}" - } - }, - "violationType" : { - "$ref" : "#/components/schemas/ViolationType" - }, - "severity" : { - "$ref" : "#/components/schemas/Severity" + "category" : { + "$ref" : "#/components/schemas/ReportCategory" }, "source" : { - "$ref" : "#/components/schemas/FindingConfirmationSource" + "type" : [ "string", "null" ] }, - "confirmedAt" : { + "submittedAt" : { "type" : "string", "examples" : [ "2022-03-10T16:15:50Z" ], "$ref" : "#/components/schemas/Instant" }, - "policyVersionId" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" - }, { - "type" : "null" - } ] + "evidenceCaptureId" : { + "$ref" : "#/components/schemas/UUID" }, - "replacesFindingId" : { + "captureStatus" : { + "$ref" : "#/components/schemas/CaptureStatus" + }, + "incompleteReason" : { "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" + "$ref" : "#/components/schemas/IncompleteReason" }, { "type" : "null" } ] }, - "correction" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/FindingCorrectionRelationshipResponse" - }, { - "type" : "null" - } ] - } - } - }, - "FindingQueryPageResponse" : { - "description" : "Cursor page of safe moderation finding projections.", - "type" : "object", - "required" : [ "items", "nextCursor" ], - "properties" : { - "items" : { + "evidence" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/FindingQueryItemResponse" + "$ref" : "#/components/schemas/CaseEvidenceResponse" } }, - "nextCursor" : { - "type" : [ "string", "null" ] + "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." } } }, - "GlobalModerationStatus" : { - "type" : "string", - "enum" : [ "CLEAR", "WARNED", "RESTRICTED", "SUSPENDED", "BANNED" ] - }, - "IncompleteReason" : { - "type" : "string", - "enum" : [ "CONTEXT_UNAVAILABLE", "WINDOW_EXPIRED", "PRODUCER_SHUTDOWN" ] - }, - "Instant" : { + "CaseStatus" : { "type" : "string", - "format" : "date-time" + "enum" : [ "OPEN", "IN_REVIEW", "ACTION_REQUIRED", "RESOLVED", "DISMISSED" ] }, - "InternalDomainStatusResponse" : { - "description" : "Internal point and status calculation for one moderation risk domain.", - "additionalProperties" : false, + "ChatMute" : { "type" : "object", - "required" : [ "domain", "effectivePoints", "status" ], + "required" : [ "id", "publicReference", "caseId", "playerId", "findingId", "environment", "revision", "status", "startsAt", "expiresAt", "safeReasonCode" ], "properties" : { - "domain" : { - "$ref" : "#/components/schemas/RiskDomain" + "id" : { + "$ref" : "#/components/schemas/UUID" }, - "effectivePoints" : { + "publicReference" : { + "type" : "string" + }, + "caseId" : { + "$ref" : "#/components/schemas/UUID" + }, + "playerId" : { + "$ref" : "#/components/schemas/UUID" + }, + "findingId" : { + "$ref" : "#/components/schemas/UUID" + }, + "environment" : { + "$ref" : "#/components/schemas/ModerationEnvironment" + }, + "revision" : { "type" : "integer", - "format" : "int32" + "format" : "int64" }, "status" : { - "$ref" : "#/components/schemas/DomainModerationStatus" + "$ref" : "#/components/schemas/EnforcementStatus" + }, + "startsAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "expiresAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "safeReasonCode" : { + "type" : "string" } } }, - "InternalModerationStatusResponse" : { - "description" : "Internal moderation status calculation for authorized portal supporters.", - "additionalProperties" : false, + "ChatMutePreset" : { "type" : "object", - "required" : [ "playerId", "domains", "pointBasedStatus", "effectiveStatus", "reasonCode", "statusSince", "earliestImprovementAt", "calculatedAt", "nextEvaluationAt", "snapshotRevision" ], + "required" : [ "key", "durationSeconds" ], "properties" : { - "playerId" : { - "$ref" : "#/components/schemas/UUID" + "key" : { + "type" : "string" }, - "domains" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/InternalDomainStatusResponse" - } + "durationSeconds" : { + "type" : "integer", + "format" : "int64" + } + } + }, + "ChatMuteResponse" : { + "type" : "object", + "required" : [ "measure", "distribution" ], + "properties" : { + "measure" : { + "$ref" : "#/components/schemas/ChatMute" }, - "pointBasedStatus" : { - "$ref" : "#/components/schemas/GlobalModerationStatus" + "distribution" : { + "$ref" : "#/components/schemas/EnforcementDistributionStatus" }, - "effectiveStatus" : { - "$ref" : "#/components/schemas/GlobalModerationStatus" + "replay" : { + "type" : "boolean" + } + } + }, + "CompleteEvidenceCaptureRequest" : { + "description" : "Requested terminal state for an open evidence capture.", + "examples" : [ { + "status" : "COMPLETE", + "incompleteReason" : null, + "expectedMessageCount" : 12 + } ], + "type" : "object", + "required" : [ "status", "incompleteReason", "expectedMessageCount" ], + "properties" : { + "status" : { + "$ref" : "#/components/schemas/CaptureStatus" }, - "reasonCode" : { + "incompleteReason" : { "anyOf" : [ { - "$ref" : "#/components/schemas/ModerationStatusReasonCode" + "$ref" : "#/components/schemas/IncompleteReason" }, { "type" : "null" } ] }, - "statusSince" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" - }, { - "type" : "null" - } ] + "expectedMessageCount" : { + "type" : "integer", + "format" : "int32" + } + } + }, + "ConfirmManualFindingRequest" : { + "description" : "Manual classification of chat evidence attached to an open case.", + "type" : "object", + "required" : [ "violationType", "severity", "primaryMessageId", "reason" ], + "properties" : { + "violationType" : { + "$ref" : "#/components/schemas/ViolationType" }, - "earliestImprovementAt" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" - }, { - "type" : "null" - } ] + "severity" : { + "$ref" : "#/components/schemas/Severity" }, - "calculatedAt" : { + "primaryMessageId" : { + "$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}" + } + }, + "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" + }, + "caseId" : { + "$ref" : "#/components/schemas/UUID" + }, + "source" : { + "$ref" : "#/components/schemas/FindingConfirmationSource" + }, + "confirmedAt" : { + "type" : "string", + "examples" : [ "2022-03-10T16:15:50Z" ], "$ref" : "#/components/schemas/Instant" }, - "nextEvaluationAt" : { + "policyVersionId" : { "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" + "$ref" : "#/components/schemas/UUID" }, { "type" : "null" } ] }, - "snapshotRevision" : { + "caseRevision" : { "type" : [ "integer", "null" ], "format" : "int64" + }, + "replay" : { + "type" : "boolean" } } }, - "MessageChannel" : { - "type" : "string", - "enum" : [ "GLOBAL", "SERVER", "GROUP", "PARTY", "PRIVATE" ] - }, - "MessageVisibility" : { - "type" : "string", - "enum" : [ "PUBLIC", "PRIVATE" ] - }, - "ModerationStatusReasonCode" : { - "type" : "string", - "enum" : [ "CHAT_BEHAVIOR", "SOCIAL_BEHAVIOR", "REPORT_SYSTEM_USE" ] - }, - "PlayerModerationStatusResponse" : { - "description" : "Player-safe projection of the current global moderation status.", - "additionalProperties" : false, + "CorrectFindingRequest" : { + "description" : "Append-only correction of a confirmed moderation finding.", "type" : "object", - "required" : [ "playerId", "status", "reasonCode", "statusSince", "earliestImprovementAt" ], + "required" : [ "type", "reason" ], "properties" : { - "playerId" : { - "$ref" : "#/components/schemas/UUID" - }, - "status" : { - "$ref" : "#/components/schemas/GlobalModerationStatus" + "type" : { + "$ref" : "#/components/schemas/FindingCorrectionType" }, - "reasonCode" : { + "violationType" : { "anyOf" : [ { - "$ref" : "#/components/schemas/ModerationStatusReasonCode" + "$ref" : "#/components/schemas/ViolationType" }, { "type" : "null" } ] }, - "statusSince" : { + "severity" : { "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" + "$ref" : "#/components/schemas/Severity" }, { "type" : "null" } ] }, - "earliestImprovementAt" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/Instant" - }, { - "type" : "null" - } ] + "reason" : { + "type" : "string", + "maxLength" : 2000, + "minLength" : 1, + "description" : "Required internal audit reason." } } }, - "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" : { - "runtimeId" : "proxy-eu-1", - "serverId" : "lobby-1" - }, - "submittedAt" : "2026-07-22T10:15:30Z", - "initialEvidence" : [ ] - } ], + "CorrectFindingResponse" : { + "description" : "Minimal result of a finding correction.", "type" : "object", - "required" : [ "reporterPlayerId", "targetPlayerId", "category", "primaryMessageId", "origin", "submittedAt", "initialEvidence" ], + "required" : [ "correctionId", "correctedFindingId", "replacementFindingId", "type", "correctedAt", "caseRevision", "replay" ], "properties" : { - "reporterPlayerId" : { - "type" : "string", - "examples" : [ "9ad4b488-49d6-4c72-932b-98bead1fef83" ], + "correctionId" : { "$ref" : "#/components/schemas/UUID" }, - "targetPlayerId" : { - "type" : "string", - "examples" : [ "6be90520-6c3e-4431-a7f2-d3eadf831e17" ], + "correctedFindingId" : { "$ref" : "#/components/schemas/UUID" }, - "category" : { - "$ref" : "#/components/schemas/ReportCategory" + "replacementFindingId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] }, - "primaryMessageId" : { - "type" : "string", - "examples" : [ "28bb4bbf-96c4-4e9c-89b9-132553ee2e34" ], - "$ref" : "#/components/schemas/UUID" - }, - "origin" : { - "$ref" : "#/components/schemas/ReportOrigin" + "type" : { + "$ref" : "#/components/schemas/FindingCorrectionType" }, - "submittedAt" : { + "correctedAt" : { "type" : "string", - "examples" : [ "2026-07-22T10:15:30Z" ], + "examples" : [ "2022-03-10T16:15:50Z" ], "$ref" : "#/components/schemas/Instant" }, - "initialEvidence" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/EvidenceMessageRequest" - } + "caseRevision" : { + "type" : [ "integer", "null" ], + "format" : "int64" + }, + "replay" : { + "type" : "boolean" } } }, - "PolicyDocument" : { + "CreateChatMuteRequest" : { "type" : "object", - "required" : [ "schemaVersion", "riskRules", "domainThresholds", "automaticConfirmationRules" ], + "required" : [ "operationId", "expectedCaseRevision", "presetKey", "category", "severity", "internalReason" ], "properties" : { - "schemaVersion" : { + "operationId" : { + "$ref" : "#/components/schemas/UUID" + }, + "expectedCaseRevision" : { "type" : "integer", - "format" : "int32", - "maximum" : 2, - "minimum" : 2, - "description" : "Policy document schema version supported by this service release." + "format" : "int64" }, - "riskRules" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/RiskRule" - }, - "description" : "Complete matrix of eight violation types and four severities.", - "maxItems" : 32, - "minItems" : 32 + "presetKey" : { + "type" : "string" }, - "domainThresholds" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/DomainThreshold" - }, - "description" : "Exactly one restriction threshold for each risk domain.", - "maxItems" : 3, - "minItems" : 3 + "category" : { + "type" : "string" }, - "automaticConfirmationRules" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/AutomaticConfirmationRule" - } + "severity" : { + "type" : "string" + }, + "internalReason" : { + "type" : "string" + }, + "findingId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] } } }, - "PolicyLifecycleRequest" : { - "description" : "Audit reason for a policy lifecycle mutation.", + "CreatePolicyDraftRequest" : { + "description" : "Selects the policy version copied into a new draft.", "type" : "object", - "required" : [ "reason" ], "properties" : { - "reason" : { - "type" : "string", - "maxLength" : 2000, - "minLength" : 1, - "description" : "Required audit reason." + "basedOnPolicyVersionId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] } } }, - "PolicyStatus" : { + "DomainModerationStatus" : { "type" : "string", - "enum" : [ "DRAFT", "SCHEDULED", "ACTIVE", "RETIRED" ] + "enum" : [ "CLEAR", "WARNED", "RESTRICTED" ] }, - "PolicyTaxonomyResponse" : { - "description" : "Closed moderation taxonomy used by every policy document.", + "DomainThreshold" : { "type" : "object", - "required" : [ "riskDomains", "violationTypes", "severities", "policyStatuses", "automaticConfirmationSources", "automaticConfirmationModes" ], + "required" : [ "domain", "restrictedAt" ], "properties" : { - "riskDomains" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/RiskDomain" - } + "domain" : { + "$ref" : "#/components/schemas/RiskDomain" }, - "violationTypes" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/ViolationTypeResponse" - } + "restrictedAt" : { + "type" : "integer", + "format" : "int32", + "minimum" : 1, + "description" : "Positive effective-point threshold for the restricted domain status." + } + } + }, + "Duration" : { + "type" : "string", + "format" : "duration", + "examples" : [ "P1D" ] + }, + "EnforcementApprovalDto" : { + "type" : "object", + "required" : [ "id", "kind", "status", "requestedBy", "expiresAt" ], + "properties" : { + "id" : { + "$ref" : "#/components/schemas/UUID" }, - "severities" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/Severity" - } + "kind" : { + "$ref" : "#/components/schemas/EnforcementApprovalKind" }, - "policyStatuses" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/PolicyStatus" - } + "status" : { + "$ref" : "#/components/schemas/EnforcementApprovalState" }, - "automaticConfirmationSources" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/AutomaticConfirmationSource" - } + "requestedBy" : { + "type" : "string" }, - "automaticConfirmationModes" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/AutomaticConfirmationMode" - } + "expiresAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "internalReason" : { + "type" : [ "string", "null" ] } } }, - "PolicyVersionResponse" : { - "description" : "Complete immutable snapshot and lifecycle state of a policy version.", + "EnforcementApprovalKind" : { + "type" : "string", + "enum" : [ "CREATE", "REVOKE" ] + }, + "EnforcementApprovalState" : { + "type" : "string", + "enum" : [ "PENDING", "APPROVED", "REJECTED", "WITHDRAWN", "EXPIRED" ] + }, + "EnforcementDistributionStatus" : { + "type" : "string", + "enum" : [ "PENDING", "PARTIAL", "APPLIED" ] + }, + "EnforcementMeasureDto" : { "type" : "object", - "required" : [ "id", "versionNumber", "status", "document", "draftRevision", "scheduledFor", "activatedAt" ], + "required" : [ "id", "publicReference", "environment", "caseId", "playerId", "findingId", "type", "status", "revision", "startsAt", "expiresAt", "remainingDurationMillis", "approvalExpiresAt", "createdBy", "source", "category", "severity", "createdAt", "updatedAt", "actionRetryUntil" ], "properties" : { "id" : { "$ref" : "#/components/schemas/UUID" }, - "versionNumber" : { - "type" : "integer", - "format" : "int64" + "publicReference" : { + "type" : "string" }, - "status" : { - "$ref" : "#/components/schemas/PolicyStatus" + "environment" : { + "$ref" : "#/components/schemas/ModerationEnvironment" }, - "document" : { - "$ref" : "#/components/schemas/PolicyDocument" + "caseId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] }, - "draftRevision" : { + "playerId" : { + "$ref" : "#/components/schemas/UUID" + }, + "findingId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "type" : { + "$ref" : "#/components/schemas/EnforcementType" + }, + "status" : { + "$ref" : "#/components/schemas/EnforcementState" + }, + "revision" : { "type" : "integer", "format" : "int64" }, - "scheduledFor" : { + "startsAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "expiresAt" : { "anyOf" : [ { "$ref" : "#/components/schemas/Instant" }, { "type" : "null" } ] }, - "activatedAt" : { + "remainingDurationMillis" : { + "type" : [ "integer", "null" ], + "format" : "int64" + }, + "approvalExpiresAt" : { "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" : { + "createdBy" : { "type" : "string" }, - "status" : { - "type" : "integer", - "format" : "int32" + "source" : { + "$ref" : "#/components/schemas/EnforcementSource" }, - "detail" : { - "type" : "string" + "category" : { + "$ref" : "#/components/schemas/ViolationType" }, - "code" : { - "type" : [ "string", "null" ] + "severity" : { + "$ref" : "#/components/schemas/Severity" }, - "findingId" : { + "createdAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "updatedAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "actionRetryUntil" : { "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" + "$ref" : "#/components/schemas/Instant" }, { "type" : "null" } ] } } }, - "ReplacePolicyDraftRequest" : { - "description" : "Complete validated document replacing the current draft snapshot.", + "EnforcementPresetDto" : { "type" : "object", - "required" : [ "document" ], + "required" : [ "key", "durationSeconds" ], "properties" : { - "document" : { - "$ref" : "#/components/schemas/PolicyDocument" + "key" : { + "type" : "string" + }, + "durationSeconds" : { + "type" : "integer", + "format" : "int64" } } }, - "ReportCategory" : { - "type" : "string", - "enum" : [ "HARASSMENT", "SPAM", "THREAT_OR_HATE", "ADVERTISEMENT_OR_SCAM", "OTHER" ] - }, - "ReportOrigin" : { + "EnforcementPresetsResponse" : { "type" : "object", - "description" : "Runtime origin of a report or evidence message.", - "examples" : [ { - "runtimeId" : "proxy-eu-1", - "serverId" : "lobby-1" - } ], - "required" : [ "runtimeId", "serverId" ], + "required" : [ "presets", "types", "unboundedMuteAllowed", "customDurationAllowed", "maximumDurationSeconds" ], "properties" : { - "runtimeId" : { - "type" : "string", - "examples" : [ "proxy-eu-1" ] + "presets" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/EnforcementPresetDto" + } }, - "serverId" : { - "type" : "string", - "examples" : [ "lobby-1" ] + "types" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/EnforcementType" + } + }, + "unboundedMuteAllowed" : { + "type" : "boolean" + }, + "customDurationAllowed" : { + "type" : "boolean" + }, + "maximumDurationSeconds" : { + "type" : "integer", + "format" : "int64" } } }, - "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 - } ], + "EnforcementProxyAckRequest" : { "type" : "object", - "required" : [ "reportId", "caseId", "evidenceCaptureId" ], + "required" : [ "epoch", "cursor" ], "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" ], + "epoch" : { "$ref" : "#/components/schemas/UUID" }, - "publicReference" : { - "type" : [ "string", "null" ], - "pattern" : "^R-[A-HJ-NP-Z2-9]{6}$", - "examples" : [ "R-7K3M2Q" ] - }, - "created" : { - "type" : "boolean", - "examples" : [ true ] + "cursor" : { + "type" : "integer", + "format" : "int64" } } }, - "RiskDomain" : { - "type" : "string", - "enum" : [ "CHAT", "SOCIAL", "REPORT_ABUSE" ] - }, - "RiskLedgerEntrySource" : { + "EnforcementProxyCapability" : { "type" : "string", - "enum" : [ "MANUAL", "AUTOMATIC", "CORRECTION" ] + "enum" : [ "CHAT_MUTE", "BAN_DISCONNECT", "MODERATION_KICK", "MESSAGE_DELETE_UNSUPPORTED" ] }, - "RiskLedgerQueryItemResponse" : { - "description" : "Internal risk ledger projection available only to authorized supporters.", + "EnforcementResponseDto" : { "type" : "object", - "required" : [ "ledgerEntryId", "findingId", "correctionId", "originLedgerEntryId", "riskDomain", "violationType", "severity", "signedPoints", "effectiveAt", "expiresAt", "policyVersionId", "source" ], + "required" : [ "measure", "distribution", "replay", "approval" ], "properties" : { - "ledgerEntryId" : { - "$ref" : "#/components/schemas/UUID" + "measure" : { + "$ref" : "#/components/schemas/EnforcementMeasureDto" }, - "findingId" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" - }, { - "type" : "null" - } ] + "distribution" : { + "$ref" : "#/components/schemas/GenericEnforcementDistributionStatus" }, - "correctionId" : { - "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" - }, { - "type" : "null" - } ] + "replay" : { + "type" : "boolean" }, - "originLedgerEntryId" : { + "approval" : { "anyOf" : [ { - "$ref" : "#/components/schemas/UUID" + "$ref" : "#/components/schemas/EnforcementApprovalDto" }, { "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" ] - } - } + "EnforcementSource" : { + "type" : "string", + "enum" : [ "PORTAL", "MINECRAFT", "AUTOMATIC" ] }, - "RiskRule" : { + "EnforcementState" : { + "type" : "string", + "enum" : [ "PENDING_APPROVAL", "ACTIVE", "SUSPENDED", "COMPLETED", "EXPIRED", "REVOKED", "REJECTED", "WITHDRAWN", "FAILED" ] + }, + "EnforcementStatus" : { + "type" : "string", + "enum" : [ "ACTIVE", "EXPIRED", "REVOKED" ] + }, + "EnforcementType" : { + "type" : "string", + "enum" : [ "MESSAGE_DELETE", "MODERATION_KICK", "CHAT_MUTE", "TEMP_BAN", "PERMANENT_BAN" ] + }, + "EvidenceAppendReceipt" : { + "description" : "Result of an idempotent evidence append operation.", + "examples" : [ { + "evidenceCaptureId" : "81b1174f-f634-4304-a537-31c6a416af88", + "addedCount" : 1, + "existingCount" : 0, + "storedMessageCount" : 12, + "status" : "OPEN" + } ], "type" : "object", - "required" : [ "violationType", "severity", "points", "ttl", "enabled" ], + "required" : [ "evidenceCaptureId", "addedCount", "existingCount", "storedMessageCount", "status" ], "properties" : { - "violationType" : { - "$ref" : "#/components/schemas/ViolationType" + "evidenceCaptureId" : { + "$ref" : "#/components/schemas/UUID" }, - "severity" : { - "$ref" : "#/components/schemas/Severity" + "addedCount" : { + "type" : "integer", + "format" : "int32" }, - "points" : { + "existingCount" : { "type" : "integer", - "format" : "int32", - "minimum" : 1, - "description" : "Positive risk points contributed by this rule." + "format" : "int32" }, - "ttl" : { - "description" : "Positive ISO-8601 duration for which the risk contribution remains active.", - "type" : "string", - "examples" : [ "P14D" ], - "$ref" : "#/components/schemas/Duration" + "storedMessageCount" : { + "type" : "integer", + "format" : "int32" }, - "enabled" : { - "type" : "boolean" + "status" : { + "$ref" : "#/components/schemas/CaptureStatus" } } }, - "SchedulePolicyRequest" : { - "description" : "Future activation time and audit reason for a policy draft.", + "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" : [ "activateAt", "reason" ], + "required" : [ "evidenceCaptureId", "status", "storedMessageCount", "changed" ], "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" + "evidenceCaptureId" : { + "$ref" : "#/components/schemas/UUID" }, - "reason" : { - "type" : "string", - "maxLength" : 2000, - "minLength" : 1, - "description" : "Required audit reason." + "status" : { + "$ref" : "#/components/schemas/CaptureStatus" + }, + "storedMessageCount" : { + "type" : "integer", + "format" : "int32" + }, + "changed" : { + "type" : "boolean" } } }, - "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.", + "EvidenceMessageRequest" : { + "type" : "object", + "description" : "Immutable chat message promoted to moderation evidence.", "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" : [ ] + "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" } ], - "type" : "object", - "required" : [ "targetPlayerId", "category", "primaryMessageId", "origin", "submittedAt", "source", "detectedCategory", "detectorVersion", "ruleId", "initialEvidence" ], + "required" : [ "messageId", "senderPlayerId", "content", "sentAt", "role", "sequence", "channel", "runtimeId", "serverId", "visibility", "signatureStatus" ], "properties" : { - "targetPlayerId" : { + "messageId" : { "type" : "string", - "examples" : [ "6be90520-6c3e-4431-a7f2-d3eadf831e17" ], + "examples" : [ "28bb4bbf-96c4-4e9c-89b9-132553ee2e34" ], "$ref" : "#/components/schemas/UUID" }, - "category" : { - "$ref" : "#/components/schemas/ReportCategory" - }, - "primaryMessageId" : { + "senderPlayerId" : { "type" : "string", - "examples" : [ "28bb4bbf-96c4-4e9c-89b9-132553ee2e34" ], + "examples" : [ "6be90520-6c3e-4431-a7f2-d3eadf831e17" ], "$ref" : "#/components/schemas/UUID" }, - "origin" : { - "$ref" : "#/components/schemas/ReportOrigin" + "content" : { + "type" : "string", + "examples" : [ "Please stop sending repeated messages." ] }, - "submittedAt" : { + "sentAt" : { "type" : "string", "examples" : [ "2026-07-22T10:15:30Z" ], "$ref" : "#/components/schemas/Instant" }, - "source" : { + "role" : { + "$ref" : "#/components/schemas/EvidenceRole" + }, + "sequence" : { + "type" : "integer", + "format" : "int32", + "minimum" : 0, + "examples" : [ 0 ] + }, + "channel" : { + "$ref" : "#/components/schemas/MessageChannel" + }, + "runtimeId" : { "type" : "string", - "examples" : [ "static-filter" ] + "examples" : [ "proxy-eu-1" ] }, - "detectedCategory" : { - "$ref" : "#/components/schemas/ReportCategory" + "serverId" : { + "type" : "string", + "examples" : [ "lobby-1" ] }, - "detectorVersion" : { + "visibility" : { + "$ref" : "#/components/schemas/MessageVisibility" + }, + "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}" + } + }, + "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" + } + } + }, + "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" : [ "correctionId", "type", "replacementFindingId", "correctedAt" ], + "properties" : { + "correctionId" : { + "$ref" : "#/components/schemas/UUID" + }, + "type" : { + "$ref" : "#/components/schemas/FindingCorrectionType" + }, + "replacementFindingId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "correctedAt" : { "type" : "string", - "examples" : [ "2026.07" ] + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" + } + } + }, + "FindingCorrectionType" : { + "type" : "string", + "enum" : [ "INVALIDATE", "RECLASSIFY" ] + }, + "FindingOrigin" : { + "type" : "string", + "enum" : [ "MESSAGE", "STAFF_ACTION" ] + }, + "FindingQueryItemResponse" : { + "description" : "Safe portal projection of one confirmed moderation finding.", + "type" : "object", + "required" : [ "findingId", "findingIdentityId", "targetPlayerId", "caseId", "reportId", "primaryMessageId", "supportingMessageIds", "violationType", "severity", "source", "confirmedAt", "policyVersionId", "replacesFindingId", "correction" ], + "properties" : { + "findingId" : { + "$ref" : "#/components/schemas/UUID" }, - "ruleId" : { + "findingIdentityId" : { + "$ref" : "#/components/schemas/UUID" + }, + "targetPlayerId" : { + "$ref" : "#/components/schemas/UUID" + }, + "caseId" : { + "$ref" : "#/components/schemas/UUID" + }, + "reportId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "primaryMessageId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "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}" + } + }, + "violationType" : { + "$ref" : "#/components/schemas/ViolationType" + }, + "severity" : { + "$ref" : "#/components/schemas/Severity" + }, + "source" : { + "$ref" : "#/components/schemas/FindingConfirmationSource" + }, + "confirmedAt" : { "type" : "string", - "examples" : [ "repeated-message" ] + "examples" : [ "2022-03-10T16:15:50Z" ], + "$ref" : "#/components/schemas/Instant" }, - "scores" : { - "type" : [ "object", "null" ], - "additionalProperties" : { - "type" : "number", - "format" : "double" - }, - "examples" : [ { - "spam" : 0.97 + "policyVersionId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" } ] }, - "initialEvidence" : { + "replacesFindingId" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "correction" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/FindingCorrectionRelationshipResponse" + }, { + "type" : "null" + } ] + }, + "origin" : { + "$ref" : "#/components/schemas/FindingOrigin" + } + } + }, + "FindingQueryPageResponse" : { + "description" : "Cursor page of safe moderation finding projections.", + "type" : "object", + "required" : [ "items", "nextCursor" ], + "properties" : { + "items" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/EvidenceMessageRequest" + "$ref" : "#/components/schemas/FindingQueryItemResponse" } + }, + "nextCursor" : { + "type" : [ "string", "null" ] } } }, - "UUID" : { + "GenericEnforcementDistributionStatus" : { "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" : [ "PENDING", "PARTIAL", "APPLIED", "NOT_ENFORCED" ] }, - "ViolationType" : { + "GlobalModerationStatus" : { "type" : "string", - "enum" : [ "ABUSIVE_LANGUAGE", "SPAM", "ADVERTISEMENT_OR_SCAM", "HARASSMENT", "THREAT_OR_HATE", "SEXUAL_CONTENT", "PERSONAL_DATA_EXPOSURE", "REPORT_ABUSE" ] + "enum" : [ "CLEAR", "WARNED", "RESTRICTED", "SUSPENDED", "BANNED" ] }, - "ViolationTypeResponse" : { + "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", - "description" : "Fixed violation type and its code-defined risk domain.", - "required" : [ "type", "domain" ], + "required" : [ "domain", "effectivePoints", "status" ], "properties" : { - "type" : { - "$ref" : "#/components/schemas/ViolationType" + "domain" : { + "$ref" : "#/components/schemas/RiskDomain" + }, + "effectivePoints" : { + "type" : "integer", + "format" : "int32" + }, + "status" : { + "$ref" : "#/components/schemas/DomainModerationStatus" + } + } + }, + "InternalModerationStatusResponse" : { + "description" : "Internal moderation status calculation for authorized portal supporters.", + "additionalProperties" : false, + "type" : "object", + "required" : [ "playerId", "domains", "pointBasedStatus", "effectiveStatus", "reasonCode", "statusSince", "earliestImprovementAt", "calculatedAt", "nextEvaluationAt", "snapshotRevision" ], + "properties" : { + "playerId" : { + "$ref" : "#/components/schemas/UUID" + }, + "domains" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/InternalDomainStatusResponse" + } + }, + "pointBasedStatus" : { + "$ref" : "#/components/schemas/GlobalModerationStatus" + }, + "effectiveStatus" : { + "$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" + } ] + }, + "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" ] + }, + "LocalEnforcementOutcome" : { + "type" : "string", + "enum" : [ "APPLIED", "NO_LOCAL_SESSION", "UNSUPPORTED", "FAILED" ] + }, + "LocalEnforcementResult" : { + "type" : "object", + "required" : [ "enforcementId", "revision", "outcome", "observedAt" ], + "properties" : { + "enforcementId" : { + "$ref" : "#/components/schemas/UUID" + }, + "revision" : { + "type" : "integer", + "format" : "int64" + }, + "outcome" : { + "$ref" : "#/components/schemas/LocalEnforcementOutcome" + }, + "observedAt" : { + "$ref" : "#/components/schemas/Instant" + } + } + }, + "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" ] + }, + "OwnedAppeal" : { + "type" : "object", + "required" : [ "id", "enforcementId", "status", "statement", "revision", "filedAt", "decidedAt", "safeExplanation", "filingDeadline" ], + "properties" : { + "id" : { + "$ref" : "#/components/schemas/UUID" + }, + "enforcementId" : { + "$ref" : "#/components/schemas/UUID" + }, + "status" : { + "$ref" : "#/components/schemas/AppealStatus" + }, + "statement" : { + "type" : "string" + }, + "revision" : { + "type" : "integer", + "format" : "int64" + }, + "filedAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "decidedAt" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + }, + "safeExplanation" : { + "type" : [ "string", "null" ] + }, + "filingDeadline" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + } + } + }, + "OwnedMeasure" : { + "type" : "object", + "required" : [ "id", "publicReference", "playerId", "type", "status", "safeReasonCode", "startsAt", "expiresAt", "createdAt", "updatedAt", "appealEligible", "appealDeadline", "appeal" ], + "properties" : { + "id" : { + "$ref" : "#/components/schemas/UUID" + }, + "publicReference" : { + "type" : "string" + }, + "playerId" : { + "$ref" : "#/components/schemas/UUID" + }, + "type" : { + "$ref" : "#/components/schemas/EnforcementType" + }, + "status" : { + "$ref" : "#/components/schemas/EnforcementState" + }, + "safeReasonCode" : { + "type" : "string" + }, + "startsAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "expiresAt" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + }, + "createdAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "updatedAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "appealEligible" : { + "type" : "boolean" + }, + "appealDeadline" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + }, + "appeal" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/OwnedAppeal" + }, { + "type" : "null" + } ] + } + } + }, + "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" : { + "runtimeId" : "proxy-eu-1", + "serverId" : "lobby-1" + }, + "submittedAt" : "2026-07-22T10:15:30Z", + "initialEvidence" : [ ] + } ], + "type" : "object", + "required" : [ "reporterPlayerId", "targetPlayerId", "category", "primaryMessageId", "origin", "submittedAt", "initialEvidence" ], + "properties" : { + "reporterPlayerId" : { + "type" : "string", + "examples" : [ "9ad4b488-49d6-4c72-932b-98bead1fef83" ], + "$ref" : "#/components/schemas/UUID" + }, + "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" + }, + "initialEvidence" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/EvidenceMessageRequest" + } + } + } + }, + "PlayerReportState" : { + "type" : "string", + "enum" : [ "RECEIVED", "UNDER_REVIEW", "COMPLETED_MEASURES", "COMPLETED_NO_MEASURES" ] + }, + "PlayerReportStatusListResponse" : { + "type" : "object", + "required" : [ "items" ], + "properties" : { + "items" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/PlayerReportStatusResponse" + } + } + } + }, + "PlayerReportStatusResponse" : { + "type" : "object", + "required" : [ "publicReference", "state", "submittedAt", "updatedAt", "completedAt" ], + "properties" : { + "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" + } + }, + "automaticEnforcementRules" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/AutomaticEnforcementRule" + } + } + } + }, + "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" + } + } + }, + "RegisterTypedEnforcementProxyRequest" : { + "type" : "object", + "required" : [ "bootNonce", "schemaVersion", "capabilities" ], + "properties" : { + "bootNonce" : { + "$ref" : "#/components/schemas/UUID" + }, + "schemaVersion" : { + "type" : "integer", + "format" : "int32" + }, + "capabilities" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/EnforcementProxyCapability" + } + } + } + }, + "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" ] + }, + "StaffAppeal" : { + "type" : "object", + "required" : [ "id", "enforcementId", "status", "statement", "revision", "filedAt", "decidedAt", "safeExplanation", "filingDeadline", "playerId", "caseId", "publicReference", "enforcementType", "enforcementStatus" ], + "properties" : { + "id" : { + "$ref" : "#/components/schemas/UUID" + }, + "enforcementId" : { + "$ref" : "#/components/schemas/UUID" + }, + "status" : { + "$ref" : "#/components/schemas/AppealStatus" + }, + "statement" : { + "type" : "string" + }, + "revision" : { + "type" : "integer", + "format" : "int64" + }, + "filedAt" : { + "$ref" : "#/components/schemas/Instant" + }, + "decidedAt" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + }, + "safeExplanation" : { + "type" : [ "string", "null" ] + }, + "filingDeadline" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/Instant" + }, { + "type" : "null" + } ] + }, + "playerId" : { + "$ref" : "#/components/schemas/UUID" + }, + "caseId" : { + "$ref" : "#/components/schemas/UUID" + }, + "publicReference" : { + "type" : "string" + }, + "enforcementType" : { + "$ref" : "#/components/schemas/EnforcementType" + }, + "enforcementStatus" : { + "$ref" : "#/components/schemas/EnforcementState" + } + } + }, + "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" + } + } + } + }, + "TypedEnforcementProxyResultsRequest" : { + "type" : "object", + "required" : [ "results" ], + "properties" : { + "results" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/LocalEnforcementResult" + } + } + } + }, + "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.8.4" + }, + "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}/enforcements" : { + "post" : { + "parameters" : [ { + "name" : "caseId", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "Idempotency-Key", + "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/JsonNode" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Create Case", + "tags" : [ "Generic Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + }, + "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/EnforcementResponseDto" + } + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Case", + "tags" : [ "Generic Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/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" ] + }, + "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" + } + }, + "/v1/moderation/cases/{caseId}/resolve" : { + "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" : "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" : "OK", + "content" : { + "application/json" : { + "schema" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/ChatMutePreset" + } + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Presets", + "tags" : [ "Chat Mute Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-appeals" : { + "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" : "OK", + "content" : { + "application/json" : { + "schema" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/StaffAppeal" + } + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "List", + "tags" : [ "Staff Appeal Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-appeals/{id}" : { + "get" : { + "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 + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/StaffAppeal" + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Get", + "tags" : [ "Staff Appeal Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-appeals/{id}/decisions" : { + "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/JsonNode" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Decide", + "tags" : [ "Staff Appeal Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-minecraft/actions" : { + "post" : { + "parameters" : [ { + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/JsonNode" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Action", + "tags" : [ "Minecraft Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-minecraft/commands" : { + "post" : { + "parameters" : [ { + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/JsonNode" + } + } + }, + "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" : [ "Minecraft Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-minecraft/measures/{reference}" : { + "get" : { + "parameters" : [ { + "name" : "reference", + "in" : "path", + "required" : true, + "schema" : { + "type" : "string" + } + }, { + "name" : "actorPlayerId", + "in" : "query", + "schema" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "required" : true + }, { + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/EnforcementResponseDto" + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Measure", + "tags" : [ "Minecraft Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-minecraft/own-measures" : { + "get" : { + "parameters" : [ { + "name" : "actorPlayerId", + "in" : "query", + "schema" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "required" : true + }, { + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/OwnedMeasure" + } + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Own", + "tags" : [ "Minecraft Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-minecraft/presets" : { + "get" : { + "parameters" : [ { + "name" : "actorPlayerId", + "in" : "query", + "schema" : { + "anyOf" : [ { + "$ref" : "#/components/schemas/UUID" + }, { + "type" : "null" + } ] + }, + "required" : true + }, { + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/EnforcementPresetsResponse" + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Presets", + "tags" : [ "Minecraft Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-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" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/EnforcementPresetsResponse" + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Presets", + "tags" : [ "Generic Enforcement 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/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "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" ] + }, + "required" : true + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/RegisterEnforcementProxyRequest" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "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/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Close", + "tags" : [ "Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/sessions/{id}/acks" : { + "post" : { + "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 + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/EnforcementProxyAckRequest" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Acknowledge", + "tags" : [ "Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/sessions/{id}/heartbeat" : { + "post" : { + "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/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "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/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Snapshot", + "tags" : [ "Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/v2/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/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Events", + "tags" : [ "Typed Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/v2/sessions" : { + "post" : { + "parameters" : [ { + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/RegisterTypedEnforcementProxyRequest" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Register", + "tags" : [ "Typed Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/v2/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/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Close", + "tags" : [ "Typed Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/v2/sessions/{id}/acks" : { + "post" : { + "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 + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/EnforcementProxyAckRequest" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Acknowledge", + "tags" : [ "Typed Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/v2/sessions/{id}/results" : { + "post" : { + "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 + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TypedEnforcementProxyResultsRequest" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Results", + "tags" : [ "Typed Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcement-proxy/v2/snapshot" : { + "get" : { + "parameters" : [ { + "name" : "X-Grounds-Moderation-Environment", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Snapshot", + "tags" : [ "Typed Enforcement Proxy Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcements" : { + "get" : { + "parameters" : [ { + "name" : "status", + "in" : "query", + "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" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/EnforcementResponseDto" + } + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Pending", + "tags" : [ "Generic Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcements/staff-actions" : { + "post" : { + "parameters" : [ { + "name" : "Idempotency-Key", + "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/JsonNode" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Create Staff", + "tags" : [ "Generic Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcements/{id}" : { + "get" : { + "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 + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/EnforcementResponseDto" + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Get", + "tags" : [ "Generic Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcements/{id}/actions" : { + "post" : { + "parameters" : [ { + "name" : "id", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "Idempotency-Key", + "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/JsonNode" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" }, - "domain" : { - "$ref" : "#/components/schemas/RiskDomain" + "400" : { + "description" : "Bad Request" } - } + }, + "summary" : "Action", + "tags" : [ "Generic Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] } }, - "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/enforcements/{id}/approval-decisions" : { "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" : [ { + "name" : "id", "in" : "path", - "name" : "caseId", "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.", - "in" : "header", "name" : "X-Grounds-Actor-Id", - "required" : true, + "in" : "header", "schema" : { "type" : [ "string", "null" ] - } + }, + "required" : true }, { - "description" : "Exact effective portal permission for this operation.", + "name" : "X-Grounds-Portal-Permissions", "in" : "header", - "name" : "X-Grounds-Portal-Permission", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/JsonNode" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Approval", + "tags" : [ "Generic Enforcement Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/enforcements/{id}/revoke" : { + "post" : { + "parameters" : [ { + "name" : "id", + "in" : "path", "required" : true, "schema" : { - "type" : [ "string", "null" ], - "enum" : [ "moderation.finding.confirm" ] + "$ref" : "#/components/schemas/UUID" } }, { - "description" : "Optional request correlation identifier.", + "name" : "X-Grounds-Actor-Id", "in" : "header", - "name" : "X-Request-Id", - "required" : false, "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/ConfirmManualFindingRequest" + "$ref" : "#/components/schemas/RevokeChatMuteRequest" } } }, "required" : true }, "responses" : { - "201" : { - "description" : "Finding confirmed.", + "200" : { + "description" : "OK", "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/ConfirmManualFindingResponse" + "$ref" : "#/components/schemas/ChatMuteResponse" } } } }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "Revoke", + "tags" : [ "Chat Mute Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/evidence-captures/{captureId}/completion" : { + "put" : { + "summary" : "Complete an evidence capture", + "description" : "Idempotently transitions an open evidence capture to a terminal state.", + "tags" : [ "Moderation evidence" ], + "parameters" : [ { + "description" : "Evidence capture identifier.", + "in" : "path", + "name" : "captureId", + "required" : true, + "schema" : { + "format" : "uuid", + "type" : "string" + } + }, { + "description" : "Stable UUID for one logical completion operation.", + "in" : "header", + "name" : "Idempotency-Key", + "required" : true, + "schema" : { + "format" : "uuid", + "type" : [ "string", "null" ] + } + }, { + "description" : "Request identifier to propagate, or omit to generate one.", + "in" : "header", + "name" : "X-Request-Id", + "required" : false, + "schema" : { + "type" : [ "string", "null" ] + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/CompleteEvidenceCaptureRequest" + } + } + }, + "required" : true + }, + "responses" : { "200" : { - "description" : "Idempotent replay of a confirmed finding.", + "description" : "Evidence capture completed or the operation was replayed.", "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/ConfirmManualFindingResponse" + "$ref" : "#/components/schemas/EvidenceCompletionReceipt" } } } }, "400" : { - "description" : "Invalid JSON or idempotency key.", + "description" : "Invalid JSON, path identifier, or header.", "content" : { "application/problem+json" : { "schema" : { @@ -1367,7 +4917,7 @@ } }, "403" : { - "description" : "Portal actor context is not authorized.", + "description" : "The service is unauthorized or does not own the capture.", "content" : { "application/problem+json" : { "schema" : { @@ -1377,7 +4927,7 @@ } }, "404" : { - "description" : "The moderation case was not found.", + "description" : "The evidence capture does not exist.", "content" : { "application/problem+json" : { "schema" : { @@ -1387,7 +4937,7 @@ } }, "409" : { - "description" : "Case, idempotency, or finding identity conflicts with state.", + "description" : "The operation, expected count, or capture state conflicts.", "content" : { "application/problem+json" : { "schema" : { @@ -1397,7 +4947,7 @@ } }, "422" : { - "description" : "The finding classification or evidence selection is invalid.", + "description" : "The requested terminal status or reason is invalid.", "content" : { "application/problem+json" : { "schema" : { @@ -1420,57 +4970,33 @@ "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/evidence-captures/{captureId}/messages" : { + "post" : { + "summary" : "Append evidence messages", + "description" : "Atomically appends immutable context to an open evidence capture.", + "tags" : [ "Moderation evidence" ], "parameters" : [ { + "description" : "Evidence capture identifier.", "in" : "path", - "name" : "caseId", + "name" : "captureId", "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.", + "description" : "Stable UUID for one logical append operation.", "in" : "header", - "name" : "X-Grounds-Actor-Id", + "name" : "Idempotency-Key", "required" : true, "schema" : { + "format" : "uuid", "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.", + "description" : "Request identifier to propagate, or omit to generate one.", "in" : "header", "name" : "X-Request-Id", "required" : false, @@ -1478,19 +5004,39 @@ "type" : [ "string", "null" ] } } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/AppendEvidenceMessagesRequest" + } + } + }, + "required" : true + }, "responses" : { "200" : { - "description" : "Finding page.", + "description" : "Evidence append accepted or replayed.", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/EvidenceAppendReceipt" + } + } + } + }, + "400" : { + "description" : "Invalid JSON, path identifier, or header.", "content" : { - "application/json" : { + "application/problem+json" : { "schema" : { - "$ref" : "#/components/schemas/FindingQueryPageResponse" + "$ref" : "#/components/schemas/ProblemDetails" } } } }, "401" : { - "description" : "Authentication is missing.", + "description" : "Authentication is missing or invalid.", "content" : { "application/problem+json" : { "schema" : { @@ -1500,7 +5046,27 @@ } }, "403" : { - "description" : "Portal actor is not authorized.", + "description" : "The service is unauthorized or does not own the capture.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "404" : { + "description" : "The evidence capture does not exist.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "409" : { + "description" : "The operation, message, or capture state conflicts.", "content" : { "application/problem+json" : { "schema" : { @@ -1510,7 +5076,17 @@ } }, "422" : { - "description" : "Cursor or limit is invalid.", + "description" : "The evidence batch violates capture rules.", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/ProblemDetails" + } + } + } + }, + "429" : { + "description" : "The configured append limit was exceeded.", "content" : { "application/problem+json" : { "schema" : { @@ -1535,22 +5111,21 @@ } ] } }, - "/v1/moderation/evidence-captures/{captureId}/completion" : { - "put" : { - "summary" : "Complete an evidence capture", - "description" : "Idempotently transitions an open evidence capture to a terminal state.", - "tags" : [ "Moderation evidence" ], + "/v1/moderation/findings/{findingId}/corrections" : { + "post" : { + "summary" : "Correct a confirmed finding", + "description" : "Invalidates or reclassifies the current finding version without mutating history.", + "tags" : [ "Moderation findings" ], "parameters" : [ { - "description" : "Evidence capture identifier.", "in" : "path", - "name" : "captureId", + "name" : "findingId", "required" : true, "schema" : { "format" : "uuid", "type" : "string" } }, { - "description" : "Stable UUID for one logical completion operation.", + "description" : "Stable UUID for one logical finding correction.", "in" : "header", "name" : "Idempotency-Key", "required" : true, @@ -1559,7 +5134,32 @@ "type" : [ "string", "null" ] } }, { - "description" : "Request identifier to propagate, or omit to generate one.", + "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, @@ -1571,25 +5171,35 @@ "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/CompleteEvidenceCaptureRequest" + "$ref" : "#/components/schemas/CorrectFindingRequest" } } }, "required" : true }, "responses" : { + "201" : { + "description" : "Finding corrected.", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/CorrectFindingResponse" + } + } + } + }, "200" : { - "description" : "Evidence capture completed or the operation was replayed.", + "description" : "Idempotent replay of a finding correction.", "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/EvidenceCompletionReceipt" + "$ref" : "#/components/schemas/CorrectFindingResponse" } } } }, "400" : { - "description" : "Invalid JSON, path identifier, or header.", + "description" : "Invalid JSON or idempotency key.", "content" : { "application/problem+json" : { "schema" : { @@ -1599,7 +5209,7 @@ } }, "401" : { - "description" : "Authentication is missing or invalid.", + "description" : "Authentication is missing.", "content" : { "application/problem+json" : { "schema" : { @@ -1609,7 +5219,7 @@ } }, "403" : { - "description" : "The service is unauthorized or does not own the capture.", + "description" : "Portal actor is not authorized.", "content" : { "application/problem+json" : { "schema" : { @@ -1619,7 +5229,7 @@ } }, "404" : { - "description" : "The evidence capture does not exist.", + "description" : "Finding was not found.", "content" : { "application/problem+json" : { "schema" : { @@ -1629,7 +5239,7 @@ } }, "409" : { - "description" : "The operation, expected count, or capture state conflicts.", + "description" : "Finding correction conflicts.", "content" : { "application/problem+json" : { "schema" : { @@ -1639,7 +5249,7 @@ } }, "422" : { - "description" : "The requested terminal status or reason is invalid.", + "description" : "Correction request is invalid.", "content" : { "application/problem+json" : { "schema" : { @@ -1664,22 +5274,13 @@ } ] } }, - "/v1/moderation/evidence-captures/{captureId}/messages" : { + "/v1/moderation/player-reports" : { "post" : { - "summary" : "Append evidence messages", - "description" : "Atomically appends immutable context to an open evidence capture.", - "tags" : [ "Moderation evidence" ], + "summary" : "Submit a player report", + "description" : "Stores a player report and immutable initial evidence under the exact message anchor.", + "tags" : [ "Moderation intake" ], "parameters" : [ { - "description" : "Evidence capture identifier.", - "in" : "path", - "name" : "captureId", - "required" : true, - "schema" : { - "format" : "uuid", - "type" : "string" - } - }, { - "description" : "Stable UUID for one logical append operation.", + "description" : "Stable UUID for one logical submission attempt.", "in" : "header", "name" : "Idempotency-Key", "required" : true, @@ -1700,7 +5301,7 @@ "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/AppendEvidenceMessagesRequest" + "$ref" : "#/components/schemas/PlayerReportRequest" } } }, @@ -1708,27 +5309,27 @@ }, "responses" : { "200" : { - "description" : "Evidence append accepted or replayed.", + "description" : "Idempotent replay of an existing report.", "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/EvidenceAppendReceipt" + "$ref" : "#/components/schemas/ReportReceipt" } } } }, - "400" : { - "description" : "Invalid JSON, path identifier, or header.", + "201" : { + "description" : "Player report accepted.", "content" : { - "application/problem+json" : { + "application/json" : { "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" + "$ref" : "#/components/schemas/ReportReceipt" } } } }, - "401" : { - "description" : "Authentication is missing or invalid.", + "400" : { + "description" : "Invalid JSON or header.", "content" : { "application/problem+json" : { "schema" : { @@ -1737,8 +5338,8 @@ } } }, - "403" : { - "description" : "The service is unauthorized or does not own the capture.", + "401" : { + "description" : "Authentication is missing or invalid.", "content" : { "application/problem+json" : { "schema" : { @@ -1747,8 +5348,8 @@ } } }, - "404" : { - "description" : "The evidence capture does not exist.", + "403" : { + "description" : "The service subject is not authorized.", "content" : { "application/problem+json" : { "schema" : { @@ -1758,7 +5359,7 @@ } }, "409" : { - "description" : "The operation, message, or capture state conflicts.", + "description" : "The idempotency key conflicts with another payload.", "content" : { "application/problem+json" : { "schema" : { @@ -1768,7 +5369,7 @@ } }, "422" : { - "description" : "The evidence batch violates capture rules.", + "description" : "The evidence or report category is invalid.", "content" : { "application/problem+json" : { "schema" : { @@ -1778,7 +5379,7 @@ } }, "429" : { - "description" : "The configured append limit was exceeded.", + "description" : "The configured intake limit was exceeded.", "content" : { "application/problem+json" : { "schema" : { @@ -1803,189 +5404,269 @@ } ] } }, - "/v1/moderation/findings/{findingId}/corrections" : { - "post" : { - "summary" : "Correct a confirmed finding", - "description" : "Invalidates or reclassifies the current finding version without mutating history.", - "tags" : [ "Moderation findings" ], + "/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", - "name" : "findingId", "required" : true, "schema" : { - "format" : "uuid", "type" : "string" } }, { - "description" : "Stable UUID for one logical finding correction.", + "name" : "X-Grounds-Player-Id", "in" : "header", - "name" : "Idempotency-Key", - "required" : true, "schema" : { - "format" : "uuid", "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlayerReportStatusResponse" + } + } + } } - }, { - "description" : "Authenticated portal actor supplied by the trusted portal BFF.", - "in" : "header", - "name" : "X-Grounds-Actor-Id", + }, + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/player/appeals/{id}" : { + "get" : { + "parameters" : [ { + "name" : "id", + "in" : "path", "required" : true, "schema" : { - "type" : [ "string", "null" ] + "$ref" : "#/components/schemas/UUID" } }, { - "description" : "Exact effective portal permission for this operation.", + "name" : "X-Grounds-Actor-Id", "in" : "header", - "name" : "X-Grounds-Portal-Permission", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/OwnedAppeal" + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "summary" : "Appeal", + "tags" : [ "Player Appeal Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/player/appeals/{id}/withdraw" : { + "post" : { + "parameters" : [ { + "name" : "id", + "in" : "path", "required" : true, "schema" : { - "type" : [ "string", "null" ], - "enum" : [ "moderation.finding.correct" ] + "$ref" : "#/components/schemas/UUID" } }, { - "description" : "Optional request correlation identifier.", + "name" : "X-Grounds-Actor-Id", "in" : "header", - "name" : "X-Request-Id", - "required" : false, "schema" : { "type" : [ "string", "null" ] - } + }, + "required" : true } ], "requestBody" : { "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/CorrectFindingRequest" + "$ref" : "#/components/schemas/JsonNode" } } }, "required" : true }, "responses" : { - "201" : { - "description" : "Finding corrected.", - "content" : { - "application/json" : { - "schema" : { - "$ref" : "#/components/schemas/CorrectFindingResponse" - } - } - } - }, "200" : { - "description" : "Idempotent replay of a finding correction.", + "description" : "OK", "content" : { "application/json" : { - "schema" : { - "$ref" : "#/components/schemas/CorrectFindingResponse" - } + "schema" : { } } } }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + }, "400" : { - "description" : "Invalid JSON or idempotency key.", + "description" : "Bad Request" + } + }, + "summary" : "Withdraw", + "tags" : [ "Player Appeal Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/player/measures" : { + "get" : { + "parameters" : [ { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] + }, + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", "content" : { - "application/problem+json" : { + "application/json" : { "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/OwnedMeasure" + } } } } }, "401" : { - "description" : "Authentication is missing.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "description" : "Not Authorized" }, "403" : { - "description" : "Portal actor is not authorized.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } - }, - "404" : { - "description" : "Finding was not found.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "description" : "Not Allowed" + } + }, + "summary" : "List", + "tags" : [ "Player Appeal Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/player/measures/{id}" : { + "get" : { + "parameters" : [ { + "name" : "id", + "in" : "path", + "required" : true, + "schema" : { + "type" : "string" + } + }, { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] }, - "409" : { - "description" : "Finding correction conflicts.", + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", "content" : { - "application/problem+json" : { + "application/json" : { "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" + "$ref" : "#/components/schemas/OwnedMeasure" } } } }, - "422" : { - "description" : "Correction request is invalid.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "401" : { + "description" : "Not Authorized" }, - "503" : { - "description" : "Moderation storage is unavailable.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "403" : { + "description" : "Not Allowed" } }, + "summary" : "Get", + "tags" : [ "Player Appeal Resource" ], "security" : [ { "bearerAuth" : [ ] } ] } }, - "/v1/moderation/player-reports" : { + "/v1/moderation/player/measures/{id}/appeals" : { "post" : { - "summary" : "Submit a player report", - "description" : "Stores a player report and immutable initial evidence under the exact message anchor.", - "tags" : [ "Moderation intake" ], "parameters" : [ { - "description" : "Stable UUID for one logical submission attempt.", - "in" : "header", - "name" : "Idempotency-Key", + "name" : "id", + "in" : "path", "required" : true, "schema" : { - "format" : "uuid", - "type" : [ "string", "null" ] + "type" : "string" } }, { - "description" : "Request identifier to propagate, or omit to generate one.", + "name" : "X-Grounds-Actor-Id", "in" : "header", - "name" : "X-Request-Id", - "required" : false, "schema" : { "type" : [ "string", "null" ] - } + }, + "required" : true } ], "requestBody" : { "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/PlayerReportRequest" + "$ref" : "#/components/schemas/JsonNode" } } }, @@ -1993,96 +5674,77 @@ }, "responses" : { "200" : { - "description" : "Idempotent replay of an existing report.", - "content" : { - "application/json" : { - "schema" : { - "$ref" : "#/components/schemas/ReportReceipt" - } - } - } - }, - "201" : { - "description" : "Player report accepted.", + "description" : "OK", "content" : { "application/json" : { - "schema" : { - "$ref" : "#/components/schemas/ReportReceipt" - } - } - } - }, - "400" : { - "description" : "Invalid JSON or header.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } + "schema" : { } } } }, "401" : { - "description" : "Authentication is missing or invalid.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "description" : "Not Authorized" }, "403" : { - "description" : "The service subject is not authorized.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "description" : "Not Allowed" }, - "409" : { - "description" : "The idempotency key conflicts with another payload.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "400" : { + "description" : "Bad Request" + } + }, + "summary" : "File", + "tags" : [ "Player Appeal Resource" ], + "security" : [ { + "bearerAuth" : [ ] + } ] + } + }, + "/v1/moderation/players/{playerId}/enforcements" : { + "get" : { + "parameters" : [ { + "name" : "playerId", + "in" : "path", + "required" : true, + "schema" : { + "$ref" : "#/components/schemas/UUID" + } + }, { + "name" : "X-Grounds-Actor-Id", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] }, - "422" : { - "description" : "The evidence or report category is invalid.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "required" : true + }, { + "name" : "X-Grounds-Portal-Permissions", + "in" : "header", + "schema" : { + "type" : [ "string", "null" ] }, - "429" : { - "description" : "The configured intake limit was exceeded.", + "required" : true + } ], + "responses" : { + "200" : { + "description" : "OK", "content" : { - "application/problem+json" : { + "application/json" : { "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/EnforcementResponseDto" + } } } } }, - "503" : { - "description" : "Moderation storage is unavailable.", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/ProblemDetails" - } - } - } + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" } }, + "summary" : "Player", + "tags" : [ "Generic Enforcement Resource" ], "security" : [ { "bearerAuth" : [ ] } ]