Create Match
Create a new match as the API key owner, who must captain the creator team.
Permission Required
This endpoint requiresmatches.user_matches:read-write on your API key. A free (api_free) key receives 403 error_api_feature_required; this requires an api_pro+ plan.
Access / Membership Rules
The match is created as the API key owner, derived from the key itself - it is never accepted as a body field. The owner must captain the creator team (teamId), and every user in activeRoster must be a member of that team. League and challenge rules are enforced exactly as in the web app: when isChallenge is true a challengedTeamId is required, and a leagueId opts the match into a league with its own eligibility rules. A personal key can only create matches for teams its owner actually captains - the route binding is a no-op and this authorization is enforced inside Convex. A non-personal key receives 403 API_KEY_PERMISSION_DENIED.
This route accepts an optional Idempotency-Key header so retries are safe.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
teamId | string | Yes | Creator team ID. The owner must captain it. |
gameId | string | Yes | Game ID for the match. |
gameModeId | string | Yes | Game mode ID (client-side definition). |
matchType | string | Yes | Match type: XP_ONLY or WAGER. |
mapSelectionType | string | Yes | Map selection type: COMPETITIVE or FLEX. |
mapPreferenceMode | string | Yes | Map preference mode: PREFERRED, VETO, or MANUAL. |
teamSize | number | Yes | Players per team. |
bestOf | number | Yes | Series length (best of N). |
activeRoster | array | Yes | Active roster user IDs (must be creator-team members). |
platform | string | No | Platform: PC, XBOX, PLAYSTATION, CONSOLE_ONLY, CROSSPLAY (defaults to CROSSPLAY). |
inputDevice | string | No | Input device: ALL, CONTROLLER, KB_M (defaults to ALL). |
region | string | No | Region (defaults to NONE). |
scheduledAt | number | No | Scheduled start (epoch ms). |
wagerAmount | number | No | Wager amount (WAGER matches only). |
selectedMaps | array | No | Selected map IDs. |
selectedObjectives | array | No | Selected objective IDs. |
gameSpecificOptions | object | No | Game-specific options. |
lockedRules | object | No | Locked rule flags. |
notes | string | No | Optional match notes. |
publishStatus | string | No | Publish status: DRAFT, PUBLISHED, ARCHIVED (defaults to DRAFT). |
benchRoster | array | No | Optional bench roster (objects with id and priority). |
isChallenge | boolean | No | Create as a direct challenge to another team. |
challengedTeamId | string | No | Challenged team ID (required when isChallenge is true). |
leagueId | string | No | League ID for a league match. |
What’s Returned
Returnssuccess: true, the new matchId, and a timestamp. Mintlify renders the full schema from the spec below.
Authorizations
Send your API key as: Authorization: Bearer tb_
Body
Creates a new match as the API key owner.
Creator team ID. The owner must captain it.
1Game ID for the match.
1Game mode ID (client-side definition).
1Match type.
XP_ONLY, WAGER Map selection type.
COMPETITIVE, FLEX Map preference mode.
PREFERRED, VETO, MANUAL Players per team.
-9007199254740991 <= x <= 9007199254740991Series length (best of N).
-9007199254740991 <= x <= 9007199254740991Active roster user IDs (must be creator-team members).
11Platform (defaults to CROSSPLAY).
PC, XBOX, PLAYSTATION, CONSOLE_ONLY, CROSSPLAY Input device (defaults to ALL).
ALL, CONTROLLER, KB_M Region (defaults to NONE).
NONE, NA_EAST, NA_WEST, EU, ASIA, OCEANIA, SOUTH_AMERICA, MIDDLE_EAST, AFRICA Scheduled start (epoch ms).
Wager amount (WAGER matches only).
Selected map IDs.
Selected objective IDs.
Game-specific options.
Locked rule flags.
Optional match notes.
Publish status (defaults to DRAFT).
DRAFT, PUBLISHED, ARCHIVED Optional bench roster.
Create as a direct challenge to another team.
Challenged team ID (required when isChallenge is true).
1League ID for a league match.
1