---
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`

## 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.
  - `config` CreateGameEventConfigRequest — Optional event configuration block (recurrence + notification audience) on the v3 Create body.
    - `recurrence` string, nullable — Cron expression for recurrence. Null = no recurrence. Validated server-side.
    - `recurrenceEndTime` string, date-time, nullable
    - `notificationAudience` 'all' | 'rsvp' | 'subscribed' | 'group' | 'none' — The notification audience for an experience event
  - `featuringStatus` 'invalid' | '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` 'invalid' | '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.
  - `config` ConfigResponse
    - `recurrence` string, nullable — Cron expression defining the event's recurrence schedule, if any.
    - `recurrenceEndTime` string, date-time, nullable — The latest UTC timestamp at which automatic recurrence scheduling can occur.
    - `notificationAudience` 'all' | 'rsvp' | 'subscribed' | 'group' | 'none' — The notification audience for an experience event
  - `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.

---

[API](https://skmtc.net/roblox/apis/roblox-api.md) · [All operations](https://skmtc.net/roblox/apis/roblox-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/roblox/roblox-api/revisions/958b2b40425d/schema)
