# GM console ## `GET /api/gm/cases` **List moderation cases** Returns site-guild moderation cases, newest first, optionally filtered to one user. **Parameters** | Name | In | Type | Required | Description | |---|---|---|---|---| | `user_id` | query | integer \| null | no | Only list cases for this Discord user ID. | **Response `200` — The moderation cases.** Model: array of {ref}`GmCase ` Type: array of {ref}`GmCase ` ## `PATCH /api/gm/cases/{case_number}` **Edit a moderation case's reason** Edits a case's reason and writes a `case.edit` audit row. **Parameters** | Name | In | Type | Required | Description | |---|---|---|---|---| | `case_number` | path | integer | yes | The case's number. | **Request body** Model: {ref}`GmCaseReasonUpdate ` | Field | Type | Required | Description | |---|---|---|---| | `reason` | string | yes | | **Response `200` — The updated case.** Model: {ref}`GmCase ` | Field | Type | Required | Description | |---|---|---|---| | `case_number` | integer | yes | | | `action` | string | yes | | | `user_id` | string | yes | | | `user_name` | string \| null | yes | | | `moderator_id` | string | yes | | | `moderator_name` | string \| null | yes | | | `reason` | string \| null | yes | | | `duration_seconds` | integer \| null | yes | | | `created_at` | string (date-time) | yes | | ## `GET /api/gm/log` **Get the activity log** Returns a merged activity log across event sign-ups, sign-ins, Battle.net links, officer actions, and moderation. **Parameters** | Name | In | Type | Required | Description | |---|---|---|---|---| | `kind` | query | array of string \| null | no | Only return entries of these kinds. | | `before` | query | string (date-time) \| null | no | Only return entries before this time. | | `limit` | query | integer | no | Max entries to return. | **Response `200` — A page of log entries, newest first.** Model: {ref}`LogPage ` | Field | Type | Required | Description | |---|---|---|---| | `entries` | array of {ref}`LogEntry ` | yes | | | `next_before` | string (date-time) \| null | yes | | ## `GET /api/gm/members` **List members** Returns every signed-in member, Discord members first, then sorted by display name. **Response `200` — The members.** Model: array of {ref}`GmMember ` Type: array of {ref}`GmMember ` ## `GET /api/gm/members/{member_id}` **Get a member's detail** Returns one member's profile, event signups, and moderation cases. **Parameters** | Name | In | Type | Required | Description | |---|---|---|---|---| | `member_id` | path | integer | yes | The member's ID. | **Response `200` — The member's detail.** Model: {ref}`GmMemberDetail ` | Field | Type | Required | Description | |---|---|---|---| | `member` | {ref}`GmMember ` | yes | | | `signups` | array of {ref}`GmSignup ` | yes | | | `cases` | array of {ref}`GmCase ` | yes | | | `xp` | integer \| null | yes | | | `message_count` | integer \| null | yes | |