---
title: "Create a new game event. Returns the full resource on success."
method: POST
path: "/virtual-events/v3/universes/{universeId}/game-events"
tags: ["Game Events"]
---

# Create a new game event. Returns the full resource on success.

`POST /virtual-events/v3/universes/{universeId}/game-events`

## Request

- Base URL: `https://apis.roblox.com`
- URL: `https://apis.roblox.com/virtual-events/v3/universes/{universeId}/game-events`
- Auth: one of:
  - API key in header `x-api-key`
  - OAuth 2
    - Authorization code: `https://apis.roblox.com/oauth/v1/authorize`
    - Token URL: `https://apis.roblox.com/oauth/v1/token` scopes: `universe.event:write`

## Path parameters

- `universeId` integer, required

## Request body

- CreateGameEventRequest: Request body for `POST /v3/universes/{universeId}/game-events`. `universeId` comes from the URL path, not the body. VirtualEventsApi.Models.V3.Request.CreateGameEventRequest.Visibility is restricted to Public/Private — Moderated is server-side only. Nullable CLR properties allow JSON binding to materialize incomplete requests; required fields are enforced by the virtual-events gRPC service when `CreateVirtualEvent` runs.
  - `title` string, nullable: Event title. Clients must provide a non-empty value.
  - `subtitle` string, nullable: Event subtitle. Clients must provide a non-empty value.
  - `description` string, nullable: Optional event description.
  - `startTime` string, date-time, nullable: Event start time. Clients must provide a timestamp such as `yyyy-MM-ddTHH:mm:ss.fffzzz` or `yyyy-MM-ddTHH:mm:ss.fffZ`.
  - `endTime` string, date-time, nullable: Event end time. Clients must provide a timestamp such as `yyyy-MM-ddTHH:mm:ss.fffzzz` or `yyyy-MM-ddTHH:mm:ss.fffZ`, and it must be after VirtualEventsApi.Models.V3.Request.CreateGameEventRequest.StartTime.
  - `visibility` 'private' | 'public' | 'moderated': The visibility of a virtual event.
  - `groupId` integer, nullable: Group host. When omitted, the authenticated user is the host.
  - `placeId` integer, nullable: Optional venue place ID. When omitted, the event is created in the universe root place.
  - `categories` EventRankedCategory[], nullable
    - `category` 'contentUpdate' | 'locationUpdate' | 'systemUpdate' | 'activity' | 'newContent' | 'itemDrop' | 'newSeason' | 'newLocation' | 'newMap' | 'moreLevels' | 'newFeature' | 'earlyAccess' | 'expansion' | 'challenge' | 'quest' | 'festival': The event category type of an event. Mirror of: https://github.rbx.com/Roblox/virtual-events/blob/master/services/virtual-events/src/Implementations/Types/EventCategory.cs
    - `rank` integer: The rank of the category.
  - `thumbnails` EventMedia[], nullable
    - `mediaId` integer: The ID of the media.
    - `rank` integer: The rank of the media.
  - `featuringStatus` 'enabled' | 'disabled': The featuring status of a virtual event.
  - `tagline` string, nullable: Optional tagline. Length and content are validated server-side.

## Response `200`

The newly-created game event resource.

- GameEventResponse: v3 game event response. All fields except VirtualEventsApi.Models.V3.Response.GameEventResponse.Id are gated by the `?fields=` mask.
  - `id` string, nullable: The unique id of the game event. Always populated. Serialized as a string to preserve precision for clients (event IDs exceed 2^53).
  - `title` string, nullable
  - `displayTitle` string, nullable: Localized title (caller's locale). Populated only when `displayTitle` is in the mask.
  - `subtitle` string, nullable
  - `displaySubtitle` string, nullable: Localized subtitle. Populated only when `displaySubtitle` is in the mask.
  - `description` string, nullable
  - `displayDescription` string, nullable: Localized description. Populated only when `displayDescription` is in the mask.
  - `startTime` string, date-time, nullable
  - `endTime` string, date-time, nullable
  - `universeId` integer, nullable
  - `placeId` integer, nullable
  - `host` HostResponse: Host block. VirtualEventsApi.Models.V3.Response.HostResponse.HostName and VirtualEventsApi.Models.V3.Response.HostResponse.HasVerifiedBadge are omitted when host-details resolution failed.
    - `hostType` 'user' | 'group': The type of host of a virtual event.
    - `hostId` integer
    - `hostName` string, nullable
    - `hasVerifiedBadge` boolean, nullable
  - `visibility` 'private' | 'public' | 'moderated': The visibility of a virtual event.
  - `featuringStatus` 'enabled' | 'disabled': The featuring status of a virtual event.
  - `tagline` string, nullable: Tagline for featuring review; visible to curators only when featuring is opted into.
  - `categories` CategoryResponse[], nullable
    - `category` 'contentUpdate' | 'locationUpdate' | 'systemUpdate' | 'activity' | 'newContent' | 'itemDrop' | 'newSeason' | 'newLocation' | 'newMap' | 'moreLevels' | 'newFeature' | 'earlyAccess' | 'expansion' | 'challenge' | 'quest' | 'festival': The event category type of an event. Mirror of: https://github.rbx.com/Roblox/virtual-events/blob/master/services/virtual-events/src/Implementations/Types/EventCategory.cs
    - `rank` integer
  - `thumbnails` ThumbnailResponse[], nullable
    - `mediaId` integer
    - `rank` integer
  - `allThumbnailsCreated` boolean, nullable: Whether all requested thumbnails were successfully persisted. Returned on Create/Update.
  - `userRsvpStatus` 'none' | 'going' | 'maybeGoing' | 'notGoing': The type of RSVP statuses.
  - `createTime` string, date-time, nullable
  - `updateTime` string, date-time, nullable

## Other responses

- `400`: Validation failure or server-side reject (moderation, age requirement, ...).
- `401`: Caller is not authenticated.
- `403`: Caller lacks permission or quota is exhausted.

## Changes

- **2026-10-19** `33047aba4a3d`: 1 info
  - api operation id `GameEvents_Create` removed and replaced with `GameEvents_CreateGameEvent`
- **2026-10-14** `5dcfa33df56a`: 4 breaking, 5 warning, 1 info
  - removed the enum value `invalid` of the request property `allOf[#/components/schemas/CreateGameEventRequest]/featuringStatus/allOf[#/components/schemas/FeaturingStatus]/` (media type: application/json-patch+json)
  - removed the enum value `invalid` of the request property `allOf[#/components/schemas/CreateGameEventRequest]/featuringStatus/allOf[#/components/schemas/FeaturingStatus]/` (media type: application/json)
  - removed the enum value `invalid` of the request property `allOf[#/components/schemas/CreateGameEventRequest]/featuringStatus/allOf[#/components/schemas/FeaturingStatus]/` (media type: text/json)
  - removed the enum value `invalid` of the request property `allOf[#/components/schemas/CreateGameEventRequest]/featuringStatus/allOf[#/components/schemas/FeaturingStatus]/` (media type: application/*+json)
  - …6 more

[Operation history](https://skmtc.dev/roblox/apis/roblox-api/changes/virtual-events/v3/universes/:universeId/game-events/post.md)

---

[API](https://skmtc.dev/roblox/apis/roblox-api.md) - [All operations](https://skmtc.dev/roblox/apis/roblox-api/llms.txt) - [OpenAPI document](https://skmtc.dev/roblox/apis/roblox-api/revisions/bcfdc20689cd?raw)
