API Reference

Momentco Publisher API (1.0)

Download OpenAPI specification:

The Momentco Publisher API description v2

Momentco Publisher

Health

Health check and configuration debug endpoints

Public health check

Returns status of core dependencies: DB connectivity, GCS storage initialization, and optional Pub/Sub publish test.

query Parameters
pubsubTest
required
string

Responses

Configuration debug endpoint

Returns all configuration values with masked secrets for debugging. Shows whether values come from GCP Secret Manager or environment variables. Use ?refresh=true to force fresh values from GCP.

query Parameters
refresh
required
string

Responses

Response samples

Content type
application/json
{
  • "timestamp": "string",
  • "gcpSecretManager": {
    },
  • "app": {
    },
  • "database": {
    },
  • "jwt": {
    },
  • "firebase": {
    },
  • "brandFetch": {
    },
  • "gcpStorage": {
    },
  • "pubsub": {
    },
  • "campaign": {
    }
}

App

AppController_getHello

Responses

Meta

Get all available currencies

Returns a list of all supported currencies with their ISO codes, symbols, and full names

Responses

Response samples

Content type
application/json
{
  • "USD": {
    },
  • "EUR": {
    },
  • "GBP": {
    }
}

Get all available brand categories

Returns a list of all supported brand categories (e.g., "Sports Team")

Responses

Response samples

Content type
application/json
[
  • "Sports Team"
]

Upload

Generate signed URL for file upload

  Generates a signed URL for uploading image, video, or document files directly to the temporary bucket.
  
  Requirements:
  - fileName: Name of the file to upload
  - contentType: Must be an allowed image, video, or document type
    * Images: png, jpeg, jpg, gif, webp, svg+xml
    * Videos: mp4, webm, quicktime (.mov), x-msvideo (.avi), mpeg
    * Documents: pdf, msword (.doc), vnd.openxmlformats-officedocument.wordprocessingml.document (.docx)
  - intent: Purpose of upload (logo, cover-image, moment-video, document, etc.)
  - fileSize: (Optional) File size in bytes. Max 5MB for documents, 500MB for videos. Helps determine upload strategy.
  
  Upload Strategy:
  - Small files (< 10MB): Uses simple upload
  - Videos or large files (> 10MB): Automatically uses resumable upload for better reliability
  - Documents: Always use simple upload (max 5MB, no resumable needed)
  - Resumable uploads support chunked uploads and can resume if interrupted
  
  Storage Paths:
  - Images/Videos: {intent}/{timestamp}_{filename}
  - Documents: documents/{random16chars}/{timestamp}_{filename} (random folder for security)
  
  Response includes:
  - uploadUrl: Signed URL for uploading the file
  - resumableSessionUrl: (For resumable uploads) Session URL for chunked uploads
  - recommendedChunkSize: (For resumable uploads) Recommended chunk size (256KB)
Request Body schema: application/json
required
fileName
required
string

Name of the file to upload

contentType
required
string
Enum: "image/png" "image/jpeg" "image/jpg" "image/gif" "image/webp" "image/svg+xml" "video/mp4" "video/webm" "video/quicktime" "video/x-msvideo" "video/mpeg" "application/pdf" "application/msword" "application/vnd.openxmlformats-officedocument.wordprocessingml.document" "text/csv" "application/csv" "application/vnd.ms-excel" "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

MIME type of the file (must be an allowed image, video, or document type)

intent
required
string
Enum: "logo" "host-avatar" "cover-image" "desktop-background-image" "moment-image" "moment-video" "sponsor-logo" "marketing-image" "marketing-video" "moment-list-image" "moment-list-video" "document" "moment-parse"

Intent/purpose of the upload (determines storage path)

expiresIn
number [ 60 .. 86400 ]

Expiration time in seconds (default: 3600 = 1 hour)

fileSize
number

File size in bytes. Max 5MB for documents, 500MB for videos. Helps determine upload strategy (resumable vs simple).

Responses

Request samples

Content type
application/json
{
  • "fileName": "logo.png",
  • "contentType": "image/png",
  • "intent": "logo",
  • "expiresIn": 3600,
  • "fileSize": 104857600
}

Response samples

Content type
application/json
{}

Move file from temporary bucket to public bucket

  Moves a file from the temporary bucket to the public bucket.
  
  Input:
  - Full temporary bucket URL: "https://storage.googleapis.com/momentco-temp/logo/1640995200000_logo.png"
  
  The file will be moved to the public bucket with the same path structure and deleted from the temporary bucket.
Request Body schema: application/json
required
tempBucketUrl
required
string

Full URL from temporary bucket (e.g., "https://storage.googleapis.com/momentco-temp/logo/1640995200000_logo.png"). The file will be moved to the public bucket.

Responses

Request samples

Content type
application/json

Response samples

Content type
application/json
{}

Get storage service diagnostics

  Returns detailed information about storage service configuration and status.
  
  Requires authentication (JWT).
  
  Provides information about:
  - Storage service availability
  - Bucket configurations
  - Environment settings
  - Initialization errors (if any)
Authorizations:
None

Responses

Check basic storage configuration (public)

  Returns basic configuration status without authentication.
  
  Public endpoint - no authentication required.
  
  Useful for:
  - Verifying environment configuration
  - Checking if storage service is available
  - Troubleshooting setup issues

Responses

Search moments (Internal, Deprecated) Deprecated

DEPRECATED: Use POST /api/v1/internal/moments/by-team/:teamId/search or POST /api/v1/internal/moments/by-team-slug/:teamSlug/search instead. Internal endpoint to search moments without authentication. Full access across all teams.

Request Body schema: application/json
required
limit
number <= 100
Default: 20

Number of results per page

cursor
string

Cursor for pagination (base64 encoded JSON with sort fields)

direction
string
Default: "forward"
Enum: "forward" "backward"

Pagination direction

query
string

Full-text search query (searches in title, description, location)

teamId
string

Filter by team ID

tags
Array of strings

Filter by tags (all tags must match)

status
Array of strings
Items Enum: "draft" "published" "postponed" "cancelled" "deleted"

Filter by one or more moment statuses (OR logic). Accepts a single status string or an array of statuses.

eventTypes
Array of strings
Items Enum: "Game" "Tournament" "Promotion" "Invitation" "Live Entertainment" "Entertainment" "Conference" "Fan Experience" "Merch Drops"

Filter by event types (OR logic)

featureCards
Array of strings
Items Enum: "XL" "Medium"

Filter by featured card sizes (OR logic). When provided, only featured moments are returned.

startDate
string

Filter by start date (earliest date the moment occurs)

endDate
string

Filter by end date (latest date the moment occurs)

timezone
string

Optional IANA timezone name (e.g., "America/New_York", "Europe/London") for time-based tag conversions. When provided, time-based tags like time.today, time.tomorrow will be calculated relative to this timezone. Should be obtained from browser Intl API or IANA timezone database.

Responses

Request samples

Content type
application/json
{
  • "limit": 20,
  • "cursor": "eyJzdGFydERhdGUiOiIyMDI0LTAxLTE1VDAwOjAwOjAwWiIsImlkIjoiMTIzIn0=",
  • "direction": "forward",
  • "query": "basketball game",
  • "teamId": "team-uuid-123",
  • "tags": [
    ],
  • "status": [
    ],
  • "eventTypes": [
    ],
  • "featureCards": [
    ],
  • "startDate": "2024-01-01",
  • "endDate": "2024-12-31",
  • "timezone": "America/New_York"
}

Response samples

Content type
application/json
{
  • "error": {
    }
}

Search lists (Internal)

Internal endpoint to search moments lists without authentication. Full access across all teams.

Request Body schema: application/json
required
limit
number <= 100
Default: 20

Number of results per page

cursor
string

Cursor for pagination (base64 encoded JSON with sort fields)

direction
string
Default: "forward"
Enum: "forward" "backward"

Pagination direction

query
string

Full-text search query (searches in title, description)

tags
Array of strings

Filter by tags (all tags must match)

status
string
Enum: "draft" "published" "postponed" "archived"

Filter by list status

startDate
string

Filter by schedule start date

endDate
string

Filter by schedule end date

Responses

Request samples

Content type
application/json
{
  • "limit": 20,
  • "cursor": "eyJzdGFydERhdGUiOiIyMDI0LTAxLTE1VDAwOjAwOjAwWiIsImlkIjoiMTIzIn0=",
  • "direction": "forward",
  • "query": "regular season",
  • "tags": [
    ],
  • "status": "draft",
  • "startDate": "2024-09-01",
  • "endDate": "2024-12-31"
}

Response samples

Content type
application/json
{
  • "error": {
    }
}

Search

Search moments (Deprecated) Deprecated

DEPRECATED: Use POST /teams/:teamId/moments/search instead. Search moments for a specific team with filters (tags, text, status, dates, published). Returns full moment entities with cursor-based pagination. Requires team membership. Results sorted by startDateTimeUtc ASC.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

Request Body schema: application/json
required
limit
number <= 100
Default: 20

Number of results per page

cursor
string

Cursor for pagination (base64 encoded JSON with sort fields)

direction
string
Default: "forward"
Enum: "forward" "backward"

Pagination direction

query
string

Full-text search query (searches in title, description, location)

teamId
string

Filter by team ID

tags
Array of strings

Filter by tags (all tags must match)

status
Array of strings
Items Enum: "draft" "published" "postponed" "cancelled" "deleted"

Filter by one or more moment statuses (OR logic). Accepts a single status string or an array of statuses.

eventTypes
Array of strings
Items Enum: "Game" "Tournament" "Promotion" "Invitation" "Live Entertainment" "Entertainment" "Conference" "Fan Experience" "Merch Drops"

Filter by event types (OR logic)

featureCards
Array of strings
Items Enum: "XL" "Medium"

Filter by featured card sizes (OR logic). When provided, only featured moments are returned.

startDate
string

Filter by start date (earliest date the moment occurs)

endDate
string

Filter by end date (latest date the moment occurs)

timezone
string

Optional IANA timezone name (e.g., "America/New_York", "Europe/London") for time-based tag conversions. When provided, time-based tags like time.today, time.tomorrow will be calculated relative to this timezone. Should be obtained from browser Intl API or IANA timezone database.

Responses

Request samples

Content type
application/json
{
  • "limit": 20,
  • "cursor": "eyJzdGFydERhdGUiOiIyMDI0LTAxLTE1VDAwOjAwOjAwWiIsImlkIjoiMTIzIn0=",
  • "direction": "forward",
  • "query": "basketball game",
  • "teamId": "team-uuid-123",
  • "tags": [
    ],
  • "status": [
    ],
  • "eventTypes": [
    ],
  • "featureCards": [
    ],
  • "startDate": "2024-01-01",
  • "endDate": "2024-12-31",
  • "timezone": "America/New_York"
}

Response samples

Content type
application/json
{
  • "error": {
    }
}

Search lists

Search moments lists for a specific team with filters (tags, text, status, dates). Returns full list entities with cursor-based pagination. Requires team membership.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

Request Body schema: application/json
required
limit
number <= 100
Default: 20

Number of results per page

cursor
string

Cursor for pagination (base64 encoded JSON with sort fields)

direction
string
Default: "forward"
Enum: "forward" "backward"

Pagination direction

query
string

Full-text search query (searches in title, description)

tags
Array of strings

Filter by tags (all tags must match)

status
string
Enum: "draft" "published" "postponed" "archived"

Filter by list status

startDate
string

Filter by schedule start date

endDate
string

Filter by schedule end date

Responses

Request samples

Content type
application/json
{
  • "limit": 20,
  • "cursor": "eyJzdGFydERhdGUiOiIyMDI0LTAxLTE1VDAwOjAwOjAwWiIsImlkIjoiMTIzIn0=",
  • "direction": "forward",
  • "query": "regular season",
  • "tags": [
    ],
  • "status": "draft",
  • "startDate": "2024-09-01",
  • "endDate": "2024-12-31"
}

Response samples

Content type
application/json
{
  • "error": {
    }
}

Internal - Elasticsearch Admin

Reindex all moments

Bulk reindex all moments in Elasticsearch. Optionally filter by teamId. Processes in batches for memory efficiency.

query Parameters
teamId
string
Example: teamId=123e4567-e89b-12d3-a456-426614174000

Optional team ID to filter moments

batchSize
number
Example: batchSize=100

Number of moments to process per batch (default: 100)

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "message": "string",
  • "data": {
    }
}

Reindex all lists

Bulk reindex all moments lists in Elasticsearch. Optionally filter by teamId. Processes in batches for memory efficiency.

query Parameters
teamId
string
Example: teamId=123e4567-e89b-12d3-a456-426614174000

Optional team ID to filter lists

batchSize
number
Example: batchSize=100

Number of lists to process per batch (default: 100)

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "message": "string",
  • "data": {
    }
}

Reindex all campaigns

Bulk reindex all campaigns in Elasticsearch. Optionally filter by teamId. Processes in batches for memory efficiency.

query Parameters
teamId
string
Example: teamId=123e4567-e89b-12d3-a456-426614174000

Optional team ID to filter campaigns

batchSize
number
Example: batchSize=100

Number of campaigns to process per batch (default: 100)

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "message": "string",
  • "data": {
    }
}

Tags

Get all available tags

Retrieves all available tags with pagination, optionally filtered by type

Authorizations:
JWT-auth
query Parameters
page
number
Default: 1
Example: page=1

Page number (starts from 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of results per page

orderBy
string
Example: orderBy=createdAt

Field to order by (e.g., createdAt, updatedAt)

orderDirection
string
Enum: "ASC" "DESC"
Example: orderDirection=DESC

Order direction

tagType
string
Enum: "user" "system"

Filter tags by type (user or system)

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Search tags by name

Searches for tags by name with pagination and optional type filtering

Authorizations:
JWT-auth
query Parameters
page
number
Default: 1
Example: page=1

Page number (starts from 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of results per page

orderBy
string
Example: orderBy=createdAt

Field to order by (e.g., createdAt, updatedAt)

orderDirection
string
Enum: "ASC" "DESC"
Example: orderDirection=DESC

Order direction

q
required
string >= 2 characters
Example: q=basketball

Search query (minimum 2 characters)

tagType
string
Enum: "user" "system"

Filter tags by type (user or system)

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get tags for resource (public)

Retrieves paginated tags associated with a specific resource (no authentication required)

path Parameters
resourceType
required
string
Enum: "moment-list" "moment"

Type of resource to get tags for

resourceId
required
string
Example: 123e4567-e89b-12d3-a456-426614174000

Unique identifier of the resource

query Parameters
page
number
Default: 1
Example: page=1

Page number (starts from 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of results per page

orderBy
string
Example: orderBy=createdAt

Field to order by (e.g., createdAt, updatedAt)

orderDirection
string
Enum: "ASC" "DESC"
Example: orderDirection=DESC

Order direction

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Taxonomies

Search taxonomies (Public)

Search taxonomies by query string, namespace, tier, and other filters. No authentication required.

query Parameters
q
string >= 2 characters
Example: q=game

Search query (minimum 2 characters) - searches in displayName, aliases, and description

namespace
string
Example: namespace=event_type

Filter by namespace (e.g., "event_type", "theme", "holiday")

tier
string
Enum: "T1" "T2"
Example: tier=T1

Filter by tier (T1 or T2)

filterExposed
boolean
Example: filterExposed=true

Filter by filterExposed flag (only show items available in filter UI)

labelExposed
boolean
Example: labelExposed=true

Filter by labelExposed flag (only show items available as labels)

entityType
string
Enum: "moment-list" "moment"
Example: entityType=moment

Entity type for context-aware filtering (returns only relevant taxonomies for this entity type)

parentId
string <= 200 characters
Example: parentId=systemwide.stage

Filter by parent taxonomy ID (e.g., "systemwide.stage") - returns children of the parent

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get taxonomy suggestions (Public)

Get suggested taxonomies based on entity type and optional context. Used for publisher UI during entity creation. No authentication required.

query Parameters
entityType
required
string
Enum: "moment" "moment-list"

Entity type (moment, moment-list)

parentTaxonomyId
string
Example: parentTaxonomyId=event_type.game

Optional parent taxonomy ID (e.g., "event_type.game")

startDate
string
Example: startDate=2024-12-25T00:00:00Z

Optional start date for context-aware suggestions (ISO 8601)

Responses

Response samples

Content type
application/json
{
  • "suggested": {
    },
  • "programmatic": {
    }
}

Internal - Taxonomies

Create a new taxonomy (Internal)

Internal API - Creates a new taxonomy. Id must be unique. If parentId is provided, parent must exist.

Request Body schema: application/json
required
id
required
string <= 200 characters

Unique identifier (e.g., "event_type.game", "theme.vip")

displayName
required
string <= 200 characters

Human-readable display name

namespace
required
string <= 50 characters

Namespace grouping (e.g., "event_type", "theme")

tier
required
string
Enum: "T1" "T2"

Tier level: T1 (primary) or T2 (secondary)

parentId
object <= 200 characters

Parent taxonomy ID for hierarchical relationships

description
object

Description of the taxonomy item

aliases
object

Alternative names or aliases

examples
object

Usage examples

intent
required
string
Default: "metadata_only"
Enum: "filter" "metadata_only" "label_only"

Intent/purpose classification

filterExposed
required
boolean
Default: false

Whether this item should be exposed in filter UI

labelExposed
required
boolean
Default: false

Whether this item should be displayed as a label/badge

isComputed
required
boolean
Default: false

Whether this value is computed dynamically

conditions
object

Computation rules/expressions (for computed fields)

sortOrder
required
number
Default: 0

Sort order within namespace

isMultiValue
required
boolean
Default: false

Whether multiple values can be selected/assigned

Responses

Request samples

Content type
application/json
{
  • "id": "event_type.game",
  • "displayName": "Game",
  • "namespace": "event_type",
  • "tier": "T1",
  • "parentId": "theme.vip",
  • "description": { },
  • "aliases": { },
  • "examples": { },
  • "intent": "filter",
  • "filterExposed": true,
  • "labelExposed": true,
  • "isComputed": false,
  • "conditions": "event.start_date==today",
  • "sortOrder": 0,
  • "isMultiValue": false
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get filterable taxonomies (Internal)

Internal API - Get all filterable taxonomies for a specific entity type. Used for internal service-to-service communication.

query Parameters
entityType
required
string
Enum: "moment" "moment-list"

Entity type (moment, moment-list)

Responses

Response samples

Content type
application/json
{
  • "property1": [
    ],
  • "property2": [
    ]
}

Get a taxonomy by id (Internal)

Internal API - Gets a taxonomy by its id.

path Parameters
id
required
string
Example: event_type.game

Taxonomy id

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update a taxonomy (Internal)

Internal API - Updates an existing taxonomy. Id, namespace, and tier are immutable and cannot be updated. If parentId is provided, parent must exist.

path Parameters
id
required
string
Example: event_type.game

Taxonomy id (immutable)

Request Body schema: application/json
required
displayName
string <= 200 characters

Human-readable display name

parentId
object <= 200 characters

Parent taxonomy ID for hierarchical relationships

description
string

Description of the taxonomy item

aliases
string

Alternative names or aliases

examples
string

Usage examples

intent
string
Enum: "filter" "metadata_only" "label_only"

Intent/purpose classification

filterExposed
boolean

Whether this item should be exposed in filter UI

labelExposed
boolean

Whether this item should be displayed as a label/badge

isComputed
boolean

Whether this value is computed dynamically

conditions
string

Computation rules/expressions (for computed fields)

sortOrder
number

Sort order within namespace

isMultiValue
boolean

Whether multiple values can be selected/assigned

Responses

Request samples

Content type
application/json
{
  • "displayName": "Game",
  • "parentId": "theme.vip",
  • "description": "string",
  • "aliases": "string",
  • "examples": "string",
  • "intent": "filter",
  • "filterExposed": true,
  • "labelExposed": true,
  • "isComputed": false,
  • "conditions": "event.start_date==today",
  • "sortOrder": 0,
  • "isMultiValue": false
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Teams

Get user teams

Retrieves all teams that the current user is a member of

Authorizations:
JWT-auth

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": [
    ]
}

Create a new team

Creates a new team with the current user as the owner

Authorizations:
JWT-auth
Request Body schema: application/json
required
team
required
string <= 100 characters

Team name

website
string

Team website link

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get or create short URL for a team

Returns the short URL for a team campaign. If campaignId is provided, uses that campaign (must belong to the team). Otherwise, falls back to the team's default campaign. If no default campaign exists, one will be automatically created.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: uuid-string

Team ID

query Parameters
campaignId
string
Example: campaignId=123e4567-e89b-12d3-a456-426614174000

Optional campaign ID. If provided and related to the team, uses that campaign. Otherwise falls back to default campaign.

Responses

Response samples

Content type
application/json
{}

Get team members

Retrieves a paginated list of team members with user profile details. Any active team member can access this endpoint.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: uuid-string

Team ID

query Parameters
page
number
Default: 1
Example: page=1

Page number (starts from 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of results per page

orderBy
string
Example: orderBy=createdAt

Field to order by (e.g., createdAt, updatedAt)

orderDirection
string
Enum: "ASC" "DESC"
Example: orderDirection=DESC

Order direction

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Update team member role

Updates the role of a team member. Only team owners can perform this action.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: uuid-string

Team ID

memberId
required
string
Example: uuid-string

Team member ID

Request Body schema: application/json
required
role
required
string
Enum: "owner" "member"

New role for the member

Responses

Request samples

Content type
application/json
{
  • "role": "owner"
}

Response samples

Content type
application/json
{
  • "error": {
    }
}

Remove team member

Removes a team member from the team (soft-delete). Only team owners can perform this action.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: uuid-string

Team ID

memberId
required
string
Example: uuid-string

Team member ID

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Get team by identifier (UUID or slug)

Retrieves a team by its UUID or slug with all members. Only team members can access this endpoint.

Authorizations:
JWT-auth
path Parameters
identifier
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update team

Updates team information. Only team owners can update the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: uuid-string

Team ID

Request Body schema: application/json
required
team
string <= 100 characters

Team name

website
string

Team website link

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get team brand context

Retrieves all brand and team-related information including brand details, logos, colors, team details, store, ticket info, and sponsors

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: uuid-string

Team ID

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Internal

List teams (Internal)

Internal endpoint to retrieve a paginated list of teams without relations. No authentication required.

query Parameters
page
number
Default: 1
Example: page=1

Page number (default: 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of items per page (default: 20, max: 100)

orderBy
string
Example: orderBy=createdAt

Field to order by (e.g., createdAt, updatedAt)

orderDirection
string
Enum: "ASC" "DESC"
Example: orderDirection=DESC

Order direction

Responses

Get team by slug (Internal)

Internal endpoint to get a team by its slug. No authentication required.

path Parameters
slug
required
string
Example: lakers

Team slug

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get team brand context (Internal)

Internal endpoint to retrieve all brand and team-related information including brand details, logos, colors, team details, store, ticket info, and sponsors. No authentication required.

path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get team media gallery

  Retrieves all media (images/videos) associated with a team.
  Media is automatically moved to permanent storage when added to gallery.
  Includes:
  - Brand logos (imageType: 'logo')
  - Brand cover images (imageType: 'cover-image')
  - Moment images (imageType: 'moment-image')
  - Moment videos (imageType: 'moment-video')
  
  Supports pagination and filtering by media type.
Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: 123e4567-e89b-12d3-a456-426614174000

Team ID

query Parameters
page
number >= 1
Example: page=1

Page number (default: 1)

limit
number [ 1 .. 100 ]
Example: limit=50

Number of items per page (default: 50, max: 100)

types
Array of strings
Items Enum: "logo" "host-avatar" "cover-image" "desktop-background-image" "moment-image" "moment-video" "sponsor-logo" "marketing-image" "marketing-video" "moment-list-image" "moment-list-video" "document" "moment-parse"
Example: types=logo&types=moment-image

Filter by image types

Responses

Response samples

Content type
application/json
{}

Add media to team gallery

  Adds media (image/video) to the team gallery.

  If the provided URL is from the temporary bucket, the file will be
  automatically moved to permanent storage before being added to the gallery.

  If the URL is already from permanent storage, it will be added directly.

  This endpoint is idempotent - if the same URL already exists in the gallery
  for this team, the existing entry will be returned.
Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: 123e4567-e89b-12d3-a456-426614174000

Team ID

Request Body schema: application/json
required
imageUrl
required
string

URL of the file (can be temporary or permanent bucket URL). If temporary, it will be moved to permanent storage.

imageType
required
string
Enum: "logo" "host-avatar" "cover-image" "desktop-background-image" "moment-image" "moment-video" "sponsor-logo" "marketing-image" "marketing-video" "moment-list-image" "moment-list-video" "document" "moment-parse"

Type of media being added to gallery

Responses

Request samples

Content type
application/json

Response samples

Content type
application/json
{}

Get team media gallery statistics

Returns statistics about media in the team gallery

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: 123e4567-e89b-12d3-a456-426614174000

Team ID

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Delete media from team gallery

  Removes a media entry from the team gallery.

  Note: This only removes the database entry. The actual file in cloud storage
  is NOT deleted and remains available for archival purposes.
Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: 123e4567-e89b-12d3-a456-426614174000

Team ID

galleryId
required
string
Example: 123e4567-e89b-12d3-a456-426614174000

Gallery entry ID

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Brand Fetch

Search brands by query

Searches brands by query using the Brandfetch API

path Parameters
query
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": [
    ]
}

Fetch brand information by domain

Fetches brand information from Brandfetch API for a given domain

path Parameters
domain
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": { }
}

Fetch team brand information by name and website

Fetches brand information for a team using name and website. Extracts domain from website, fetches brand data, and matches with provided name.

query Parameters
name
required
string

The team/brand name to match against fetched data

website
required
string

The website URL to extract domain from

Responses

Response samples

Content type
application/json
{}

Team Details

Get team details

Retrieves the team details associated with a specific team

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
{
  • "longName": "string",
  • "shortName": "string",
  • "primaryVenue": "string",
  • "mascot": "string",
  • "homeCityLong": "string",
  • "homeCityShort": "string",
  • "instagramHandles": [
    ],
  • "officialWebsiteUrls": [
    ]
}

Update team details information

Updates the team details information for a specific team. Creates a new team details if it doesn't exist.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
longName
string

Long brand name

shortName
string

Short brand name

primaryVenue
string

Primary venue

mascot
string

Brand mascot

homeCityLong
string

Home city (long format)

homeCityShort
string

Home city (short format)

instagramHandles
Array of strings

Instagram handles

officialWebsiteUrls
Array of strings

Official website URLs

Responses

Request samples

Content type
application/json
{
  • "longName": "string",
  • "shortName": "string",
  • "primaryVenue": "string",
  • "mascot": "string",
  • "homeCityLong": "string",
  • "homeCityShort": "string",
  • "instagramHandles": [
    ],
  • "officialWebsiteUrls": [
    ]
}

Response samples

Content type
application/json
{
  • "longName": "string",
  • "shortName": "string",
  • "primaryVenue": "string",
  • "mascot": "string",
  • "homeCityLong": "string",
  • "homeCityShort": "string",
  • "instagramHandles": [
    ],
  • "officialWebsiteUrls": [
    ]
}

Team Store

Get team store information

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
{}

Update team store information

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
officialStoreUrl
string

Official store URL for the team

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Brand Kits

Get team brand

Retrieves the brand associated with a specific team. Returns brand kit including logos (with roles: PRIMARY, SECONDARY, ICON, ADDITIONAL) and colors (with types: PRIMARY, SECONDARY, OTHER). If brand is not found, it will be created and populated with BrandFetch data automatically.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
{}

Update team brand information

Updates the brand information for a specific team. Creates a new brand if it doesn't exist.

  Important: When updating logos or colors, send the complete array. The entire array will replace existing items.
  
  Logo Roles:
  - PRIMARY: Main brand logo, typically used as the primary identifier
  - SECONDARY: Alternative logo variant, used in specific contexts
  - ICON: Simplified icon version, often used in small spaces
  - ADDITIONAL: Additional logo variations for special use cases
  
  Color Types:
  - PRIMARY: Main brand color (not deletable)
  - SECONDARY: Secondary brand color (not deletable)
  - OTHER: Additional colors that can be added or removed
Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
required
Array of objects (BrandLogoInput)

Brand logos - send complete array to replace all logos. Each logo can have a role (PRIMARY, SECONDARY, ICON, ADDITIONAL) to define its purpose. The complete array will replace existing logos, so include all logos you want to keep.

required
Array of objects (BrandColorInput)

Brand colors - send complete array to replace all colors. Each color must have a type (PRIMARY, SECONDARY, OTHER). Note: PRIMARY and SECONDARY colors are not deletable. The complete array will replace existing colors, so include all colors you want to keep.

coverImageUrl
string

Cover image URL (optional - if not provided, will be set to null)

desktopBackgroundImageUrl
string

Desktop background image URL (optional - if not provided, will be set to null)

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Internal - Brand Kits

Get brand kit by team ID (Internal)

Internal endpoint to retrieve the brand kit (logos, colors, cover image) for a specific team by team ID. No authentication required.

path Parameters
teamId
required
string
Example: 550e8400-e29b-41d4-a716-446655440000

Team ID (UUID)

Responses

Response samples

Content type
application/json
{}

Brand Info

Get team brand info

Retrieves the brand info associated with a specific team

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update team brand info

Updates the brand info for a specific team. Creates a new brand info if it doesn't exist.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
longName
string

Official/Long name

shortNames
Array of strings

Short names (nicknames)

abbreviation
string

Abbreviation

officialWebsiteUrl
string

Official website URL (primary website)

customerSupportEmail
string

Customer support email address

customerSupportPhone
string

Customer support phone number

currency
string

Currency (ISO 3-letter code, defaults to USD)

hashTags
Array of strings

Hashtags associated with the brand

category
string

Brand category (e.g., "Sports Team")

defaultCalendarBoilerplate
string

Default Calendar Boilerplate - Template text for calendar events

industry
string <= 100 characters

Industry

description
string <= 1000 characters

Brand description

eventTypeCalendarDefaults
object or null

Per-event-type default calendar descriptions. Keys must be valid event types: Game, Tournament, Promotion, Invitation, Live Entertainment, Entertainment, Conference, Fan Experience, Merch Drops. Set a string value to define the default description for that event type. Set null to clear/remove a previously set default. Set empty string "" to intentionally leave blank. Omitted keys are preserved (partial merge). Max 2000 characters per value.

Responses

Request samples

Content type
application/json
{
  • "longName": "Los Angeles Lakers",
  • "shortNames": [
    ],
  • "abbreviation": "LAL",
  • "officialWebsiteUrl": "https://www.nba.com/lakers",
  • "customerSupportEmail": "support@lakers.com",
  • "customerSupportPhone": "+1-213-426-6000",
  • "currency": "USD",
  • "hashTags": [
    ],
  • "category": "Sports Team",
  • "defaultCalendarBoilerplate": "Join us for an exciting game! Doors open at {doorsOpenTime}.",
  • "industry": "Sports",
  • "description": "The Miami Heat are an American professional basketball team based in Miami.",
  • "eventTypeCalendarDefaults": {
    }
}

Response samples

Content type
application/json
{
  • "shortNames": [
    ],
  • "longName": "Los Angeles Lakers",
  • "abbreviation": "LAL",
  • "officialWebsiteUrl": "https://www.nba.com/lakers",
  • "customerSupportEmail": "support@lakers.com",
  • "customerSupportPhone": "+1-213-426-6000",
  • "currency": "USD",
  • "hashTags": [
    ],
  • "category": "Sports Team",
  • "defaultCalendarBoilerplate": "Join us for an exciting game! Doors open at {doorsOpenTime}.",
  • "industry": "Sports",
  • "description": "The Miami Heat are an American professional basketball team based in Miami.",
  • "eventTypeCalendarDefaults": {
    }
}

Internal - Brand Info

Get brand info by team ID (Internal)

Internal endpoint to retrieve the brand info (short name, long name, abbreviation, website URLs, etc.) for a specific team by team ID. No authentication required.

path Parameters
teamId
required
string
Example: 550e8400-e29b-41d4-a716-446655440000

Team ID (UUID)

Responses

Response samples

Content type
application/json
{
  • "shortNames": [
    ],
  • "longName": "Los Angeles Lakers",
  • "abbreviation": "LAL",
  • "officialWebsiteUrl": "https://www.nba.com/lakers",
  • "customerSupportEmail": "support@lakers.com",
  • "customerSupportPhone": "+1-213-426-6000",
  • "currency": "USD",
  • "hashTags": [
    ],
  • "category": "Sports Team",
  • "defaultCalendarBoilerplate": "Join us for an exciting game! Doors open at {doorsOpenTime}.",
  • "industry": "Sports",
  • "description": "The Miami Heat are an American professional basketball team based in Miami.",
  • "eventTypeCalendarDefaults": {
    }
}

Brand Voice

Get team brand voice

Retrieves the brand voice associated with a specific team

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
{}

Update team brand voice

Updates the brand voice for a specific team. Creates a new brand voice if it doesn't exist.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
dos
string

Do's - Brand voice guidelines

donts
string

Don'ts - Brand voice restrictions

formalityLevel
string
Enum: "very_formal" "formal" "semi_formal" "semi_casual" "casual" "very_casual"

Formality Level - Hint for LLM about tone of communication

allowEmoji
boolean

Allow emoji in texts

personalityTags
Array of strings

Personality tags - Array of personality characteristics

uploadReferences
Array of strings

Upload References - Array of file URLs

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Team Info

Get team info

Retrieves the team info associated with a specific team

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update team info

Updates the team info for a specific team. Creates a new team info if it doesn't exist. Conference is read-only.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
sportId
string <= 200 characters

Sport ID - references taxonomy.id (systemwide.sport.*). Identifies the sport type for this team.

leagueId
string

League ID - references leagues.id (UUID). League the team belongs to (e.g., NBA, NFL, MLB).

genderId
string <= 200 characters

Gender ID - references taxonomy.id (systemwide.gender.*). Team gender (e.g., systemwide.gender.mens, systemwide.gender.womens).

parentOrganization
string

Parent Organization (e.g., "Player 15 Group for Phoenix Suns")

rivalries
Array of strings

Major Rivalries

mascot
string

Mascot image URL

mascotDescription
string

Mascot description

aggregatorTeamId
string

UUID of the team in the Aggregator API

aggregatorLeagueId
string

UUID of the league in the Aggregator API

aggregatorSyncEnabled
boolean

Whether automatic fixture sync is enabled for this team

Responses

Request samples

Content type
application/json
{
  • "sportId": "systemwide.sport.basketball",
  • "leagueId": "league-uuid",
  • "genderId": "systemwide.gender.mens",
  • "parentOrganization": "Player 15 Group",
  • "rivalries": [
    ],
  • "mascotDescription": "Burnie is the mascot of the Miami Heat, the NBA basketball team since 1988.",
  • "aggregatorTeamId": "550e8400-e29b-41d4-a716-446655440000",
  • "aggregatorLeagueId": "550e8400-e29b-41d4-a716-446655440001",
  • "aggregatorSyncEnabled": true
}

Response samples

Content type
application/json
{
  • "sportId": "systemwide.sport.basketball",
  • "sportDisplayName": "Basketball",
  • "leagueId": "league-uuid",
  • "leagueDisplayName": "NBA",
  • "league": {
    },
  • "conferenceId": "conference.western",
  • "conferenceDisplayName": "Western Conference",
  • "genderId": "systemwide.gender.mens",
  • "genderDisplayName": "Men's",
  • "parentOrganization": "Player 15 Group",
  • "rivalries": [
    ],
  • "mascotDescription": "Burnie is the mascot of the Miami Heat, the NBA basketball team since 1988.",
  • "aggregatorTeamId": "string",
  • "aggregatorLeagueId": "string",
  • "aggregatorLastSyncedAt": "2019-08-24T14:15:22Z",
  • "aggregatorSyncEnabled": true,
  • "jerseyProfiles": [
    ]
}

Get all jersey profiles for a team

Retrieves all jersey profiles associated with a specific team

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a new jersey profile

Creates a new jersey profile for a specific team

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
name
required
string

Name of the jersey

automatedRule
required
string
Enum: "ALWAYS_HOME" "ALWAYS_AWAY" "AD_HOC"

Automated rule for jersey selection

Responses

Request samples

Content type
application/json
{
  • "name": "Home Jersey",
  • "automatedRule": "ALWAYS_HOME"
}

Response samples

Content type
application/json
{
  • "id": "uuid",
  • "name": "Home Jersey",
  • "automatedRule": "ALWAYS_HOME",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Update a jersey profile

Updates an existing jersey profile

Authorizations:
JWT-auth
path Parameters
teamId
required
string
jerseyId
required
string
Request Body schema: application/json
required
name
required
string

Name of the jersey

automatedRule
required
string
Enum: "ALWAYS_HOME" "ALWAYS_AWAY" "AD_HOC"

Automated rule for jersey selection

Responses

Request samples

Content type
application/json
{
  • "name": "Home Jersey",
  • "automatedRule": "ALWAYS_HOME"
}

Response samples

Content type
application/json
{
  • "id": "uuid",
  • "name": "Home Jersey",
  • "automatedRule": "ALWAYS_HOME",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Delete a jersey profile

Deletes an existing jersey profile

Authorizations:
JWT-auth
path Parameters
teamId
required
string
jerseyId
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Team Socials

Get team socials

Retrieves the social media handles associated with a specific team

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update team socials

Updates the social media handles for a specific team. Creates a new team socials if it doesn't exist.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
instagramHandles
Array of strings

Instagram handles (array to support multiple accounts)

snapchat
string

Snapchat handle/URL

twitter
string

Twitter handle/URL

tiktok
string

TikTok handle/URL

Responses

Request samples

Content type
application/json
{
  • "instagramHandles": [
    ],
  • "snapchat": "@lakers",
  • "twitter": "@Lakers",
  • "tiktok": "@lakers"
}

Response samples

Content type
application/json
{
  • "instagramHandles": [
    ],
  • "snapchat": "@lakers",
  • "twitter": "@Lakers",
  • "tiktok": "@lakers"
}

Team Sponsors

Search team sponsors by name for typeahead dropdown

Searches team sponsors by name for typeahead functionality. Returns list of matching sponsors for the specified team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
query Parameters
query
required
string >= 2 characters
Example: query=Nike

Search query string (minimum 2 characters)

Responses

Response samples

Content type
application/json
[]

Get team sponsors

Retrieve sponsors associated with a specific team

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
[]

Create team sponsor

Create a new team sponsor by linking a sponsor partner to a team with one or more roles

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
sponsorPartnerId
string

Sponsor partner ID (from system-store) - deprecated, use brandId instead

brandId
string

Brand ID from Brandfetch. If provided, will check system store for existing sponsor partner, or fetch from Brandfetch API and create one if not found.

roleKeys
Array of strings

Sponsor role keys (array of role keys). Optional - can be empty array or omitted. If provided and non-empty, each role key must exist in the sponsor_roles table.

logo
string <= 512 characters

Team-specific logo URL (overrides sponsor partner logo)

Responses

Request samples

Content type
application/json
{
  • "sponsorPartnerId": "123e4567-e89b-12d3-a456-426614174000",
  • "brandId": "idtEghWGp4",
  • "roleKeys": [
    ],
}

Response samples

Content type
application/json
{}

Update team sponsor

Update an existing team sponsor

Authorizations:
JWT-auth
path Parameters
teamId
required
string
sponsorId
required
string
Request Body schema: application/json
required
roleKeys
Array of strings

Sponsor role keys (array of role keys)

isActive
boolean

Whether the sponsor is active

logo
object or null <= 512 characters

Team-specific logo URL (overrides sponsor partner logo). Set to null to clear.

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Delete team sponsor

Hard delete a team sponsor, removing it from both team_sponsors and team_sponsor_roles tables

Authorizations:
JWT-auth
path Parameters
teamId
required
string
sponsorId
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Venues

List venues for a team Deprecated

DEPRECATED: Use GET /team/:teamId/team-venues instead.

Returns a paginated list containing non-publisher venues and publisher venues belonging to the team.
  Excludes non-publisher venues overwritten by publisher. Only id, name, logoUrl, and dataSource fields are included.
Authorizations:
JWT-auth
path Parameters
teamId
required
string
query Parameters
page
number
Default: 1
Example: page=1

Page number (starts from 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of results per page

orderBy
string
Example: orderBy=createdAt

Field to order by (e.g., createdAt, updatedAt)

orderDirection
string
Enum: "ASC" "DESC"
Example: orderDirection=DESC

Order direction

query
string >= 2 characters
Example: query=Madison Square

Search query for venue name (minimum 2 characters)

Responses

Response samples

Content type
application/json
{}

Create a new publisher venue Deprecated

DEPRECATED: Use POST /team/:teamId/team-venues + POST /venues instead.

Creates a new venue with PUBLISHER data source for the specified team. Can optionally overwrite an existing non-publisher venue by providing parentId. User must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
query Parameters
parentId
required
string
Request Body schema: application/json
required
officialName
required
string <= 255 characters

Official venue name

googlePlaceId
string <= 255 characters

Google Place ID

shortName
string <= 255 characters

Short name or abbreviation for the venue

aliases
Array of strings

Alternative names or aliases for the venue

latitude
number

Latitude coordinate (must be between -90 and 90)

longitude
number

Longitude coordinate (must be between -180 and 180)

location
string <= 255 characters

Location description

address
string <= 255 characters

Street address (optional for multi-step creation)

city
string <= 100 characters

City (optional for multi-step creation)

state
string <= 50 characters

State (optional for multi-step creation)

zip
string <= 20 characters

ZIP code (optional for multi-step creation)

doorsOpenOffset
number
Enum: 60 90 120 150 180

Doors open before event (in minutes) (optional for multi-step creation)

doorsOpenTime
string

Doors open time (HH:mm format, e.g., "17:00:00" for 5:00 PM)

timezone
string <= 100 characters

Local timezone (IANA format, e.g., "America/New_York")

Array of objects (ParkingOptionDto)

Parking lot options (optional for multi-step creation)

parking
string

Parking description (detailed text about parking options)

publicTransportation
string

Public transportation information

bagPolicy
string

Bag size policy (optional for multi-step creation)

prohibitedItems
string

Prohibited items (optional for multi-step creation)

reentryAllowed
string
Enum: "Allowed" "Not allowed" "Conditional"

Re-entry policy (optional for multi-step creation)

reentryDetails
string

Re-entry details (required if re-entry policy is Conditional)

adaAvailable
boolean

ADA seating available (optional for multi-step creation)

wheelchairAccess
string

Wheelchair accessibility description (optional for multi-step creation)

officialUrl
string <= 512 characters

Official venue URL

logoUrl
string <= 512 characters

Venue logo URL

Responses

Request samples

Content type
application/json
{
  • "officialName": "Madison Square Garden",
  • "googlePlaceId": "ChIJhRwB-yFawokR5Phil-QQ3zM",
  • "shortName": "MSG",
  • "aliases": [
    ],
  • "latitude": 40.7505,
  • "longitude": -73.9934,
  • "location": "Downtown Manhattan",
  • "address": "4 Pennsylvania Plaza",
  • "city": "New York",
  • "state": "NY",
  • "zip": "10001",
  • "doorsOpenOffset": 90,
  • "doorsOpenTime": "17:00:00",
  • "timezone": "America/New_York",
  • "parkingOptions": [
    ],
  • "parking": "The venue has 939 on-site parking spaces, including the P2 garage and valet parking.",
  • "publicTransportation": "Kaseya Center is accessible via multiple public transportation options. The Downtown Metromover has a nearby Park West station.",
  • "bagPolicy": "Bags must be smaller than 12\" x 12\" x 6\"",
  • "prohibitedItems": "Weapons, outside food and beverages, large bags",
  • "reentryAllowed": "Not allowed",
  • "reentryDetails": "Re-entry allowed with valid ticket stub and hand stamp",
  • "adaAvailable": true,
  • "wheelchairAccess": "Full wheelchair access available at all entrances and seating areas",
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get venue by ID Deprecated

DEPRECATED: Use /venues/:id instead.

Retrieves a specific venue by its unique identifier

Authorizations:
JWT-auth
path Parameters
teamId
required
string
id
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Partially update a publisher venue Deprecated

DEPRECATED: Use PATCH /team/:teamId/team-venues/:id instead.

Partially updates an existing publisher venue. Only provided fields will be updated. Supports multi-step form saves. User must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
id
required
string
Request Body schema: application/json
required
officialName
string <= 255 characters

Official venue name

shortName
string <= 255 characters

Short name or abbreviation for the venue

aliases
Array of strings

Alternative names or aliases for the venue

latitude
number

Latitude coordinate (must be between -90 and 90)

longitude
number

Longitude coordinate (must be between -180 and 180)

location
string <= 255 characters

Location description

address
string <= 255 characters

Street address

city
string <= 100 characters

City

state
string <= 50 characters

State

zip
string <= 20 characters

ZIP code

doorsOpenOffset
number
Enum: 60 90 120 150 180

Doors open before event (in minutes)

doorsOpenTime
string

Doors open time (HH:mm format, e.g., "17:00:00" for 5:00 PM)

timezone
string <= 100 characters

Local timezone (IANA format, e.g., "America/New_York")

Array of objects (ParkingOptionDto)

Parking lot options

parking
string

Parking description (detailed text about parking options)

publicTransportation
string

Public transportation information

bagPolicy
string

Bag size policy

prohibitedItems
string

Prohibited items

reentryAllowed
string
Enum: "Allowed" "Not allowed" "Conditional"

Re-entry policy

reentryDetails
string

Re-entry details (required if re-entry policy is Conditional)

adaAvailable
boolean

ADA seating available

wheelchairAccess
string

Wheelchair accessibility description

officialUrl
string <= 512 characters

Official venue URL

logoUrl
string <= 512 characters

Venue logo URL

Responses

Request samples

Content type
application/json
{
  • "officialName": "Madison Square Garden",
  • "shortName": "MSG",
  • "aliases": [
    ],
  • "latitude": 40.7505,
  • "longitude": -73.9934,
  • "location": "Downtown Manhattan",
  • "address": "4 Pennsylvania Plaza",
  • "city": "New York",
  • "state": "NY",
  • "zip": "10001",
  • "doorsOpenOffset": 90,
  • "doorsOpenTime": "17:00:00",
  • "timezone": "America/New_York",
  • "parkingOptions": [
    ],
  • "parking": "The venue has 939 on-site parking spaces, including the P2 garage and valet parking.",
  • "publicTransportation": "Kaseya Center is accessible via multiple public transportation options. The Downtown Metromover has a nearby Park West station.",
  • "bagPolicy": "Bags must be smaller than 12\" x 12\" x 6\"",
  • "prohibitedItems": "Weapons, outside food and beverages, large bags",
  • "reentryAllowed": "Not allowed",
  • "reentryDetails": "Re-entry allowed with valid ticket stub and hand stamp",
  • "adaAvailable": true,
  • "wheelchairAccess": "Full wheelchair access available at all entrances and seating areas",
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update a publisher venue Deprecated

DEPRECATED: Use PUT /team/:teamId/team-venues/:id instead.

Updates an existing publisher venue. All fields are required. Only venues created by publisher can be updated. User must be a member of the team. Metadata fields (parentId, dataSource, externalId, teamId) cannot be modified.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
id
required
string
Request Body schema: application/json
required
officialName
required
string <= 255 characters

Official venue name

googlePlaceId
string <= 255 characters

Google Place ID

shortName
string <= 255 characters

Short name or abbreviation for the venue

aliases
Array of strings

Alternative names or aliases for the venue

latitude
number

Latitude coordinate (must be between -90 and 90)

longitude
number

Longitude coordinate (must be between -180 and 180)

location
string <= 255 characters

Location description

address
string <= 255 characters

Street address (optional for multi-step creation)

city
string <= 100 characters

City (optional for multi-step creation)

state
string <= 50 characters

State (optional for multi-step creation)

zip
string <= 20 characters

ZIP code (optional for multi-step creation)

doorsOpenOffset
number
Enum: 60 90 120 150 180

Doors open before event (in minutes) (optional for multi-step creation)

doorsOpenTime
string

Doors open time (HH:mm format, e.g., "17:00:00" for 5:00 PM)

timezone
string <= 100 characters

Local timezone (IANA format, e.g., "America/New_York")

Array of objects (ParkingOptionDto)

Parking lot options (optional for multi-step creation)

parking
string

Parking description (detailed text about parking options)

publicTransportation
string

Public transportation information

bagPolicy
string

Bag size policy (optional for multi-step creation)

prohibitedItems
string

Prohibited items (optional for multi-step creation)

reentryAllowed
string
Enum: "Allowed" "Not allowed" "Conditional"

Re-entry policy (optional for multi-step creation)

reentryDetails
string

Re-entry details (required if re-entry policy is Conditional)

adaAvailable
boolean

ADA seating available (optional for multi-step creation)

wheelchairAccess
string

Wheelchair accessibility description (optional for multi-step creation)

officialUrl
string <= 512 characters

Official venue URL

logoUrl
string <= 512 characters

Venue logo URL

Responses

Request samples

Content type
application/json
{
  • "officialName": "Madison Square Garden",
  • "googlePlaceId": "ChIJhRwB-yFawokR5Phil-QQ3zM",
  • "shortName": "MSG",
  • "aliases": [
    ],
  • "latitude": 40.7505,
  • "longitude": -73.9934,
  • "location": "Downtown Manhattan",
  • "address": "4 Pennsylvania Plaza",
  • "city": "New York",
  • "state": "NY",
  • "zip": "10001",
  • "doorsOpenOffset": 90,
  • "doorsOpenTime": "17:00:00",
  • "timezone": "America/New_York",
  • "parkingOptions": [
    ],
  • "parking": "The venue has 939 on-site parking spaces, including the P2 garage and valet parking.",
  • "publicTransportation": "Kaseya Center is accessible via multiple public transportation options. The Downtown Metromover has a nearby Park West station.",
  • "bagPolicy": "Bags must be smaller than 12\" x 12\" x 6\"",
  • "prohibitedItems": "Weapons, outside food and beverages, large bags",
  • "reentryAllowed": "Not allowed",
  • "reentryDetails": "Re-entry allowed with valid ticket stub and hand stamp",
  • "adaAvailable": true,
  • "wheelchairAccess": "Full wheelchair access available at all entrances and seating areas",
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Delete a venue Deprecated

DEPRECATED: Use DELETE /team/:teamId/team-venues/:id instead.

Deletes a venue by its unique identifier. User must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
id
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Set a venue as home venue for the team Deprecated

DEPRECATED: Use PUT /team/:teamId/team-venues/:id/set-home instead.

Sets a venue as the home venue for the team. The venue must be accessible for the team (either a non-publisher venue not overwritten by your publisher venues, or one of your publisher venues). User must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
id
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Add a policy to a venue Deprecated

DEPRECATED: Use POST /team/:teamId/team-venues/:teamVenueId/policies/:policyId instead.

Associates a policy with a venue. Both the policy and venue must belong to the team. Only team-owned venues (publisher venues) can have policies associated with them.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
venueId
required
string
policyId
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Remove a policy from a venue Deprecated

DEPRECATED: Use DELETE /team/:teamId/team-venues/:teamVenueId/policies/:policyId instead.

Removes the association between a policy and a venue. Both the policy and venue must belong to the team. Only team-owned venues (publisher venues) can have policies associated with them.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
venueId
required
string
policyId
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

List all venues

Returns a paginated list of all venues (both publisher and non-publisher). Supports search by name and filter by Google Place ID.

Authorizations:
JWT-auth
query Parameters
page
number
Default: 1
Example: page=1

Page number (starts from 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of results per page

orderBy
string
Example: orderBy=createdAt

Field to order by (e.g., createdAt, updatedAt)

orderDirection
string
Enum: "ASC" "DESC"
Example: orderDirection=DESC

Order direction

search
string >= 2 characters
Example: search=Madison Square

Search query for venue name (minimum 2 characters)

googlePlaceId
string
Example: googlePlaceId=ChIJhRwB-yFawokR5Phil-QQ3zM

Filter by Google Place ID

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": [
    ]
}

Create a new venue

Creates a new venue. Can specify data source, team ID, and other metadata fields.

Authorizations:
JWT-auth
Request Body schema: application/json
required
officialName
required
string <= 255 characters

Official venue name

googlePlaceId
string <= 255 characters

Google Place ID

shortName
string <= 255 characters

Short name or abbreviation for the venue

aliases
Array of strings

Alternative names or aliases for the venue

latitude
number

Latitude coordinate (must be between -90 and 90)

longitude
number

Longitude coordinate (must be between -180 and 180)

location
string <= 255 characters

Location description

address
string <= 255 characters

Street address (optional for multi-step creation)

city
string <= 100 characters

City (optional for multi-step creation)

state
string <= 50 characters

State (optional for multi-step creation)

zip
string <= 20 characters

ZIP code (optional for multi-step creation)

doorsOpenOffset
number
Enum: 60 90 120 150 180

Doors open before event (in minutes) (optional for multi-step creation)

doorsOpenTime
string

Doors open time (HH:mm format, e.g., "17:00:00" for 5:00 PM)

timezone
string <= 100 characters

Local timezone (IANA format, e.g., "America/New_York")

Array of objects (ParkingOptionDto)

Parking lot options (optional for multi-step creation)

parking
string

Parking description (detailed text about parking options)

publicTransportation
string

Public transportation information

bagPolicy
string

Bag size policy (optional for multi-step creation)

prohibitedItems
string

Prohibited items (optional for multi-step creation)

reentryAllowed
string
Enum: "Allowed" "Not allowed" "Conditional"

Re-entry policy (optional for multi-step creation)

reentryDetails
string

Re-entry details (required if re-entry policy is Conditional)

adaAvailable
boolean

ADA seating available (optional for multi-step creation)

wheelchairAccess
string

Wheelchair accessibility description (optional for multi-step creation)

officialUrl
string <= 512 characters

Official venue URL

logoUrl
string <= 512 characters

Venue logo URL

teamId
string

Team ID (optional)

externalId
string <= 255 characters

External ID from third-party systems (e.g., Sportsradar venue ID)

dataSource
string
Enum: "system" "sportsradar" "brandfetch" "publisher"

Data source indicating where the venue data originated from

parentId
string

Parent venue ID - references source venue when Publisher overwrites external/system data

Responses

Request samples

Content type
application/json
{
  • "officialName": "Madison Square Garden",
  • "googlePlaceId": "ChIJhRwB-yFawokR5Phil-QQ3zM",
  • "shortName": "MSG",
  • "aliases": [
    ],
  • "latitude": 40.7505,
  • "longitude": -73.9934,
  • "location": "Downtown Manhattan",
  • "address": "4 Pennsylvania Plaza",
  • "city": "New York",
  • "state": "NY",
  • "zip": "10001",
  • "doorsOpenOffset": 90,
  • "doorsOpenTime": "17:00:00",
  • "timezone": "America/New_York",
  • "parkingOptions": [
    ],
  • "parking": "The venue has 939 on-site parking spaces, including the P2 garage and valet parking.",
  • "publicTransportation": "Kaseya Center is accessible via multiple public transportation options. The Downtown Metromover has a nearby Park West station.",
  • "bagPolicy": "Bags must be smaller than 12\" x 12\" x 6\"",
  • "prohibitedItems": "Weapons, outside food and beverages, large bags",
  • "reentryAllowed": "Not allowed",
  • "reentryDetails": "Re-entry allowed with valid ticket stub and hand stamp",
  • "adaAvailable": true,
  • "wheelchairAccess": "Full wheelchair access available at all entrances and seating areas",
  • "teamId": "123e4567-e89b-12d3-a456-426614174000",
  • "externalId": "sr-venue-12345",
  • "dataSource": "sportsradar",
  • "parentId": "123e4567-e89b-12d3-a456-426614174000"
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get venue by ID

Retrieves a specific venue by its unique identifier

Authorizations:
JWT-auth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update venue

Updates an existing venue. All fields are required. Metadata fields (parentId, dataSource, externalId, teamId) cannot be modified.

Authorizations:
JWT-auth
path Parameters
id
required
string
Request Body schema: application/json
required
officialName
required
string <= 255 characters

Official venue name

shortName
string <= 255 characters

Short name or abbreviation for the venue

aliases
Array of strings

Alternative names or aliases for the venue

latitude
number

Latitude coordinate (must be between -90 and 90)

longitude
number

Longitude coordinate (must be between -180 and 180)

location
string <= 255 characters

Location description

address
required
string <= 255 characters

Street address

city
required
string <= 100 characters

City

state
required
string <= 50 characters

State

zip
required
string <= 20 characters

ZIP code

doorsOpenOffset
required
number
Enum: 60 90 120 150 180

Doors open before event (in minutes)

doorsOpenTime
string

Doors open time (HH:mm format, e.g., "17:00:00" for 5:00 PM)

timezone
string <= 100 characters

Local timezone (IANA format, e.g., "America/New_York")

Array of objects (ParkingOptionDto)

Parking lot options

parking
string

Parking description (detailed text about parking options)

publicTransportation
string

Public transportation information

bagPolicy
required
string

Bag size policy

prohibitedItems
required
string

Prohibited items

reentryAllowed
required
string
Enum: "Allowed" "Not allowed" "Conditional"

Re-entry policy

reentryDetails
string

Re-entry details (required if re-entry policy is Conditional)

adaAvailable
required
boolean

ADA seating available

wheelchairAccess
required
string

Wheelchair accessibility description

officialUrl
string <= 512 characters

Official venue URL

logoUrl
string <= 512 characters

Venue logo URL

Responses

Request samples

Content type
application/json
{
  • "officialName": "Madison Square Garden",
  • "shortName": "MSG",
  • "aliases": [
    ],
  • "latitude": 40.7505,
  • "longitude": -73.9934,
  • "location": "Downtown Manhattan",
  • "address": "4 Pennsylvania Plaza",
  • "city": "New York",
  • "state": "NY",
  • "zip": "10001",
  • "doorsOpenOffset": 90,
  • "doorsOpenTime": "17:00:00",
  • "timezone": "America/New_York",
  • "parkingOptions": [
    ],
  • "parking": "The venue has 939 on-site parking spaces, including the P2 garage and valet parking.",
  • "publicTransportation": "Kaseya Center is accessible via multiple public transportation options. The Downtown Metromover has a nearby Park West station.",
  • "bagPolicy": "Bags must be smaller than 12\" x 12\" x 6\"",
  • "prohibitedItems": "Weapons, outside food and beverages, large bags",
  • "reentryAllowed": "Not allowed",
  • "reentryDetails": "Re-entry allowed with valid ticket stub and hand stamp",
  • "adaAvailable": true,
  • "wheelchairAccess": "Full wheelchair access available at all entrances and seating areas",
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Partially update a venue

Partially updates an existing venue. Only provided fields will be updated. Supports multi-step form saves.

Authorizations:
JWT-auth
path Parameters
id
required
string
Request Body schema: application/json
required
officialName
string <= 255 characters

Official venue name

shortName
string <= 255 characters

Short name or abbreviation for the venue

aliases
Array of strings

Alternative names or aliases for the venue

latitude
number

Latitude coordinate (must be between -90 and 90)

longitude
number

Longitude coordinate (must be between -180 and 180)

location
string <= 255 characters

Location description

address
string <= 255 characters

Street address

city
string <= 100 characters

City

state
string <= 50 characters

State

zip
string <= 20 characters

ZIP code

doorsOpenOffset
number
Enum: 60 90 120 150 180

Doors open before event (in minutes)

doorsOpenTime
string

Doors open time (HH:mm format, e.g., "17:00:00" for 5:00 PM)

timezone
string <= 100 characters

Local timezone (IANA format, e.g., "America/New_York")

Array of objects (ParkingOptionDto)

Parking lot options

parking
string

Parking description (detailed text about parking options)

publicTransportation
string

Public transportation information

bagPolicy
string

Bag size policy

prohibitedItems
string

Prohibited items

reentryAllowed
string
Enum: "Allowed" "Not allowed" "Conditional"

Re-entry policy

reentryDetails
string

Re-entry details (required if re-entry policy is Conditional)

adaAvailable
boolean

ADA seating available

wheelchairAccess
string

Wheelchair accessibility description

officialUrl
string <= 512 characters

Official venue URL

logoUrl
string <= 512 characters

Venue logo URL

Responses

Request samples

Content type
application/json
{
  • "officialName": "Madison Square Garden",
  • "shortName": "MSG",
  • "aliases": [
    ],
  • "latitude": 40.7505,
  • "longitude": -73.9934,
  • "location": "Downtown Manhattan",
  • "address": "4 Pennsylvania Plaza",
  • "city": "New York",
  • "state": "NY",
  • "zip": "10001",
  • "doorsOpenOffset": 90,
  • "doorsOpenTime": "17:00:00",
  • "timezone": "America/New_York",
  • "parkingOptions": [
    ],
  • "parking": "The venue has 939 on-site parking spaces, including the P2 garage and valet parking.",
  • "publicTransportation": "Kaseya Center is accessible via multiple public transportation options. The Downtown Metromover has a nearby Park West station.",
  • "bagPolicy": "Bags must be smaller than 12\" x 12\" x 6\"",
  • "prohibitedItems": "Weapons, outside food and beverages, large bags",
  • "reentryAllowed": "Not allowed",
  • "reentryDetails": "Re-entry allowed with valid ticket stub and hand stamp",
  • "adaAvailable": true,
  • "wheelchairAccess": "Full wheelchair access available at all entrances and seating areas",
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Delete a venue

Deletes a venue by its unique identifier. This operation cascades to all TeamVenues associated with this venue.

Authorizations:
JWT-auth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Internal - Venues

List non-publisher venues (Internal)

Internal endpoint to retrieve a paginated list of non-publisher venues (SYSTEM, SPORTSRADAR, BRANDFETCH). No authentication required.

query Parameters
page
number
Default: 1
Example: page=1

Page number (starts from 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of results per page

orderBy
string
Example: orderBy=createdAt

Field to order by (e.g., createdAt, updatedAt)

orderDirection
string
Enum: "ASC" "DESC"
Example: orderDirection=DESC

Order direction

query
string >= 2 characters
Example: query=Madison Square

Search query for venue name (minimum 2 characters)

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Create venue from internal/external source

Creates a new venue with data from SYSTEM, SPORTSRADAR, or BRANDFETCH. Cannot create PUBLISHER venues.

Request Body schema: application/json
required
officialName
required
string <= 255 characters

Official venue name

googlePlaceId
string <= 255 characters

Google Place ID

shortName
string <= 255 characters

Short name or abbreviation for the venue

aliases
Array of strings

Alternative names or aliases for the venue

latitude
number

Latitude coordinate (must be between -90 and 90)

longitude
number

Longitude coordinate (must be between -180 and 180)

location
string <= 255 characters

Location description

address
required
string <= 255 characters

Street address

city
required
string <= 100 characters

City

state
required
string <= 50 characters

State

zip
required
string <= 20 characters

ZIP code

doorsOpenOffset
required
number
Enum: 60 90 120 150 180

Doors open before event (in minutes)

doorsOpenTime
string

Doors open time (HH:mm format, e.g., "17:00:00" for 5:00 PM)

timezone
string <= 100 characters

Local timezone (IANA format, e.g., "America/New_York")

required
Array of objects (ParkingOptionDto)

Parking lot options

parking
string

Parking description (detailed text about parking options)

publicTransportation
string

Public transportation information

bagPolicy
required
string

Bag size policy

prohibitedItems
required
string

Prohibited items

reentryAllowed
required
string
Enum: "Allowed" "Not allowed" "Conditional"

Re-entry policy

reentryDetails
string

Re-entry details (required if re-entry policy is Conditional)

adaAvailable
required
boolean

ADA seating available

wheelchairAccess
required
string

Wheelchair accessibility description

officialUrl
string <= 512 characters

Official venue URL

logoUrl
string <= 512 characters

Venue logo URL

teamId
string

Team ID (optional)

externalId
required
string <= 255 characters

External ID from third-party systems (e.g., Sportsradar venue ID)

dataSource
required
string
Enum: "system" "sportsradar" "brandfetch" "publisher"

Data source indicating where the venue data originated from

Responses

Request samples

Content type
application/json
{
  • "officialName": "Madison Square Garden",
  • "googlePlaceId": "ChIJhRwB-yFawokR5Phil-QQ3zM",
  • "shortName": "MSG",
  • "aliases": [
    ],
  • "latitude": 40.7505,
  • "longitude": -73.9934,
  • "location": "Downtown Manhattan",
  • "address": "4 Pennsylvania Plaza",
  • "city": "New York",
  • "state": "NY",
  • "zip": "10001",
  • "doorsOpenOffset": 90,
  • "doorsOpenTime": "17:00:00",
  • "timezone": "America/New_York",
  • "parkingOptions": [
    ],
  • "parking": "The venue has 939 on-site parking spaces, including the P2 garage and valet parking.",
  • "publicTransportation": "Kaseya Center is accessible via multiple public transportation options. The Downtown Metromover has a nearby Park West station.",
  • "bagPolicy": "Bags must be smaller than 12\" x 12\" x 6\"",
  • "prohibitedItems": "Weapons, outside food and beverages, large bags",
  • "reentryAllowed": "Not allowed",
  • "reentryDetails": "Re-entry allowed with valid ticket stub and hand stamp",
  • "adaAvailable": true,
  • "wheelchairAccess": "Full wheelchair access available at all entrances and seating areas",
  • "teamId": "123e4567-e89b-12d3-a456-426614174000",
  • "externalId": "sr-venue-12345",
  • "dataSource": "sportsradar"
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get venue by ID (Internal)

Retrieves a specific venue by its unique identifier

path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update venue from internal/external source

Fully updates an existing non-publisher venue. All fields are required. Cannot update PUBLISHER venues.

path Parameters
id
required
string
Request Body schema: application/json
required
officialName
required
string <= 255 characters

Official venue name

shortName
string <= 255 characters

Short name or abbreviation for the venue

aliases
Array of strings

Alternative names or aliases for the venue

latitude
number

Latitude coordinate (must be between -90 and 90)

longitude
number

Longitude coordinate (must be between -180 and 180)

location
string <= 255 characters

Location description

address
required
string <= 255 characters

Street address

city
required
string <= 100 characters

City

state
required
string <= 50 characters

State

zip
required
string <= 20 characters

ZIP code

doorsOpenOffset
required
number
Enum: 60 90 120 150 180

Doors open before event (in minutes)

doorsOpenTime
string

Doors open time (HH:mm format, e.g., "17:00:00" for 5:00 PM)

timezone
string <= 100 characters

Local timezone (IANA format, e.g., "America/New_York")

required
Array of objects (ParkingOptionDto)

Parking lot options

parking
string

Parking description (detailed text about parking options)

publicTransportation
string

Public transportation information

bagPolicy
required
string

Bag size policy

prohibitedItems
required
string

Prohibited items

reentryAllowed
required
string
Enum: "Allowed" "Not allowed" "Conditional"

Re-entry policy

reentryDetails
string

Re-entry details (required if re-entry policy is Conditional)

adaAvailable
required
boolean

ADA seating available

wheelchairAccess
required
string

Wheelchair accessibility description

officialUrl
string <= 512 characters

Official venue URL

logoUrl
string <= 512 characters

Venue logo URL

teamId
string

Team ID (optional)

externalId
required
string <= 255 characters

External ID from third-party systems (e.g., Sportsradar venue ID)

dataSource
required
string
Enum: "system" "sportsradar" "brandfetch" "publisher"

Data source indicating where the venue data originated from

Responses

Request samples

Content type
application/json
{
  • "officialName": "Madison Square Garden",
  • "shortName": "MSG",
  • "aliases": [
    ],
  • "latitude": 40.7505,
  • "longitude": -73.9934,
  • "location": "Downtown Manhattan",
  • "address": "4 Pennsylvania Plaza",
  • "city": "New York",
  • "state": "NY",
  • "zip": "10001",
  • "doorsOpenOffset": 90,
  • "doorsOpenTime": "17:00:00",
  • "timezone": "America/New_York",
  • "parkingOptions": [
    ],
  • "parking": "The venue has 939 on-site parking spaces, including the P2 garage and valet parking.",
  • "publicTransportation": "Kaseya Center is accessible via multiple public transportation options. The Downtown Metromover has a nearby Park West station.",
  • "bagPolicy": "Bags must be smaller than 12\" x 12\" x 6\"",
  • "prohibitedItems": "Weapons, outside food and beverages, large bags",
  • "reentryAllowed": "Not allowed",
  • "reentryDetails": "Re-entry allowed with valid ticket stub and hand stamp",
  • "adaAvailable": true,
  • "wheelchairAccess": "Full wheelchair access available at all entrances and seating areas",
  • "teamId": "123e4567-e89b-12d3-a456-426614174000",
  • "externalId": "sr-venue-12345",
  • "dataSource": "sportsradar"
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Team Venues

List team venues

Returns a paginated list of team venues for the specified team. Supports filtering by venue ID, Google Place ID, and home venue status.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
query Parameters
page
number
Default: 1
Example: page=1

Page number (starts from 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of results per page

orderBy
string
Example: orderBy=createdAt

Field to order by (e.g., createdAt, updatedAt)

orderDirection
string
Enum: "ASC" "DESC"
Example: orderDirection=DESC

Order direction

googlePlaceId
string
Example: googlePlaceId=ChIJKxDbe_lYwokRVf__s8CPn-o

Filter by Google Place ID (searches via joined venue)

venueId
string
Example: venueId=123e4567-e89b-12d3-a456-426614174000

Filter by venue ID

isHomeVenue
boolean
Example: isHomeVenue=true

Filter by home venue status

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": [
    ]
}

Create a new team venue

Creates a new team venue association for the specified team. The venue must exist in the system. User must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
venueId
required
string

Venue ID

shortName
string <= 255 characters

Short name or abbreviation for the venue

aliases
Array of strings

Alternative names or aliases for the venue

doorsOpenTime
string

Doors open time (HH:mm format, e.g., "17:00" for 5:00 PM)

parking
string

Parking description (detailed text about parking options)

publicTransportation
string

Public transportation information

isHomeVenue
boolean

Whether this is the home venue for the team

Responses

Request samples

Content type
application/json
{
  • "venueId": "123e4567-e89b-12d3-a456-426614174000",
  • "shortName": "MSG",
  • "aliases": [
    ],
  • "doorsOpenTime": "17:00",
  • "parking": "The venue has 939 on-site parking spaces, including the P2 garage and valet parking.",
  • "publicTransportation": "Kaseya Center is accessible via multiple public transportation options. The Downtown Metromover has a nearby Park West station.",
  • "isHomeVenue": true
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get team venue by ID

Retrieves a specific team venue by its unique identifier

Authorizations:
JWT-auth
path Parameters
teamId
required
string
id
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update a team venue

Updates an existing team venue. All fields are required. User must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
id
required
string
Request Body schema: application/json
required
shortName
string <= 255 characters

Short name or abbreviation for the venue

aliases
Array of strings

Alternative names or aliases for the venue

doorsOpenTime
string

Doors open time (HH:mm format, e.g., "17:00" for 5:00 PM)

parking
string

Parking description (detailed text about parking options)

publicTransportation
string

Public transportation information

isHomeVenue
boolean

Whether this is the home venue for the team

Responses

Request samples

Content type
application/json
{
  • "shortName": "MSG",
  • "aliases": [
    ],
  • "doorsOpenTime": "17:00",
  • "parking": "The venue has 939 on-site parking spaces, including the P2 garage and valet parking.",
  • "publicTransportation": "Kaseya Center is accessible via multiple public transportation options. The Downtown Metromover has a nearby Park West station.",
  • "isHomeVenue": true
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Partially update a team venue

Partially updates an existing team venue. Only provided fields will be updated. User must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
id
required
string
Request Body schema: application/json
required
shortName
string <= 255 characters

Short name or abbreviation for the venue

aliases
Array of strings

Alternative names or aliases for the venue

doorsOpenTime
string

Doors open time (HH:mm format, e.g., "17:00" for 5:00 PM)

parking
string

Parking description (detailed text about parking options)

publicTransportation
string

Public transportation information

isHomeVenue
boolean

Whether this is the home venue for the team

Responses

Request samples

Content type
application/json
{
  • "shortName": "MSG",
  • "aliases": [
    ],
  • "doorsOpenTime": "17:00",
  • "parking": "The venue has 939 on-site parking spaces, including the P2 garage and valet parking.",
  • "publicTransportation": "Kaseya Center is accessible via multiple public transportation options. The Downtown Metromover has a nearby Park West station.",
  • "isHomeVenue": true
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Delete a team venue

Deletes a team venue by its unique identifier. User must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
id
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Set a team venue as home venue for the team

Sets a team venue as the home venue for the team. This will update the team.homeVenueId and sync isHomeVenue flags across all team venues. User must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
id
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Add a policy to a team venue

Associates a policy with a team venue. Both the policy and team venue must belong to the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
teamVenueId
required
string
policyId
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Remove a policy from a team venue

Removes the association between a policy and a team venue. Both the policy and team venue must belong to the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
teamVenueId
required
string
policyId
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

List policies for a team venue

Returns all policies associated with a team venue. User must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
teamVenueId
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": [
    ]
}

Streaming Info

Get all streaming information for a team

Retrieves all streaming information associated with a specific team

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
{}

Create streaming information

Creates a new streaming information entry for a team. Each team can have multiple streaming partners, but each combination of teamId + streamingPartnerId must be unique.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
streamingPartnerId
required
string

Streaming partner ID

streamingCategory
required
string
Enum: "Streaming" "Local" "Radio"

Streaming category

customUrl
string

Custom URL

note
string

Note

Responses

Request samples

Content type
application/json
{
  • "streamingPartnerId": "123e4567-e89b-12d3-a456-426614174000",
  • "streamingCategory": "Streaming",
  • "note": "Additional information about the streaming"
}

Response samples

Content type
application/json
{}

Update streaming information

Updates the blackout regions for a specific streaming information entry. Only blackout regions can be updated.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
streamingPartnerId
required
string
Request Body schema: application/json
required
streamingCategory
string
Enum: "Streaming" "Local" "Radio"

Streaming category

customUrl
string

Custom URL

note
string

Note

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Delete streaming information

Deletes a streaming information entry by team ID and streaming partner ID. User must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
streamingPartnerId
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Theme Nights

Search theme nights by profile for typeahead dropdown

Searches theme nights by profile for typeahead functionality. Returns list of matching theme nights for the specified team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
query Parameters
query
required
string >= 2 characters
Example: query=Lakers

Search query string (minimum 2 characters)

Responses

Response samples

Content type
application/json
[]

Create theme night

Create a new theme night for the team

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
profile
required
string

Theme night profile (unique per team)

sponsorId
required
string

Sponsor ID associated with this theme night

description
required
string

Description of the theme night

Responses

Request samples

Content type
application/json
{
  • "profile": "Lakers Pride Night",
  • "sponsorId": "550e8400-e29b-41d4-a716-446655440000",
  • "description": "A special night celebrating Lakers pride with exclusive merchandise and activities"
}

Response samples

Content type
application/json
{}

Update theme night

Update an existing theme night

Authorizations:
JWT-auth
path Parameters
teamId
required
string
themeNightId
required
string
Request Body schema: application/json
required
profile
string

Theme night profile (unique per team)

sponsorId
string

Sponsor ID associated with this theme night

description
string

Description of the theme night

Responses

Request samples

Content type
application/json
{
  • "profile": "Lakers Pride Night",
  • "sponsorId": "550e8400-e29b-41d4-a716-446655440000",
  • "description": "A special night celebrating Lakers pride with exclusive merchandise and activities"
}

Response samples

Content type
application/json
{}

Delete theme night

Delete a theme night

Authorizations:
JWT-auth
path Parameters
teamId
required
string
themeNightId
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Hosts

Search hosts by name for typeahead dropdown

Searches hosts by name for typeahead functionality. Returns list of matching hosts for the specified team. Empty query returns all hosts.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
query Parameters
query
string
Example: query=John

Optional search query string (no minimum length; empty returns all hosts)

limit
number [ 1 .. 100 ]
Example: limit=10

Maximum number of results to return (default: 20, max: 100)

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create host

Create a new host for the team

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
name
required
string

Host name

title
required
string

Host title/role

avatar
string

Host avatar image URL

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "id": "string",
  • "name": "string",
  • "title": "string",
  • "avatar": "string",
  • "teamId": "string",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Update host

Update an existing host

Authorizations:
JWT-auth
path Parameters
teamId
required
string
hostId
required
string
Request Body schema: application/json
required
name
string

Host name

title
string

Host title/role

avatar
string

Host avatar image URL

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "id": "string",
  • "name": "string",
  • "title": "string",
  • "avatar": "string",
  • "teamId": "string",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Delete host

Delete a host

Authorizations:
JWT-auth
path Parameters
teamId
required
string
hostId
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Marketing

Get marketing content

Get marketing content including hashtags, images, and videos for a team

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "hashtags": [
    ],
  • "images": [
    ],
  • "videos": [
    ],
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Update marketing hashtags

Update hashtags for team marketing content

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
hashtags
required
Array of strings

Array of hashtags

Responses

Request samples

Content type
application/json
{
  • "hashtags": [
    ]
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "hashtags": [
    ],
  • "images": [
    ],
  • "videos": [
    ],
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Add marketing image

Add an image to team marketing content (moves from temporary to permanent storage)

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
imageUrl
required
string

Temporary image URL from upload service

Responses

Request samples

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "hashtags": [
    ],
  • "images": [
    ],
  • "videos": [
    ],
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Add marketing video

Add a video to team marketing content (moves from temporary to permanent storage)

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
videoUrl
required
string

Temporary video URL from upload service

title
string

Video title

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "hashtags": [
    ],
  • "images": [
    ],
  • "videos": [
    ],
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Delete marketing image

Delete an image from team marketing content

Authorizations:
JWT-auth
path Parameters
teamId
required
string
imageId
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "hashtags": [
    ],
  • "images": [
    ],
  • "videos": [
    ],
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Delete marketing video

Delete a video from team marketing content

Authorizations:
JWT-auth
path Parameters
teamId
required
string
videoId
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "hashtags": [
    ],
  • "images": [
    ],
  • "videos": [
    ],
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Widget Definitions

Get available widget definitions

Public endpoint to get available widget definitions with complete config schemas for frontend

query Parameters
category
string

Filter by widget category (MOMENT_CALENDAR, MOMENT_OPTIONAL, etc.)

supportedEntityTypes
string

Filter by supported entity types (comma-separated, e.g., "moment,campaign"). Returns widgets that support any of the specified entity types.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Policies

Get all policies for a team by category (with optional search)

Retrieves all policies for a specific team and category. Category is required to separate venue and ticketing policies. If query parameter is provided (minimum 2 characters), searches policies by title or description within the category. Otherwise, returns all policies for the category.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
query Parameters
category
required
string
Enum: "venue" "ticketing"

Policy category (required) - venue or ticketing

query
string >= 2 characters
Example: query=conduct

Optional search query string (minimum 2 characters). If provided, searches in title and description.

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": [
    ]
}

Create a policy

Creates a new policy for a team

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
category
required
string
Enum: "venue" "ticketing"

Policy category

title
required
string <= 500 characters

Policy title (single line)

description
string

Policy description (text area)

Responses

Request samples

Content type
application/json
{
  • "category": "venue",
  • "title": "Code of Conduct",
  • "description": "This policy outlines the expected behavior for all team members..."
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get a policy by ID

Retrieves a specific policy by its ID for a team

Authorizations:
JWT-auth
path Parameters
teamId
required
string
policyId
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update a policy

Updates an existing policy for a team

Authorizations:
JWT-auth
path Parameters
teamId
required
string
policyId
required
string
Request Body schema: application/json
required
title
string <= 500 characters

Policy title (single line)

description
string

Policy description (text area)

Responses

Request samples

Content type
application/json
{
  • "title": "Code of Conduct",
  • "description": "This policy outlines the expected behavior for all team members..."
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Ticket Info

Get ticket info

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
{
  • "type": "Full Season Membership",
  • "ticketingUrl": "https://tickets.example.com",
  • "ticketingPartner": {
    },
  • "vipTicketInfo": "VIP packages include premium seating and exclusive access",
  • "phone": "123-456-7890",
  • "email": "example@example.com"
}

Update ticket info

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
type
required
string
Enum: "Single Game" "Full Season Membership" "Half Season Membership" "VIP"

Ticket type

ticketingUrl
required
string

Ticketing URL for the team

ticketingPartner
required
string

Ticketing partner key

vipTicketInfo
object

VIP ticket information

phone
string

Phone number for ticket inquiries

email
string

Email address for ticket inquiries

Responses

Request samples

Content type
application/json
{
  • "type": "Full Season Membership",
  • "ticketingPartner": "ticketmaster",
  • "vipTicketInfo": "VIP packages include premium seating and exclusive access",
  • "phone": "+1-312-455-4000",
  • "email": "tickets@chicagobulls.com"
}

Response samples

Content type
application/json
{
  • "type": "Full Season Membership",
  • "ticketingUrl": "https://tickets.example.com",
  • "ticketingPartner": {
    },
  • "vipTicketInfo": "VIP packages include premium seating and exclusive access",
  • "phone": "123-456-7890",
  • "email": "example@example.com"
}

Publisher Campaigns

Create a new campaign

Creates a new campaign for moments or a moments-list. The user must have access to the team.

Authorizations:
JWT-auth
Request Body schema: application/json
required

Campaign creation data

momentIds
Array of strings

Associated moment IDs (required for MOMENT type campaigns)

listId
string

Associated moment list ID (required for LIST type campaigns)

teamId
required
string

Associated team ID

type
required
string
Enum: "moment" "list" "team"

Campaign type

channel
required
string
Enum: "facebook" "instagram" "tiktok" "email" "web" "in_stadium" "other"

Campaign channel

objective
string
Enum: "sell_merch" "sell_tickets" "drive_streaming" "create_awareness" "engage_fans" "promote_event" "other"

Campaign objective

Responses

Request samples

Content type
application/json
{
  • "momentIds": [
    ],
  • "listId": "list-uuid",
  • "teamId": "team-uuid",
  • "type": "moment",
  • "channel": "facebook",
  • "objective": "sell_tickets"
}

Response samples

Content type
application/json
{
  • "id": "uuid-string",
  • "name": "Lakers vs Warriors - Facebook",
  • "status": "draft",
  • "isDefault": true,
  • "teamId": "team-uuid",
  • "listId": "list-uuid",
  • "type": "moment",
  • "channel": "facebook",
  • "objective": "sell_tickets",
  • "publishedAt": "2024-10-18T00:00:00.000Z"
}

List campaigns for a specific moment

Search and filter campaigns associated with a specific moment

Authorizations:
JWT-auth
path Parameters
momentId
required
string
Example: uuid-string

Moment ID

query Parameters
status
string
Enum: "draft" "published" "active" "paused" "completed" "cancelled"

Filter by campaign status

channel
string
Enum: "facebook" "instagram" "tiktok" "email" "web" "in_stadium" "other"

Filter by campaign channel

tags
string
Example: tags=nba,home-game

Comma-separated tags to filter by (e.g., nba,home-game)

query
string
Example: query=Lakers vs Warriors

Search text to match against campaign name

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List campaigns for a specific list

Search and filter campaigns associated with a specific list

Authorizations:
JWT-auth
path Parameters
listId
required
string
Example: uuid-string

List ID

query Parameters
status
string
Enum: "draft" "published" "active" "paused" "completed" "cancelled"

Filter by campaign status

channel
string
Enum: "facebook" "instagram" "tiktok" "email" "web" "in_stadium" "other"

Filter by campaign channel

tags
string
Example: tags=nba,home-game

Comma-separated tags to filter by (e.g., nba,home-game)

query
string
Example: query=Lakers vs Warriors

Search text to match against campaign name

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List campaigns for a specific team

Search and filter campaigns associated with a specific team

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: uuid-string

Team ID

query Parameters
status
string
Enum: "draft" "published" "active" "paused" "completed" "cancelled"

Filter by campaign status

channel
string
Enum: "facebook" "instagram" "tiktok" "email" "web" "in_stadium" "other"

Filter by campaign channel

tags
string
Example: tags=nba,home-game

Comma-separated tags to filter by (e.g., nba,home-game)

query
string
Example: query=Lakers vs Warriors

Search text to match against campaign name

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get single campaign by ID for authenticated publisher

Returns campaign entity without nested details (moments, moments-lists, tags)

Authorizations:
JWT-auth
path Parameters
id
required
string
Example: uuid-string

Campaign ID

Responses

Response samples

Content type
application/json
{
  • "id": "uuid-string",
  • "name": "Lakers vs Warriors - Facebook",
  • "status": "draft",
  • "isDefault": true,
  • "teamId": "team-uuid",
  • "listId": "list-uuid",
  • "type": "moment",
  • "channel": "facebook",
  • "objective": "sell_tickets",
  • "publishedAt": "2024-10-18T00:00:00.000Z"
}

Get moments for a specific campaign

Retrieves all moments associated with a specific campaign. Works for both MOMENT type campaigns (direct moment associations) and LIST type campaigns (moments from the associated list). Optionally includes tags if include=tags is specified.

Authorizations:
JWT-auth
path Parameters
campaignId
required
string
Example: uuid-string

Campaign ID

query Parameters
include
string
Example: include=tags

Comma-separated list of related resources to include. Currently supports: "tags"

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get or create short URL for a campaign

Returns the existing short URL if it exists, or creates a new one if it does not. The user must have access to the campaign.

Authorizations:
JWT-auth
path Parameters
id
required
string
Example: uuid-string

Campaign ID

Responses

Response samples

Content type
application/json
{}

Update campaign status

Update only the status of a campaign with status transition validation

Authorizations:
JWT-auth
path Parameters
id
required
string
Example: uuid-string

Campaign ID

Request Body schema: application/json
required

UpdateCampaignStatusDto - Status update data

status
required
string
Enum: "draft" "published" "active" "paused" "completed" "cancelled"

Status of the campaign

userId
string

User ID for internal endpoints. Optional, defaults to system user if not provided.

Responses

Request samples

Content type
application/json
{
  • "status": "published",
  • "userId": "string"
}

Response samples

Content type
application/json
{
  • "id": "uuid-string",
  • "name": "Lakers vs Warriors - Facebook",
  • "status": "draft",
  • "isDefault": true,
  • "teamId": "team-uuid",
  • "listId": "list-uuid",
  • "type": "moment",
  • "channel": "facebook",
  • "objective": "sell_tickets",
  • "publishedAt": "2024-10-18T00:00:00.000Z"
}

Get available campaign channels

Returns list of all available campaign channel options

Authorizations:
JWT-auth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Get available campaign objectives

Returns list of all available campaign objective options

Authorizations:
JWT-auth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Search campaigns for a team

Search campaigns for a specific team with filters (name, status, channel, type, objective, dates). Returns full campaign entities with cursor-based pagination. Requires team membership. Results sorted by createdAt DESC.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

Request Body schema: application/json
required
limit
number <= 100
Default: 20

Number of results per page

cursor
string

Cursor for pagination (base64 encoded JSON with sort fields)

direction
string
Default: "forward"
Enum: "forward" "backward"

Pagination direction

query
string

Full-text search query (searches in campaign name)

status
string
Enum: "draft" "published" "active" "paused" "completed" "cancelled"

Filter by campaign status

channel
string
Enum: "facebook" "instagram" "tiktok" "email" "web" "in_stadium" "other"

Filter by campaign channel

type
string
Enum: "moment" "list" "team"

Filter by campaign type

objective
string
Enum: "sell_merch" "sell_tickets" "drive_streaming" "create_awareness" "engage_fans" "promote_event" "other"

Filter by campaign objective

startDate
string

Filter by publishedAt start date

endDate
string

Filter by publishedAt end date

isDefault
boolean

Filter by whether campaign is default

Responses

Request samples

Content type
application/json
{
  • "limit": 20,
  • "cursor": "eyJzdGFydERhdGUiOiIyMDI0LTAxLTE1VDAwOjAwOjAwWiIsImlkIjoiMTIzIn0=",
  • "direction": "forward",
  • "query": "Lakers vs Warriors",
  • "status": "draft",
  • "channel": "facebook",
  • "type": "moment",
  • "objective": "sell_merch",
  • "startDate": "2024-01-01",
  • "endDate": "2024-12-31",
  • "isDefault": true
}

Response samples

Content type
application/json
{
  • "error": {
    }
}

Internal - Campaigns

Get share URL for a moment (Internal)

Internal endpoint to get a short URL for sharing a published moment. Optionally specify a campaignId. If the campaignId is not related to the moment, falls back to the default campaign.

path Parameters
momentId
required
string
Example: uuid-string

Moment ID

query Parameters
campaignId
string
Example: campaignId=uuid-string

Optional campaign ID. If provided and related to the moment, uses that campaign. Otherwise falls back to default campaign.

Responses

Response samples

Content type
application/json
{}

Get share URL for a list (Internal)

Internal endpoint to get a short URL for sharing a published list. Optionally specify a campaignId. If the campaignId is not related to the list, falls back to the default campaign.

path Parameters
listId
required
string
Example: uuid-string

List ID

query Parameters
campaignId
string
Example: campaignId=uuid-string

Optional campaign ID. If provided and related to the list, uses that campaign. Otherwise falls back to default campaign.

Responses

Response samples

Content type
application/json
{}

Get share URL for a team (Internal)

Internal endpoint to get a short URL for sharing a team. Optionally specify a campaignId. If the campaignId is not related to the team, falls back to the default campaign.

path Parameters
teamId
required
string
Example: uuid-string

Team ID

query Parameters
campaignId
string
Example: campaignId=uuid-string

Optional campaign ID. If provided and related to the team, uses that campaign. Otherwise falls back to default campaign.

Responses

Response samples

Content type
application/json
{}

Backfill default campaigns for teams (Internal) [DEPRECATED] Deprecated

DEPRECATED: This endpoint will be removed soon. Use it only for one-time backfill of existing teams. New teams will automatically get campaigns created during setup.

Internal endpoint to create default campaigns for all teams that are missing a defaultCampaignId. This is a one-time operation to backfill existing teams.

Responses

Response samples

Content type
application/json
{
  • "teamsProcessed": 0,
  • "campaignsCreated": 0,
  • "errors": 0
}

Moments

Create a new moment

  Creates a moment within a team. 
  The user must be a member of the team. The DTO varies based on eventType.
  Select an eventType to see the corresponding fields and example data.
Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required

CreateMomentDto - Data for creating a new moment. The schema varies based on eventType. Select an example below to see the fields for each event type.

title
required
string <= 200 characters

Short title for your moment

subHeader
string

Subheader displayed after the title

Array of objects (CreateMomentImageDto)

Array of images for the moment

Array of objects (CreateMomentVideoDto)

Array of videos for the moment

description
string <= 2000 characters

Description of the moment

customCalendarDescription
string

Custom description for calendar events (overrides default description)

isOnlineEvent
boolean
Default: false

Whether this is an online event

onlineEventUrl
string

Online event URL (required if isOnlineEvent is true)

venueOption
string or null
Enum: "to_be_determined" "multiple_locations" "private" "to_be_announced"

Venue option for offline events. When set to special values, venueId is not required.

venueId
string

Venue ID for the moment. Optional when isOnlineEvent is false (can be null if venueOption is set).

timezone
required
string
Enum: "UTC" "EST" "CST" "MST" "PST" "GMT" "CET" "EET" "JST" "CST_CHINA" "AEDT"

Timezone of the moment (short code). Must be one of the valid timezone keys.

startDate
required
string

Start date of the moment in YYYY-MM-DD format

endDate
required
string

End date of the moment in YYYY-MM-DD format. Must be >= startDate.

isAllDay
required
boolean
Default: false

Whether this is an all-day event

startTime
string

Start time in HH:mm or HH:mm:ss format. Required if isAllDay is false.

endTime
string

End time in HH:mm or HH:mm:ss format. Required if isAllDay is false.

reminders
Array of strings

Reminder settings for the moment (array of minute values)

tags
Array of strings

Tags for the moment

hashTags
Array of strings

Hashtags associated with the moment

eventUrl
string

External event URL (e.g., ticket purchase link, event registration)

isFeatured
boolean
Default: false

Whether the moment is featured

featureTitle
string

Feature title for featured moments. Can only be set if isFeatured is true.

featureCard
string
Enum: "XL" "Medium"

Feature card size for featured moments. Can only be set if isFeatured is true.

Array of objects (WidgetDataDto)

Widgets to attach to this moment. You can have multiple widgets of the same type (e.g., multiple SPONSOR widgets for multiple sponsors, or multiple STREAMING widgets for different platforms). Widgets are ordered by their position in the array.

eventType
required
string

Event type must be Game

opponentTeamId
string

Opponent team ID - references sports_teams.id (master sports team data). Optional - user must select opponent from sports_teams table. The opponent team's sportId must match the team's sportId. Opponent name and abbreviation will be automatically fetched from sports_teams table.

leagueContext
string

League context - taxonomy ID from league.context.* namespace (e.g., league.context.home, league.context.away, league.context.neutral). Optional - must be a valid taxonomy ID from the league.context namespace.

stage
string

Stage - taxonomy ID from systemwide.stage.* namespace (e.g., systemwide.stage.regular_season, systemwide.stage.playoffs, systemwide.stage.championship). Optional - must be a valid taxonomy ID from the systemwide.stage namespace.

streamingProviderIds
Array of strings

Array of streaming provider IDs

jerseyId
string
Deprecated

Jersey ID from context store - @deprecated This field is deprecated and may be removed in a future version

themeNightProfileId
string
Deprecated

Theme night profile ID - @deprecated This field is deprecated and may be removed in a future version

specialEntertainment
string
Deprecated

Special entertainment information - @deprecated This field is deprecated and may be removed in a future version

demand
string
Deprecated
Enum: "Low" "Medium" "Sell-Out"

Expected demand level for the game - @deprecated This field is deprecated and may be removed in a future version

Responses

Request samples

Content type
application/json
Example

Example payload for a Game event with sponsor and streaming widgets

{
  • "title": "Lakers vs Warriors",
  • "description": "Regular season game between Los Angeles Lakers and Golden State Warriors",
  • "eventType": "Game",
  • "isOnlineEvent": false,
  • "venueId": "550e8400-e29b-41d4-a716-446655440000",
  • "timezone": "America/Los_Angeles",
  • "startDate": "2024-01-15",
  • "endDate": "2024-01-15",
  • "isAllDay": false,
  • "startTime": "19:00",
  • "endTime": "22:00",
  • "opponentTeamId": "550e8400-e29b-41d4-a716-446655440001",
  • "leagueContext": "league.context.home",
  • "stage": "systemwide.stage.regular_season",
  • "streamingProviderIds": [
    ],
  • "images": [],
  • "videos": [],
  • "widgets": [
    ]
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Get all moments for a team

Retrieves all moments for the specified team with optional filtering using database-backed queries only. Supports include filter for archived moments and status filter for deleted moments. The user must be a member of the team.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
query Parameters
page
number
Default: 1
Example: page=1

Page number (starts from 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of results per page

orderBy
string
Example: orderBy=createdAt

Field to order by (e.g., createdAt, updatedAt)

orderDirection
string
Enum: "ASC" "DESC"
Example: orderDirection=DESC

Order direction

teamId
string
Example: teamId=123e4567-e89b-12d3-a456-426614174000

Filter moments by team ID

scheduleId
string
Example: scheduleId=123e4567-e89b-12d3-a456-426614174001

Filter moments by schedule ID

status
string
Enum: "draft" "published" "postponed" "cancelled" "deleted"
Example: status=published

Filter moments by status(es). Can be a single status or multiple statuses.

eventTypes
Array of strings
Items Enum: "Game" "Tournament" "Promotion" "Invitation" "Live Entertainment" "Entertainment" "Conference" "Fan Experience" "Merch Drops"

Filter moments by event type(s). Can be a single event type or multiple event types.

featureCards
Array of strings
Items Enum: "XL" "Medium"

Filter featured moments by feature card size(s). Can be a single size or multiple sizes.

include
Array of strings
Items Value: "isArchived"
Example: include=isArchived

Include archived moments. Accepts comma-separated values or array. Supported value: isArchived.

startDate
string
Example: startDate=2024-01-01T00:00:00Z

Filter moments where startDateTimeUtc >= this date (ISO 8601 UTC)

endDate
string
Example: endDate=2024-12-31T23:59:59Z

Filter moments where endDateTimeUtc <= this date (ISO 8601 UTC)

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Search moments for a team

Search moments for a specific team with filters (tags, text, status, dates, published). Returns full moment entities with cursor-based pagination. Requires team membership. Results sorted by startDateTimeUtc ASC.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

Request Body schema: application/json
required
limit
number <= 100
Default: 20

Number of results per page

cursor
string

Cursor for pagination (base64 encoded JSON with sort fields)

direction
string
Default: "forward"
Enum: "forward" "backward"

Pagination direction

query
string

Full-text search query (searches in title, description, location)

teamId
string

Filter by team ID

tags
Array of strings

Filter by tags (all tags must match)

status
Array of strings
Items Enum: "draft" "published" "postponed" "cancelled" "deleted"

Filter by one or more moment statuses (OR logic). Accepts a single status string or an array of statuses.

eventTypes
Array of strings
Items Enum: "Game" "Tournament" "Promotion" "Invitation" "Live Entertainment" "Entertainment" "Conference" "Fan Experience" "Merch Drops"

Filter by event types (OR logic)

featureCards
Array of strings
Items Enum: "XL" "Medium"

Filter by featured card sizes (OR logic). When provided, only featured moments are returned.

startDate
string

Filter by start date (earliest date the moment occurs)

endDate
string

Filter by end date (latest date the moment occurs)

timezone
string

Optional IANA timezone name (e.g., "America/New_York", "Europe/London") for time-based tag conversions. When provided, time-based tags like time.today, time.tomorrow will be calculated relative to this timezone. Should be obtained from browser Intl API or IANA timezone database.

Responses

Request samples

Content type
application/json
{
  • "limit": 20,
  • "cursor": "eyJzdGFydERhdGUiOiIyMDI0LTAxLTE1VDAwOjAwOjAwWiIsImlkIjoiMTIzIn0=",
  • "direction": "forward",
  • "query": "basketball game",
  • "teamId": "team-uuid-123",
  • "tags": [
    ],
  • "status": [
    ],
  • "eventTypes": [
    ],
  • "featureCards": [
    ],
  • "startDate": "2024-01-01",
  • "endDate": "2024-12-31",
  • "timezone": "America/New_York"
}

Response samples

Content type
application/json
{
  • "error": {
    }
}

Get the next upcoming moment

Returns the next upcoming moment for the team based on start time. Only returns PUBLISHED moments that are not completed. Returns null if no upcoming moments exist.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

query Parameters
eventType
string
Enum: "Game" "Tournament" "Promotion" "Invitation" "Live Entertainment" "Entertainment" "Conference" "Fan Experience" "Merch Drops"
Example: eventType=Game

Filter by event type

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Get a moment by ID

Retrieves a specific moment by its ID. The user must be a member of the team that owns the moment.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
momentId
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Update a moment

Update a moment with status validation and campaign creation on publish

Authorizations:
JWT-auth
path Parameters
teamId
required
string
momentId
required
string
Request Body schema: application/json
required

UpdateMomentDto - Data for updating an existing moment. The schema varies based on eventType.

title
string <= 200 characters

Short title for your moment

subHeader
string

Subheader displayed after the title

Array of objects (CreateMomentImageDto)

Array of images for the moment

Array of objects (CreateMomentVideoDto)

Array of videos for the moment

description
string <= 2000 characters

Description of the moment

customCalendarDescription
string

Custom description for calendar events (overrides default description)

isOnlineEvent
boolean
Default: false

Whether this is an online event

onlineEventUrl
string

Online event URL (required if isOnlineEvent is true)

venueOption
string or null
Enum: "to_be_determined" "multiple_locations" "private" "to_be_announced"

Venue option for offline events. When set to special values, venueId is not required.

venueId
string

Venue ID for the moment. Optional when isOnlineEvent is false (can be null if venueOption is set).

timezone
string
Enum: "UTC" "EST" "CST" "MST" "PST" "GMT" "CET" "EET" "JST" "CST_CHINA" "AEDT"

Timezone of the moment (short code). Must be one of the valid timezone keys.

startDate
string

Start date of the moment in YYYY-MM-DD format. If provided, endDate must also be provided.

endDate
string

End date of the moment in YYYY-MM-DD format. Must be >= startDate. If provided, startDate must also be provided.

isAllDay
boolean
Default: false

Whether this is an all-day event

startTime
string

Start time in HH:mm or HH:mm:ss format. Required if isAllDay is false.

endTime
string

End time in HH:mm or HH:mm:ss format. Required if isAllDay is false.

reminders
Array of strings

Reminder settings for the moment (array of minute values)

tags
Array of strings

Tags for the moment

hashTags
Array of strings

Hashtags associated with the moment

eventUrl
string

External event URL (e.g., ticket purchase link, event registration)

externalId
string

External ID from third-party systems (e.g., ESPN, Ticketmaster)

isOfficial
boolean

Whether the moment is from an official source (e.g., official website, official API)

isFeatured
boolean

Whether the moment is featured

featureTitle
string

Feature title for featured moments. Can only be set if isFeatured is true. Will be set to null if isFeatured is false.

featureCard
string
Enum: "XL" "Medium"

Feature card size for featured moments. Can only be set if isFeatured is true. Will be set to null if isFeatured is false.

Array of objects (WidgetDataDto)

Widgets to attach to this moment

opponentTeamId
string

Opponent team ID - references sports_teams.id (master sports team data). If provided, should reference a valid sports team from the sports_teams table. Opponent name and abbreviation will be automatically fetched from sports_teams table.

leagueContext
string

League context - taxonomy ID from league.context.* namespace (e.g., league.context.home, league.context.away, league.context.neutral). If provided, must be a valid taxonomy ID from the league.context namespace.

stage
string

Stage - taxonomy ID from systemwide.stage.* namespace (e.g., systemwide.stage.regular_season, systemwide.stage.playoffs, systemwide.stage.championship). If provided, must be a valid taxonomy ID from the systemwide.stage namespace.

streamingProviderIds
Array of strings

Array of streaming provider IDs

jerseyId
string
Deprecated

Jersey ID from context store - @deprecated This field is deprecated and may be removed in a future version

themeNightProfileId
string
Deprecated

Theme night profile ID - @deprecated This field is deprecated and may be removed in a future version

specialEntertainment
string
Deprecated

Special entertainment information - @deprecated This field is deprecated and may be removed in a future version

demand
string
Deprecated
Enum: "Low" "Medium" "Sell-Out"

Expected demand level for the game - @deprecated This field is deprecated and may be removed in a future version

Responses

Request samples

Content type
application/json
Example
{
  • "title": "Lakers vs Warriors",
  • "subHeader": "Regular Season Game",
  • "images": [],
  • "videos": [],
  • "description": "Regular season game between Los Angeles Lakers and Golden State Warriors",
  • "customCalendarDescription": "Join us for an exciting game! Doors open at 6 PM.",
  • "isOnlineEvent": false,
  • "onlineEventUrl": "https://zoom.us/j/123456789",
  • "venueOption": "to_be_determined",
  • "venueId": "venue-uuid",
  • "timezone": "EST",
  • "startDate": "2024-01-15",
  • "endDate": "2024-01-15",
  • "isAllDay": true,
  • "startTime": "19:00",
  • "endTime": "22:00",
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "externalId": "espn-game-401234567",
  • "isOfficial": true,
  • "isFeatured": false,
  • "featureTitle": "Featured Game of the Week",
  • "featureCard": "XL",
  • "widgets": [
    ],
  • "opponentTeamId": "sports-team-uuid",
  • "leagueContext": "league.context.home",
  • "stage": "systemwide.stage.regular_season",
  • "streamingProviderIds": [
    ],
  • "jerseyId": "jersey-uuid",
  • "themeNightProfileId": "theme-night-profile-uuid",
  • "specialEntertainment": "Live music performance by local band",
  • "demand": "Medium",
  • "eventType": "Game"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Delete a moment

Permanently delete a moment and all its associated data. This operation cannot be undone.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

momentId
required
string

Moment ID to delete

Responses

Update moment status

Update only the status of a moment with status validation and campaign creation on publish

Authorizations:
JWT-auth
path Parameters
teamId
required
string
momentId
required
string
Request Body schema: application/json
required

UpdateMomentStatusDto - Status update data

status
required
string
Enum: "draft" "published" "postponed" "cancelled" "deleted"

Status of the moment

publishDate
string

Publish date in YYYY-MM-DD format. Required when status is POSTPONED, especially when transitioning from DRAFT. This is the date when the moment should be published.

hardDelete
boolean
Default: false

When archiving a moment, if hardDelete=true, calls Consumer API delete with softDelete=false (hard delete). Only applies to ARCHIVED status. Default: no Consumer API call for ARCHIVED.

softDelete
boolean
Default: true

Soft delete flag when cancelling a moment. Optional, defaults to true. When false, calls Consumer API with softDelete=false (hard delete). Only applies to CANCELLED status.

userId
string

User ID for internal endpoints. Optional, defaults to system user if not provided.

Responses

Request samples

Content type
application/json
{
  • "status": "published",
  • "publishDate": "2024-02-15",
  • "hardDelete": false,
  • "softDelete": true,
  • "userId": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Archive a moment

Archives a moment by setting isArchived=true. Once archived, a moment cannot be unarchived. Archived moments are excluded from feeds and studio search, but remain accessible via campaigns and lists (FE can badge/hide). Archived moments remain in user calendars.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

momentId
required
string

Moment ID

Request Body schema: application/json
required

Archive status update

isArchived
required
boolean

Set to true to archive the moment. Once archived, a moment cannot be unarchived.

Responses

Request samples

Content type
application/json
{
  • "isArchived": true
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Create or update a draft version

Saves the provided fields as a draft version (upsert). eventType is always taken from the moment (immutable). startDateTimeUtc/endDateTimeUtc are computed server-side. Moment must be in PUBLISHED status.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

momentId
required
string

Moment ID

Request Body schema: application/json
required
title
required
string <= 200 characters

Title

description
string
customCalendarDescription
string
startDate
required
string

Start date (YYYY-MM-DD)

endDate
required
string

End date (YYYY-MM-DD)

startTime
string

Required when isAllDay is false

endTime
string

Required when isAllDay is false

timezone
required
string
Enum: "UTC" "America/New_York" "America/Chicago" "America/Denver" "America/Los_Angeles" "Europe/London" "Europe/Paris" "Europe/Berlin" "Asia/Tokyo" "Asia/Shanghai" "Australia/Sydney"

IANA timezone name

isAllDay
required
boolean
isOnlineEvent
required
boolean
onlineEventUrl
string

Required when isOnlineEvent is true

eventUrl
string
venueId
string <uuid>

Venue ID — server builds snapshot from it

eventData
object

Event-type-specific data (e.g. opponent, scores)

changeNote
string

Human-readable note about what changed

extras
object

Responses

Request samples

Content type
application/json
{
  • "title": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "startDate": "string",
  • "endDate": "string",
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "UTC",
  • "isAllDay": true,
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "eventUrl": "string",
  • "venueId": "ff212efe-8b09-4400-9323-a587c102bdd0",
  • "eventData": { },
  • "changeNote": "string",
  • "extras": { }
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "momentId": "string",
  • "versionNumber": null,
  • "isDraft": true,
  • "title": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "startDate": "string",
  • "endDate": "string",
  • "startTime": "string",
  • "endTime": "string",
  • "startDateTimeUtc": "string",
  • "endDateTimeUtc": "string",
  • "timezone": "string",
  • "isAllDay": true,
  • "venueSnapshot": { },
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "eventUrl": "string",
  • "eventType": "string",
  • "eventData": { },
  • "publishedBy": null,
  • "publishedAt": null,
  • "changeNote": "string",
  • "createdAt": "string",
  • "isCurrent": true
}

List all versions for a moment

Returns all versions for a moment. The draft version (if any) appears first with isDraft: true and versionNumber: null. Published versions follow, ordered by versionNumber DESC.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

momentId
required
string

Moment ID

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Publish a draft version

Promotes a draft version to a published snapshot. Assigns a version number, updates the moments table, and notifies subscribers.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

momentId
required
string

Moment ID

versionId
required
string

Draft version ID to publish

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "momentId": "string",
  • "versionNumber": null,
  • "isDraft": true,
  • "title": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "startDate": "string",
  • "endDate": "string",
  • "startTime": "string",
  • "endTime": "string",
  • "startDateTimeUtc": "string",
  • "endDateTimeUtc": "string",
  • "timezone": "string",
  • "isAllDay": true,
  • "venueSnapshot": { },
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "eventUrl": "string",
  • "eventType": "string",
  • "eventData": { },
  • "publishedBy": null,
  • "publishedAt": null,
  • "changeNote": "string",
  • "createdAt": "string",
  • "isCurrent": true
}

Get the latest published version

Returns the latest published (non-draft) version for a moment.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

momentId
required
string

Moment ID

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "momentId": "string",
  • "versionNumber": null,
  • "isDraft": true,
  • "title": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "startDate": "string",
  • "endDate": "string",
  • "startTime": "string",
  • "endTime": "string",
  • "startDateTimeUtc": "string",
  • "endDateTimeUtc": "string",
  • "timezone": "string",
  • "isAllDay": true,
  • "venueSnapshot": { },
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "eventUrl": "string",
  • "eventType": "string",
  • "eventData": { },
  • "publishedBy": null,
  • "publishedAt": null,
  • "changeNote": "string",
  • "createdAt": "string",
  • "isCurrent": true
}

Get a specific published version

Returns the full snapshot of a specific published version.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

momentId
required
string

Moment ID

versionId
required
string

Version ID

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "momentId": "string",
  • "versionNumber": null,
  • "isDraft": true,
  • "title": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "startDate": "string",
  • "endDate": "string",
  • "startTime": "string",
  • "endTime": "string",
  • "startDateTimeUtc": "string",
  • "endDateTimeUtc": "string",
  • "timezone": "string",
  • "isAllDay": true,
  • "venueSnapshot": { },
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "eventUrl": "string",
  • "eventType": "string",
  • "eventData": { },
  • "publishedBy": null,
  • "publishedAt": null,
  • "changeNote": "string",
  • "createdAt": "string",
  • "isCurrent": true
}

Parse moments from file

Submits a CSV/Excel file URL to the parser service for processing. Returns a job ID to track the parsing progress.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

Request Body schema: application/json
required
url
required
string

URL of the CSV/Excel file to parse

filename
string

Original filename (optional)

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "jobId": "550e8400-e29b-41d4-a716-446655440000",
  • "status": "processing"
}

Get parsing job status

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

jobId
required
string

Parsing job ID

Responses

Response samples

Content type
application/json
{
  • "jobId": "550e8400-e29b-41d4-a716-446655440000",
  • "status": "processing",
  • "parsedMomentsCount": 10,
  • "createdMomentsCount": 8,
  • "skippedMomentsCount": 2,
  • "skippedMomentIds": [
    ],
  • "erroredMomentsCount": 3,
  • "errorMessages": [
    ],
  • "momentIds": [
    ],
  • "venueIds": [
    ],
  • "errorMessage": "Invalid file format",
  • "createdAt": "2024-01-01T00:00:00.000Z",
  • "updatedAt": "2024-01-01T00:00:00.000Z"
}

Get parsed moments data

Retrieves the parsedData JSONB field from a parsing job. Returns null if no parsed data exists yet.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

jobId
required
string

Parsing job ID

Responses

Response samples

Content type
application/json
{ }

Patch parsed moments data

Updates only the schedules in parsedData, preserving existing metadata (file, summary, validation). Only allowed when status is PENDING or PARSED.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

jobId
required
string

Parsing job ID

Request Body schema: application/json
required
required
Array of objects (ParsedScheduleDto)

Array of schedules with moments to update

Responses

Request samples

Content type
application/json
{
  • "schedules": [
    ]
}

Response samples

Content type
application/json
{
  • "jobId": "550e8400-e29b-41d4-a716-446655440000",
  • "status": "processing",
  • "parsedMomentsCount": 10,
  • "createdMomentsCount": 8,
  • "skippedMomentsCount": 2,
  • "skippedMomentIds": [
    ],
  • "erroredMomentsCount": 3,
  • "errorMessages": [
    ],
  • "momentIds": [
    ],
  • "venueIds": [
    ],
  • "errorMessage": "Invalid file format",
  • "createdAt": "2024-01-01T00:00:00.000Z",
  • "updatedAt": "2024-01-01T00:00:00.000Z"
}

Trigger moment creation from parsed data

Triggers Cloud Run Job to create moments from parsed data. Fetches latest data from parser API if needed. Job must be in PARSED status or have parsed data available.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

jobId
required
string

Parsing job ID

Responses

Response samples

Content type
application/json
{
  • "jobId": "550e8400-e29b-41d4-a716-446655440000",
  • "status": "processing",
  • "parsedMomentsCount": 10,
  • "createdMomentsCount": 8,
  • "skippedMomentsCount": 2,
  • "skippedMomentIds": [
    ],
  • "erroredMomentsCount": 3,
  • "errorMessages": [
    ],
  • "momentIds": [
    ],
  • "venueIds": [
    ],
  • "errorMessage": "Invalid file format",
  • "createdAt": "2024-01-01T00:00:00.000Z",
  • "updatedAt": "2024-01-01T00:00:00.000Z"
}

Meta Datas

Get all available event types with taxonomy mapping

Responses

Response samples

Content type
application/json
[
  • {
    }
]

MetaController_getTimezones

Responses

MetaController_getReminderOptions

Responses

MetaController_getHourlyReminders

Responses

MetaController_getDailyReminders

Responses

Internal - Moments

Create a new moment (Internal)

Internal endpoint to create a moment without user authentication. For system use only. Accepts event-specific fields based on eventType.

Request Body schema: application/json
required

Moment creation data. Can include event-specific fields (opponent, price, url, etc.) based on eventType.

title
required
string <= 200 characters

Short title for your moment

subHeader
string

Subheader displayed after the title

Array of objects (CreateMomentImageDto)

Array of images for the moment

Array of objects (CreateMomentVideoDto)

Array of videos for the moment

description
string <= 2000 characters

Description of the moment

customCalendarDescription
string

Custom description for calendar events (overrides default description)

eventType
required
string
Enum: "Game" "Tournament" "Promotion" "Invitation" "Live Entertainment" "Entertainment" "Conference" "Fan Experience" "Merch Drops"
  Event type of the moment. Game, Tournament, Promotion, Invitation, Live Entertainment, Entertainment, Conference, Fan Experience, Merch Drops
isOnlineEvent
boolean
Default: false

Whether this is an online event

onlineEventUrl
string

Online event URL (required if isOnlineEvent is true)

venueOption
string or null
Enum: "to_be_determined" "multiple_locations" "private" "to_be_announced"

Venue option for offline events. When set to special values, venueId is not required.

venueId
string

Venue ID for the moment. Optional when isOnlineEvent is false (can be null if venueOption is set).

timezone
required
string
Enum: "UTC" "EST" "CST" "MST" "PST" "GMT" "CET" "EET" "JST" "CST_CHINA" "AEDT"

Timezone of the moment (short code). Must be one of the valid timezone keys.

startDate
required
string

Start date of the moment in YYYY-MM-DD format

endDate
required
string

End date of the moment in YYYY-MM-DD format. Must be >= startDate.

isAllDay
required
boolean
Default: false

Whether this is an all-day event

startTime
string

Start time in HH:mm or HH:mm:ss format. Required if isAllDay is false.

endTime
string

End time in HH:mm or HH:mm:ss format. Required if isAllDay is false.

reminders
Array of strings

Reminder settings for the moment (array of minute values)

tags
Array of strings

Tags for the moment

hashTags
Array of strings

Hashtags associated with the moment

eventUrl
string

External event URL (e.g., ticket purchase link, event registration)

isFeatured
boolean
Default: false

Whether the moment is featured

featureTitle
string

Feature title for featured moments. Can only be set if isFeatured is true.

featureCard
string
Enum: "XL" "Medium"

Feature card size for featured moments. Can only be set if isFeatured is true.

Array of objects (WidgetDataDto)

Widgets to attach to this moment. You can have multiple widgets of the same type (e.g., multiple SPONSOR widgets for multiple sponsors, or multiple STREAMING widgets for different platforms). Widgets are ordered by their position in the array.

teamId
required
string

Team ID that the moment belongs to

scheduleId
string

Schedule ID that the moment belongs to (optional)

createdBy
string

User ID who is creating the moment (UUID). Optional for automated syncs.

externalId
string

External ID from third-party systems (e.g., ESPN, Ticketmaster)

externalSource
string

External source system that provided this moment (e.g., aggregator, espn)

isOfficial
boolean
Default: false

Whether the moment is from an official source (e.g., official website, official API)

fixtureChecksum
string

MD5 checksum of fixture data for change detection (used by fixture sync)

Responses

Request samples

Content type
application/json
{
  • "title": "Lakers vs Warriors",
  • "subHeader": "Regular Season Game",
  • "images": [],
  • "videos": [],
  • "description": "Regular season game between Los Angeles Lakers and Golden State Warriors",
  • "customCalendarDescription": "Join us for an exciting game! Doors open at 6 PM.",
  • "eventType": "Game",
  • "isOnlineEvent": false,
  • "onlineEventUrl": "https://zoom.us/j/123456789",
  • "venueOption": "to_be_determined",
  • "venueId": "venue-uuid",
  • "timezone": "UTC",
  • "startDate": "2024-01-15",
  • "endDate": "2024-01-15",
  • "isAllDay": true,
  • "startTime": "19:00",
  • "endTime": "22:00",
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "isFeatured": false,
  • "featureTitle": "Featured Game of the Week",
  • "featureCard": "XL",
  • "widgets": [
    ],
  • "teamId": "550e8400-e29b-41d4-a716-446655440000",
  • "scheduleId": "660e8400-e29b-41d4-a716-446655440001",
  • "createdBy": "550e8400-e29b-41d4-a716-446655440000",
  • "externalId": "espn-game-401234567",
  • "externalSource": "aggregator",
  • "isOfficial": true,
  • "fixtureChecksum": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Get moments by IDs (Internal)

Internal endpoint to get moment data by IDs. Returns type-specific response DTO based on eventType, same format as /api/v1/internal/moments/by-slug/{momentSlug}.

Request Body schema: application/json
required
ids
required
Array of strings

Array of entity IDs

Responses

Request samples

Content type
application/json
{
  • "ids": [
    ]
}

Response samples

Content type
application/json
[
  • {
    }
]

Update a moment (Internal)

Internal endpoint to update a moment without user authentication. For system use only.

path Parameters
momentId
required
string
Request Body schema: application/json
required

UpdateMomentDto - Data for updating an existing moment

title
string <= 200 characters

Short title for your moment

subHeader
string

Subheader displayed after the title

Array of objects (CreateMomentImageDto)

Array of images for the moment

Array of objects (CreateMomentVideoDto)

Array of videos for the moment

description
string <= 2000 characters

Description of the moment

customCalendarDescription
string

Custom description for calendar events (overrides default description)

isOnlineEvent
boolean
Default: false

Whether this is an online event

onlineEventUrl
string

Online event URL (required if isOnlineEvent is true)

venueOption
string or null
Enum: "to_be_determined" "multiple_locations" "private" "to_be_announced"

Venue option for offline events. When set to special values, venueId is not required.

venueId
string

Venue ID for the moment. Optional when isOnlineEvent is false (can be null if venueOption is set).

timezone
string
Enum: "UTC" "EST" "CST" "MST" "PST" "GMT" "CET" "EET" "JST" "CST_CHINA" "AEDT"

Timezone of the moment (short code). Must be one of the valid timezone keys.

startDate
string

Start date of the moment in YYYY-MM-DD format. If provided, endDate must also be provided.

endDate
string

End date of the moment in YYYY-MM-DD format. Must be >= startDate. If provided, startDate must also be provided.

isAllDay
boolean
Default: false

Whether this is an all-day event

startTime
string

Start time in HH:mm or HH:mm:ss format. Required if isAllDay is false.

endTime
string

End time in HH:mm or HH:mm:ss format. Required if isAllDay is false.

reminders
Array of strings

Reminder settings for the moment (array of minute values)

tags
Array of strings

Tags for the moment

hashTags
Array of strings

Hashtags associated with the moment

eventUrl
string

External event URL (e.g., ticket purchase link, event registration)

externalId
string

External ID from third-party systems (e.g., ESPN, Ticketmaster)

isOfficial
boolean

Whether the moment is from an official source (e.g., official website, official API)

isFeatured
boolean

Whether the moment is featured

featureTitle
string

Feature title for featured moments. Can only be set if isFeatured is true. Will be set to null if isFeatured is false.

featureCard
string
Enum: "XL" "Medium"

Feature card size for featured moments. Can only be set if isFeatured is true. Will be set to null if isFeatured is false.

Array of objects (WidgetDataDto)

Widgets to attach to this moment

Responses

Request samples

Content type
application/json
{
  • "title": "Lakers vs Warriors",
  • "subHeader": "Regular Season Game",
  • "images": [],
  • "videos": [],
  • "description": "Regular season game between Los Angeles Lakers and Golden State Warriors",
  • "customCalendarDescription": "Join us for an exciting game! Doors open at 6 PM.",
  • "isOnlineEvent": false,
  • "onlineEventUrl": "https://zoom.us/j/123456789",
  • "venueOption": "to_be_determined",
  • "venueId": "venue-uuid",
  • "timezone": "EST",
  • "startDate": "2024-01-15",
  • "endDate": "2024-01-15",
  • "isAllDay": true,
  • "startTime": "19:00",
  • "endTime": "22:00",
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "externalId": "espn-game-401234567",
  • "isOfficial": true,
  • "isFeatured": false,
  • "featureTitle": "Featured Game of the Week",
  • "featureCard": "XL",
  • "widgets": [
    ]
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Delete a moment (Internal)

Permanently delete a moment without authentication. Internal use only.

path Parameters
momentId
required
string

Moment ID to delete

Responses

Update moment status (Internal)

Internal endpoint to update moment status without user authentication. For system use only.

path Parameters
momentId
required
string
Request Body schema: application/json
required

UpdateMomentStatusDto - Status update data

status
required
string
Enum: "draft" "published" "postponed" "cancelled" "deleted"

Status of the moment

publishDate
string

Publish date in YYYY-MM-DD format. Required when status is POSTPONED, especially when transitioning from DRAFT. This is the date when the moment should be published.

hardDelete
boolean
Default: false

When archiving a moment, if hardDelete=true, calls Consumer API delete with softDelete=false (hard delete). Only applies to ARCHIVED status. Default: no Consumer API call for ARCHIVED.

softDelete
boolean
Default: true

Soft delete flag when cancelling a moment. Optional, defaults to true. When false, calls Consumer API with softDelete=false (hard delete). Only applies to CANCELLED status.

userId
string

User ID for internal endpoints. Optional, defaults to system user if not provided.

Responses

Request samples

Content type
application/json
{
  • "status": "published",
  • "publishDate": "2024-02-15",
  • "hardDelete": false,
  • "softDelete": true,
  • "userId": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Get moment by team slug and moment team slug (Internal)

Internal endpoint to get a moment by its team slug and the team slug. Uses teamSlug (team slug) and momentSlug (moment teamSlug). Returns type-specific response DTO based on eventType.

path Parameters
teamSlug
required
string
Example: lakers

Team slug

momentSlug
required
string
Example: lakers-vs-warriors

Moment team slug (teamSlug field)

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Get moment by global slug (Internal)

Internal endpoint to get a moment by its unique global slug. The slug is unique across all teams and always includes the full date (YYYY-MM-DD). Returns type-specific response DTO based on eventType.

path Parameters
momentSlug
required
string
Example: 2024-03-15-lakers-vs-warriors-1234

Moment global slug (unique across all teams)

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Publish POSTPONED moments (Internal)

Internal endpoint to automatically publish POSTPONED moments where publishDate is less than or equal to today. Uses the publisherId saved when the moment was postponed. Returns the number of moments updated.

Responses

Response samples

Content type
application/json
{
  • "updated": 5,
  • "momentIds": [
    ]
}

Publish scheduled POSTPONED moments (Internal)

Internal endpoint to automatically publish POSTPONED moments whose scheduled publish datetime (publishedAt) is due within the provided windowMinutes (default 1). Includes overdue moments.

query Parameters
windowMinutes
number
Example: windowMinutes=1

How many minutes ahead to publish (default: 1)

Responses

Response samples

Content type
application/json
{
  • "checked": 3,
  • "published": 2,
  • "momentIds": [
    ]
}

Mark published moments as completed (Internal)

Internal endpoint to automatically mark PUBLISHED moments as completed when their endDateTimeUtc + bufferHours has passed. Default buffer is 6 hours.

query Parameters
bufferHours
number
Example: bufferHours=6

Buffer time in hours after endDateTimeUtc (default: 6)

Responses

Response samples

Content type
application/json
{
  • "checked": 10,
  • "marked": 8,
  • "momentIds": [
    ]
}

Archive expired moments (Internal)

Internal endpoint to automatically archive PUBLISHED and DRAFT moments when their endDateTimeUtc + bufferDays has passed. Default buffer is 14 days.

query Parameters
bufferDays
number
Example: bufferDays=14

Buffer time in days after endDateTimeUtc (default: 14)

Responses

Response samples

Content type
application/json
{
  • "checked": 10,
  • "archived": 8,
  • "momentIds": [
    ],
  • "skipped": [
    ]
}

Set scheduled publish datetime for a POSTPONED moment (Internal)

Internal helper endpoint to set Moment.publishedAt while status is POSTPONED. Intended for scheduler/integration/testing setup.

path Parameters
momentId
required
string
Request Body schema: application/json
required
scheduledPublishAt
required
string

Scheduled publish datetime in ISO8601 (UTC recommended), e.g. 2026-01-01T00:02:00.000Z

userId
string

User ID to attribute the schedule action to (optional; defaults to system user if not provided).

Responses

Request samples

Content type
application/json
{
  • "scheduledPublishAt": "2026-01-01T00:02:00.000Z",
  • "userId": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "subHeader": "string",
  • "slug": "string",
  • "teamSlug": "string",
  • "description": "string",
  • "customCalendarDescription": "string",
  • "eventType": "Game",
  • "startDate": "string",
  • "endDate": "string",
  • "isAllDay": true,
  • "startTime": "string",
  • "endTime": "string",
  • "timezone": "string",
  • "startDateTimeUtc": "2024-01-15T12:00:00.000Z",
  • "endDateTimeUtc": "2024-01-15T15:00:00.000Z",
  • "isOnlineEvent": true,
  • "onlineEventUrl": "string",
  • "venueId": "string",
  • "venueOption": "to_be_determined",
  • "venue": {
    },
  • "isRecurring": true,
  • "reminders": [
    ],
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "images": [],
  • "videos": [],
  • "eventUrl": "string",
  • "externalId": "string",
  • "status": "draft",
  • "teamId": "string",
  • "createdBy": "string",
  • "publishedBy": "string",
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "publishDate": "string",
  • "isOfficial": false,
  • "isFeatured": false,
  • "isCompleted": false,
  • "isArchived": false,
  • "featureTitle": "string",
  • "featureCard": "XL",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "widgets": [
    ],
  • "defaultCampaignId": "string",
  • "hasUnpublishedChanges": false,
  • "currentPublishedVersionId": "string"
}

Search moments (Internal)

Internal endpoint to search moments for a specific team with filters (tags, text, status, dates, published). Use /by-team/:teamId/search for team ID (UUID) or /by-team-slug/:teamSlug/search for team slug. Returns full moment entities with cursor-based pagination. No authentication required. Results sorted by startDateTimeUtc ASC.

path Parameters
teamId
string

Team ID (UUID) - used when calling /by-team/:teamId/search

teamSlug
string

Team Slug - used when calling /by-team-slug/:teamSlug/search

Request Body schema: application/json
required
limit
number <= 100
Default: 20

Number of results per page

cursor
string

Cursor for pagination (base64 encoded JSON with sort fields)

direction
string
Default: "forward"
Enum: "forward" "backward"

Pagination direction

query
string

Full-text search query (searches in title, description, location)

teamId
string

Filter by team ID

tags
Array of strings

Filter by tags (all tags must match)

status
Array of strings
Items Enum: "draft" "published" "postponed" "cancelled" "deleted"

Filter by one or more moment statuses (OR logic). Accepts a single status string or an array of statuses.

eventTypes
Array of strings
Items Enum: "Game" "Tournament" "Promotion" "Invitation" "Live Entertainment" "Entertainment" "Conference" "Fan Experience" "Merch Drops"

Filter by event types (OR logic)

featureCards
Array of strings
Items Enum: "XL" "Medium"

Filter by featured card sizes (OR logic). When provided, only featured moments are returned.

startDate
string

Filter by start date (earliest date the moment occurs)

endDate
string

Filter by end date (latest date the moment occurs)

timezone
string

Optional IANA timezone name (e.g., "America/New_York", "Europe/London") for time-based tag conversions. When provided, time-based tags like time.today, time.tomorrow will be calculated relative to this timezone. Should be obtained from browser Intl API or IANA timezone database.

Responses

Request samples

Content type
application/json
{
  • "limit": 20,
  • "cursor": "eyJzdGFydERhdGUiOiIyMDI0LTAxLTE1VDAwOjAwOjAwWiIsImlkIjoiMTIzIn0=",
  • "direction": "forward",
  • "query": "basketball game",
  • "teamId": "team-uuid-123",
  • "tags": [
    ],
  • "status": [
    ],
  • "eventTypes": [
    ],
  • "featureCards": [
    ],
  • "startDate": "2024-01-01",
  • "endDate": "2024-12-31",
  • "timezone": "America/New_York"
}

Response samples

Content type
application/json
{
  • "error": {
    }
}

Moments Lists

Create a new moments list

Creates a new moments list

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Request Body schema: application/json
required
type
required
string
Enum: "schedule" "collection" "playlist"

Type of the list (Schedule, Collection, or Playlist)

title
required
string <= 200 characters

Title of the list

subTitle
string <= 150 characters

Sub-heading of the list

description
string <= 2000 characters

Short, snappy description of the list

hashTags
Array of strings

Hashtags associated with the list

Responses

Request samples

Content type
application/json
{
  • "type": "schedule",
  • "title": "2024-2025 Regular Season Schedule",
  • "subTitle": "Enter a sub-heading",
  • "description": "Write a short, snappy description.",
  • "hashTags": [
    ]
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get team lists

Retrieves all lists for a specific team with tags

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Update a list

Update a list with status validation and campaign creation on publish

Authorizations:
JWT-auth
path Parameters
teamId
required
string
listId
required
string
Request Body schema: application/json
required

List update data

type
string
Enum: "schedule" "collection" "playlist"

Type of the list (Schedule, Collection, or Playlist)

title
string <= 200 characters

Title of the list

subTitle
string <= 150 characters

Sub-heading of the list

description
string <= 2000 characters

Short, snappy description of the list

hashTags
Array of strings

Hashtags associated with the list

images
Array of strings

Array of image URLs for the list

videos
Array of strings

Array of video URLs for the list

tags
Array of strings

Array of tag names to associate with the list

Array of objects (WidgetDataDto)

Widgets to attach to this list. You can have multiple widgets of the same type (e.g., multiple SPONSOR widgets for multiple sponsors, or multiple STREAMING widgets for different platforms). Widgets are ordered by their position in the array.

Responses

Request samples

Content type
application/json
{
  • "type": "schedule",
  • "title": "2024-2025 Regular Season Schedule",
  • "subTitle": "Enter a sub-heading",
  • "description": "Write a short, snappy description.",
  • "hashTags": [
    ],
  • "tags": [
    ],
  • "widgets": [
    ]
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "title": "string",
  • "subTitle": "string",
  • "description": "string",
  • "slug": "string",
  • "images": [
    ],
  • "videos": [
    ],
  • "type": "schedule",
  • "status": "draft",
  • "startDate": "2019-08-24T14:15:22Z",
  • "endDate": "2019-08-24T14:15:22Z",
  • "timezone": "string",
  • "metadata": { },
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "widgets": [
    ],
  • "moments": [
    ],
  • "defaultCampaignId": "string",
  • "isOfficial": false
}

Get list by ID

Retrieves a specific list by its ID

Authorizations:
JWT-auth
path Parameters
teamId
required
string
listId
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "title": "string",
  • "subTitle": "string",
  • "description": "string",
  • "slug": "string",
  • "images": [
    ],
  • "videos": [
    ],
  • "type": "schedule",
  • "status": "draft",
  • "startDate": "2019-08-24T14:15:22Z",
  • "endDate": "2019-08-24T14:15:22Z",
  • "timezone": "string",
  • "metadata": { },
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "widgets": [
    ],
  • "moments": [
    ],
  • "defaultCampaignId": "string",
  • "isOfficial": false
}

Update the status of a list

Update the status of a list

Authorizations:
JWT-auth
path Parameters
teamId
required
string
listId
required
string
Request Body schema: application/json
required

List status update data

status
required
string
Enum: "draft" "published" "postponed" "archived"

Status of the list

publishDatetime
string

Publish datetime in ISO 8601 format (e.g., 2024-02-15T10:00:00Z or 2024-02-15T10:00:00.000Z). Required when status is POSTPONED, especially when transitioning from DRAFT. This is the datetime when the list should be published.

Responses

Request samples

Content type
application/json
{
  • "status": "published",
  • "publishDatetime": "2024-02-15T10:00:00Z"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "title": "string",
  • "subTitle": "string",
  • "description": "string",
  • "slug": "string",
  • "images": [
    ],
  • "videos": [
    ],
  • "type": "schedule",
  • "status": "draft",
  • "startDate": "2019-08-24T14:15:22Z",
  • "endDate": "2019-08-24T14:15:22Z",
  • "timezone": "string",
  • "metadata": { },
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "widgets": [
    ],
  • "moments": [
    ],
  • "defaultCampaignId": "string",
  • "isOfficial": false
}

Add moments to a list

Adds one or more moments to an existing list

Authorizations:
JWT-auth
path Parameters
teamId
required
string
listId
required
string
Request Body schema: application/json
required
momentIds
required
Array of strings

Array of moment IDs to add to the list

Responses

Request samples

Content type
application/json
{
  • "momentIds": [
    ]
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "title": "string",
  • "subTitle": "string",
  • "description": "string",
  • "slug": "string",
  • "images": [
    ],
  • "videos": [
    ],
  • "type": "schedule",
  • "status": "draft",
  • "startDate": "2019-08-24T14:15:22Z",
  • "endDate": "2019-08-24T14:15:22Z",
  • "timezone": "string",
  • "metadata": { },
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "widgets": [
    ],
  • "moments": [
    ],
  • "defaultCampaignId": "string",
  • "isOfficial": false
}

Get moments in a list

Retrieves all moments in a list with basic information. Optionally includes tags if include=tags is specified.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
listId
required
string
query Parameters
include
string
Example: include=tags

Comma-separated list of related resources to include. Currently supports: "tags"

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Remove a moment from a list

Hard deletes the association between a moment and a list. The moment itself is not deleted, only the association.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
listId
required
string
momentId
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Internal - Moments Lists

List lists (Internal)

Internal endpoint to retrieve a paginated list of lists. Optionally filter by teamId. Results are ordered by createdAt DESC by default.

query Parameters
page
number
Default: 1
Example: page=1

Page number (default: 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of items per page (default: 20, max: 100)

orderBy
string
Example: orderBy=createdAt

Field to order by (default: createdAt)

orderDirection
string
Enum: "ASC" "DESC"

Order direction (default: DESC)

teamId
string
Example: teamId=123e4567-e89b-12d3-a456-426614174000

Filter lists by team ID

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Create a new list (Internal)

Internal endpoint to create a list without user authentication. For system use only.

Request Body schema: application/json
required
type
required
string
Enum: "schedule" "collection" "playlist"

Type of the list (Schedule, Collection, or Playlist)

title
required
string <= 200 characters

Title of the list

subTitle
string <= 150 characters

Sub-heading of the list

description
string <= 2000 characters

Short, snappy description of the list

hashTags
Array of strings

Hashtags associated with the list

teamId
required
string

Team ID that the schedule belongs to

createdBy
required
string

User ID who is creating the schedule (UUID)

Responses

Request samples

Content type
application/json
{
  • "type": "schedule",
  • "title": "2024-2025 Regular Season Schedule",
  • "subTitle": "Enter a sub-heading",
  • "description": "Write a short, snappy description.",
  • "hashTags": [
    ],
  • "teamId": "550e8400-e29b-41d4-a716-446655440000",
  • "createdBy": "550e8400-e29b-41d4-a716-446655440000"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "title": "string",
  • "subTitle": "string",
  • "description": "string",
  • "slug": "string",
  • "images": [
    ],
  • "videos": [
    ],
  • "type": "schedule",
  • "status": "draft",
  • "startDate": "2019-08-24T14:15:22Z",
  • "endDate": "2019-08-24T14:15:22Z",
  • "timezone": "string",
  • "metadata": { },
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "widgets": [
    ],
  • "moments": [
    ],
  • "defaultCampaignId": "string",
  • "isOfficial": false
}

Get list by team slug and list team slug (Internal)

Internal endpoint to get a list by its team slug and the team slug. Uses teamSlug (team slug) and listSlug (list teamSlug). Returns list response DTO with tags and widgets. Optionally includes moments if include=moments is specified.

path Parameters
teamSlug
required
string
Example: lakers

Team slug

listSlug
required
string
Example: regular-season-2024

List team slug (teamSlug field)

query Parameters
include
string
Example: include=moments

Comma-separated list of related resources to include. Currently supports: "moments"

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "title": "string",
  • "subTitle": "string",
  • "description": "string",
  • "slug": "string",
  • "images": [
    ],
  • "videos": [
    ],
  • "type": "schedule",
  • "status": "draft",
  • "startDate": "2019-08-24T14:15:22Z",
  • "endDate": "2019-08-24T14:15:22Z",
  • "timezone": "string",
  • "metadata": { },
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "widgets": [
    ],
  • "moments": [
    ],
  • "defaultCampaignId": "string",
  • "isOfficial": false
}

Get list by global slug (Internal)

Internal endpoint to get a list by its unique global slug. The slug is unique across all teams. Returns list response DTO with tags and widgets. Optionally includes moments if include=moments is specified.

path Parameters
listSlug
required
string
Example: lakers-regular-season-2024

List global slug (unique across all teams)

query Parameters
include
string
Example: include=moments

Comma-separated list of related resources to include. Currently supports: "moments"

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "title": "string",
  • "subTitle": "string",
  • "description": "string",
  • "slug": "string",
  • "images": [
    ],
  • "videos": [
    ],
  • "type": "schedule",
  • "status": "draft",
  • "startDate": "2019-08-24T14:15:22Z",
  • "endDate": "2019-08-24T14:15:22Z",
  • "timezone": "string",
  • "metadata": { },
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "widgets": [
    ],
  • "moments": [
    ],
  • "defaultCampaignId": "string",
  • "isOfficial": false
}

Get list by ID (Internal)

Internal endpoint to get a list by its unique ID. Returns list response DTO with tags and widgets. Optionally includes moments if include=moments is specified.

path Parameters
listId
required
string
Example: 123e4567-e89b-12d3-a456-426614174000

List ID (UUID)

query Parameters
include
string
Example: include=moments

Comma-separated list of related resources to include. Currently supports: "moments"

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "teamId": "string",
  • "title": "string",
  • "subTitle": "string",
  • "description": "string",
  • "slug": "string",
  • "images": [
    ],
  • "videos": [
    ],
  • "type": "schedule",
  • "status": "draft",
  • "startDate": "2019-08-24T14:15:22Z",
  • "endDate": "2019-08-24T14:15:22Z",
  • "timezone": "string",
  • "metadata": { },
  • "publishedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "tags": [
    ],
  • "hashTags": [
    ],
  • "widgets": [
    ],
  • "moments": [
    ],
  • "defaultCampaignId": "string",
  • "isOfficial": false
}

Publish scheduled POSTPONED lists (Internal)

Internal endpoint to automatically publish POSTPONED lists whose scheduled publish datetime (publishedAt) is due within the provided windowMinutes (default 1). Includes overdue lists. Keeps strict validation that blocks publish if any child moments are not published.

query Parameters
windowMinutes
number
Example: windowMinutes=1

How many minutes ahead to publish (default: 1)

Responses

Response samples

Content type
application/json
{
  • "checked": 3,
  • "published": 2,
  • "listIds": [
    ],
  • "skipped": [
    ]
}

Stats

Get counts of moments and lists by state within a date range

Returns counts of unique moments and lists that were in each state at any point during the specified date range. This includes entities that: (1) entered the state during the range, (2) were already in the state before the range started, or (3) exited the state during the range. An entity is counted if it was in the target state for any portion of the date range.

Authorizations:
JWT-auth
path Parameters
teamId
required
string

Team ID

query Parameters
startDate
required
string
Example: startDate=2024-01-01

Start date (YYYY-MM-DD)

endDate
required
string
Example: endDate=2024-01-31

End date (YYYY-MM-DD)

entityType
string
Enum: "moment" "list"

Filter by entity type (moment or list)

targetState
string
Example: targetState=published

Filter by target state (e.g., published, draft). Returns only counts for this specific state.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Streaming Partners

Search streaming partners for typeahead dropdown

Searches streaming partners by name (case-insensitive) for typeahead functionality. Returns list of matching streaming partners. If query is not provided, returns all streaming partners.

Authorizations:
JWT-auth
query Parameters
query
string >= 2 characters
Example: query=Netflix

Optional search query string (minimum 2 characters if provided). If not provided, returns all streaming partners.

Responses

Response samples

Content type
application/json
{}

Get streaming partner by ID

Retrieves a specific streaming partner by its unique identifier

Authorizations:
JWT-auth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{}

Internal - Streaming Partners

List streaming partners (Internal)

Internal endpoint to retrieve a paginated list of streaming partners. No authentication required.

query Parameters
page
number
Default: 1
Example: page=1

Page number (default: 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of items per page (default: 20, max: 100)

orderBy
string
Example: orderBy=name

Field to order by (default: name)

orderDirection
string
Enum: "ASC" "DESC"

Order direction (default: ASC)

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Create a new streaming partner (Internal)

Internal API - Creates a new streaming partner. Domain and brandId must be unique. and coming from BRANDFETCH API.

Request Body schema: application/json
required
domain
required
string <= 255 characters

Website domain

website
string <= 512 characters

Website URL (defaults to domain if not provided)

name
required
string <= 255 characters

Streaming partner name

icon
string <= 512 characters

URL to the streaming partner icon

brandId
string <= 255 characters

Brand ID from external source (e.g., Brandfetch)

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Update a streaming partner (Internal)

Internal API - Updates an existing streaming partner. Can update isActive status.

path Parameters
id
required
string
Request Body schema: application/json
required
isActive
boolean

Whether the streaming partner is active

Responses

Request samples

Content type
application/json
{
  • "isActive": false
}

Response samples

Content type
application/json
{}

Sponsor Roles

Search sponsor roles for typeahead dropdown

Searches sponsor roles by title or key (case-insensitive) for typeahead functionality. Returns list of matching sponsor roles (only active roles). If query is not provided, returns all active sponsor roles.

Authorizations:
JWT-auth
query Parameters
query
string >= 2 characters
Example: query=Official

Optional search query string (minimum 2 characters if provided). If not provided, returns all active sponsor roles.

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": [
    ]
}

Internal - Sponsor Roles

Get sponsor roles (Internal)

Get sponsor roles. Default behavior (isActive=true) returns only active roles. Set isActive=false to get all roles (both active and inactive).

query Parameters
isActive
boolean
Example: isActive=true

Filter by active status. Default: true (only active roles). Set to false to get all roles (active and inactive).

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a new sponsor role (Internal)

Internal API - Creates a new sponsor role. Key must be unique and lowercase alphanumeric with underscores only.

Request Body schema: application/json
required
key
required
string <= 100 characters

Unique key for the sponsor role (lowercase, underscores allowed)

title
required
string <= 100 characters

Role title

description
string

Role description

isActive
required
boolean
Default: true

Whether the role is active

Responses

Request samples

Content type
application/json
{
  • "key": "primary",
  • "title": "Primary Sponsor",
  • "description": "Primary sponsor with exclusive branding rights",
  • "isActive": true
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get sponsor role by key (Internal)

path Parameters
key
required
string

Responses

Response samples

Content type
application/json
{
  • "key": "string",
  • "title": "string",
  • "description": "string",
  • "isActive": true
}

Update a sponsor role (Internal)

Internal API - Updates an existing sponsor role. Can update title, description, and isActive status.

path Parameters
key
required
string
Request Body schema: application/json
required
title
string <= 100 characters

Role title

description
string

Role description

isActive
boolean

Whether the role is active

Responses

Request samples

Content type
application/json
{
  • "title": "Primary Sponsor",
  • "description": "Primary sponsor with exclusive branding rights",
  • "isActive": false
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Sponsor Partners

Search sponsor partners for typeahead dropdown

Searches sponsor partners by name or shortName (case-insensitive) for typeahead functionality. Returns list of matching sponsor partners. If query is not provided, returns all sponsor partners.

Authorizations:
JWT-auth
query Parameters
query
string >= 2 characters
Example: query=Nike

Optional search query string (minimum 2 characters if provided). If not provided, returns all sponsor partners.

Responses

Response samples

Content type
application/json
{}

Internal - Sponsor Partners

List sponsor partners (Internal)

Internal endpoint to retrieve a paginated list of sponsor partners. No authentication required.

query Parameters
page
number
Default: 1
Example: page=1

Page number (default: 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of items per page (default: 20, max: 100)

orderBy
string
Example: orderBy=name

Field to order by (default: name)

orderDirection
string
Enum: "ASC" "DESC"

Order direction (default: ASC)

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Create or update sponsor partner (Internal)

Internal API - Creates a new sponsor partner if domain doesn't exist, or updates existing one (upsert). If logo is not provided, attempts to fetch from Brandfetch API.

Request Body schema: application/json
required
domain
required
string <= 255 characters

Website domain (unique identifier)

name
required
string <= 255 characters

Sponsor partner name

website
string <= 512 characters

Website URL

shortName
string <= 100 characters

Short name/abbreviation

industries
Array of strings

Industries (array of strings)

logo
string <= 512 characters

Logo URL (if not provided, will attempt to fetch from Brandfetch)

icon
string <= 512 characters

Icon URL

brandId
string <= 255 characters

Brand ID from Brandfetch

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Update a sponsor partner (Internal)

Internal API - Updates an existing sponsor partner. Can update isActive status, website, shortName, industries, logo, and icon.

path Parameters
id
required
string
Request Body schema: application/json
required
isActive
boolean

Whether the sponsor partner is active

website
string <= 512 characters

Website URL

shortName
string <= 100 characters

Short name or abbreviation

industries
Array of strings

Industries the sponsor operates in

logo
string <= 512 characters

URL to the sponsor partner logo

icon
string <= 512 characters

URL to the sponsor partner icon

Responses

Request samples

Content type
application/json

Response samples

Content type
application/json
{}

Ticketing Partners

List or search ticketing partners

If query parameter is provided, searches ticketing partners by name (case-insensitive). Otherwise, returns list of all active ticketing partners.

Authorizations:
JWT-auth
query Parameters
query
string >= 2 characters
Example: query=Ticketmaster

Search query string (minimum 2 characters). If provided, performs search. Otherwise, returns list.

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": [
    ]
}

Get ticketing partner by key

Retrieves a specific ticketing partner by its unique key

Authorizations:
JWT-auth
path Parameters
key
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Internal - Ticketing Partners

List ticketing partners (Internal)

Internal endpoint to retrieve a paginated list of ticketing partners. No authentication required.

query Parameters
page
number
Default: 1
Example: page=1

Page number (default: 1)

limit
number <= 100
Default: 20
Example: limit=20

Number of items per page (default: 20, max: 100)

orderBy
string
Example: orderBy=name

Field to order by (default: name)

orderDirection
string
Enum: "ASC" "DESC"

Order direction (default: ASC)

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Create a new ticketing partner (Internal)

Internal API - Creates a new ticketing partner. Key must be unique.

Request Body schema: application/json
required
key
required
string <= 100 characters

Unique key for the ticketing partner (lowercase, underscores allowed)

name
required
string <= 100 characters

Ticketing partner name

ticketingUrl
object <= 255 characters

Partner ticketing URL

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update a ticketing partner (Internal)

Internal API - Updates an existing ticketing partner. Can update name, ticketingUrl, and isActive status.

path Parameters
key
required
string
Request Body schema: application/json
required
name
string <= 100 characters

Ticketing partner name

ticketingUrl
object <= 255 characters

Partner ticketing URL

isActive
boolean

Whether the ticketing partner is active

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Leagues

Search leagues for typeahead dropdown

Searches leagues by name (case-insensitive) for typeahead functionality. Can optionally filter by sportId. Returns list of matching leagues. If query is not provided, returns all leagues (optionally filtered by sportId).

Authorizations:
JWT-auth
query Parameters
query
string >= 2 characters
Example: query=NBA

Search query for league name (minimum 2 characters). If not provided, returns all leagues.

sportId
string
Example: sportId=systemwide.sport.basketball

Filter by sport ID (taxonomy.id from systemwide.sport.*)

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": [
    ]
}

Get league by ID

Retrieves a specific league by its unique identifier

Authorizations:
JWT-auth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Internal - Leagues

Create a new league (Internal)

Internal API - Creates a new league. Abbreviation must be unique. sportId must reference a valid taxonomy entry (systemwide.sport.*).

Request Body schema: application/json
required
name
required
string <= 255 characters

League name

abbreviation
required
string <= 50 characters

League abbreviation (unique)

sportId
required
string <= 200 characters

Sport ID - references taxonomy.id (systemwide.sport.*)

countryOrRegion
string <= 100 characters

Country or region

level
string
Enum: "Major" "Top-tier" "Tier 2" "Tier 3" "Development" "Premier" "Affiliated pro" "Elite" "Premier T20" "Professional 100-ball" "Elite amateur" "Pro" "Pro circuit"

League level

gender
string
Enum: "Men" "Women" "Mixed"

League gender

leagueType
string
Enum: "League" "Tour" "Series" "Promotion" "Continental competition" "Season/tour" "Tour/League"

League type

notes
string

Additional notes

Responses

Request samples

Content type
application/json
{
  • "name": "National Basketball Association",
  • "abbreviation": "NBA",
  • "sportId": "systemwide.sport.basketball",
  • "countryOrRegion": "United States/Canada",
  • "level": "Major",
  • "gender": "Men",
  • "leagueType": "League",
  • "notes": "Not fully professional; included for completeness"
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update a league (Internal)

Internal API - Updates an existing league. Can update all fields including sportId (must reference valid taxonomy).

path Parameters
id
required
string
Request Body schema: application/json
required
name
string <= 255 characters

League name

abbreviation
string <= 50 characters

League abbreviation

sportId
string <= 200 characters

Sport ID - references taxonomy.id (systemwide.sport.*)

countryOrRegion
string <= 100 characters

Country or region

level
string
Enum: "Major" "Top-tier" "Tier 2" "Tier 3" "Development" "Premier" "Affiliated pro" "Elite" "Premier T20" "Professional 100-ball" "Elite amateur" "Pro" "Pro circuit"

League level

gender
string
Enum: "Men" "Women" "Mixed"

League gender

leagueType
string
Enum: "League" "Tour" "Series" "Promotion" "Continental competition" "Season/tour" "Tour/League"

League type

notes
string

Additional notes

isActive
boolean

Whether the league is active

Responses

Request samples

Content type
application/json
{
  • "name": "National Basketball Association",
  • "abbreviation": "NBA",
  • "sportId": "systemwide.sport.basketball",
  • "countryOrRegion": "United States/Canada",
  • "level": "Major",
  • "gender": "Men",
  • "leagueType": "League",
  • "notes": "Not fully professional; included for completeness",
  • "isActive": true
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get league by ID (Internal)

Internal API - Retrieves a specific league by its unique identifier

path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Sports Teams

Search sports teams for typeahead dropdown

Searches sports teams by name (case-insensitive) for typeahead functionality. Can optionally filter by leagueId or sportId (taxonomy.id from systemwide.sport.*). Returns list of matching sports teams. If query is not provided, returns all teams (optionally filtered by leagueId or sportId).

Authorizations:
JWT-auth
query Parameters
query
string >= 2 characters
Example: query=Phoenix

Search query for team name (minimum 2 characters). If not provided, returns all teams.

leagueId
string
Example: leagueId=uuid-of-league

Filter by league ID

sportId
string <= 200 characters
Example: sportId=systemwide.sport.basketball

Filter by sport ID - references taxonomy.id (systemwide.sport.*). Returns only teams matching the specified sport.

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": [
    ]
}

Get sports team by ID

Retrieves a specific sports team by its unique identifier

Authorizations:
JWT-auth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Internal - Sports Teams

Create a new sports team (Internal)

Internal API - Creates a new sports team (master data). Separate from the platform 'teams' table which stores user accounts.

Request Body schema: application/json
required
name
required
string <= 255 characters

Team name

abbreviation
string <= 50 characters

Team abbreviation

location
string <= 255 characters

Team location (city, state/country)

logoUrl
string <= 512 characters

URL to team logo

externalId
string <= 255 characters

External ID for syncing with external APIs

foundedYear
number [ 1800 .. 2100 ]

Year team was founded

venueId
string

Home venue ID (references venues table)

conference
string <= 100 characters

Conference name

division
string <= 100 characters

Division name

website
string <= 512 characters

Official team website URL

socialMedia
object

Social media handles/links (JSON object)

nickname
string <= 100 characters

Team nickname/mascot

sportId
string <= 200 characters

Sport ID - references taxonomy.id (systemwide.sport.*). If team only plays one sport.

country
string <= 2 characters

Country code (ISO 3166-1 alpha-2)

timezone
string <= 50 characters

Team's timezone

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Update a sports team (Internal)

Internal API - Updates an existing sports team. Can update all fields.

path Parameters
id
required
string
Request Body schema: application/json
required
name
string <= 255 characters

Team name

abbreviation
string <= 50 characters

Team abbreviation

location
string <= 255 characters

Team location (city, state/country)

logoUrl
string <= 512 characters

URL to team logo

externalId
string <= 255 characters

External ID for syncing with external APIs

foundedYear
number [ 1800 .. 2100 ]

Year team was founded

venueId
string

Home venue ID (references venues table)

conference
string <= 100 characters

Conference name

division
string <= 100 characters

Division name

website
string <= 512 characters

Official team website URL

socialMedia
object

Social media handles/links (JSON object)

nickname
string <= 100 characters

Team nickname/mascot

sportId
string <= 200 characters

Sport ID - references taxonomy.id (systemwide.sport.*). If team only plays one sport.

country
string <= 2 characters

Country code (ISO 3166-1 alpha-2)

timezone
string <= 50 characters

Team's timezone

isActive
boolean

Whether the team is active

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get sports team by ID (Internal)

Internal API - Retrieves a specific sports team by its unique identifier

path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Authentication

Login with Firebase ID token

Authenticates user with Firebase ID token and returns JWT tokens

Request Body schema: application/json
required
idToken
required
string

Firebase ID token for authentication

Responses

Request samples

Content type
application/json
{
  • "idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ..."
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Refresh JWT tokens

Generate new access and refresh tokens using a valid refresh token

Request Body schema: application/json
required
refreshToken
required
string

JWT refresh token

Responses

Request samples

Content type
application/json
{
  • "refreshToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ..."
}

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get current user information

Returns the current authenticated user's information from the JWT token

Authorizations:
JWT-auth

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Get session information

Returns user details, associated teams, and progress tracker. If teamId is provided, progress tracker is calculated for that specific team.

Authorizations:
JWT-auth
query Parameters
teamId
string
Example: teamId=123e4567-e89b-12d3-a456-426614174000

Team ID to get progress tracker for (optional). If not provided, uses first team.

Responses

Response samples

Content type
application/json
{
  • "meta": { },
  • "data": {
    }
}

Progress Tracker

Get progress tracker

Retrieves the progress tracker for a specific team and flow

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: 123e4567-e89b-12d3-a456-426614174000

Team ID

flowName
required
string
Enum: "onboarding" "demo"

Flow name (onboarding, demo)

Responses

Response samples

Content type
application/json
{
  • "id": "123e4567-e89b-12d3-a456-426614174000",
  • "teamId": "123e4567-e89b-12d3-a456-426614174000",
  • "flowName": "onboarding",
  • "statusDetail": [
    ],
  • "lastStep": "connect_account",
  • "createdAt": "2023-01-01T00:00:00.000Z",
  • "updatedAt": "2023-01-01T00:00:00.000Z",
  • "progressPercentage": 75
}

Update progress tracker step

Updates the status of a specific step in the progress tracker

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: 123e4567-e89b-12d3-a456-426614174000

Team ID

flowName
required
string
Enum: "onboarding" "demo"

Flow name (onboarding, demo)

Request Body schema: application/json
required
step
required
string
Enum: "welcome" "brand_info" "team_details" "ticket_info" "team_store" "create_schedule" "create_moment"

Step to update

status
required
string
Enum: "pending" "completed" "skipped"

Status of the step

Responses

Request samples

Content type
application/json
{
  • "step": "brand_info",
  • "status": "completed"
}

Response samples

Content type
application/json
{
  • "id": "123e4567-e89b-12d3-a456-426614174000",
  • "teamId": "123e4567-e89b-12d3-a456-426614174000",
  • "flowName": "onboarding",
  • "statusDetail": [
    ],
  • "lastStep": "connect_account",
  • "createdAt": "2023-01-01T00:00:00.000Z",
  • "updatedAt": "2023-01-01T00:00:00.000Z",
  • "progressPercentage": 75
}

Skip all steps

Skips all remaining steps in the progress tracker

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: 123e4567-e89b-12d3-a456-426614174000

Team ID

flowName
required
string
Enum: "onboarding" "demo"

Flow name (onboarding, demo)

Responses

Response samples

Content type
application/json
{
  • "id": "123e4567-e89b-12d3-a456-426614174000",
  • "teamId": "123e4567-e89b-12d3-a456-426614174000",
  • "flowName": "onboarding",
  • "statusDetail": [
    ],
  • "lastStep": "connect_account",
  • "createdAt": "2023-01-01T00:00:00.000Z",
  • "updatedAt": "2023-01-01T00:00:00.000Z",
  • "progressPercentage": 75
}

Preferences

Get preference by context

Retrieves a user preference by context

Authorizations:
JWT-auth
path Parameters
context
required
string (PreferenceContext)
Value: "table.moment.columns"

Context of the preference

Responses

Response samples

Content type
application/json
{
  • "id": "123e4567-e89b-12d3-a456-426614174000",
  • "userId": "123e4567-e89b-12d3-a456-426614174000",
  • "context": "table.moment.columns",
  • "preference": {
    },
  • "createdAt": "2023-01-01T00:00:00.000Z",
  • "updatedAt": "2023-01-01T00:00:00.000Z"
}

Update or create preference

Updates an existing preference by context or creates a new one if not found

Authorizations:
JWT-auth
path Parameters
context
required
string (PreferenceContext)
Value: "table.moment.columns"

Context of the preference

Request Body schema: application/json
required
preference
required
object

Preference data as JSON object

Responses

Request samples

Content type
application/json
{
  • "preference": {
    }
}

Response samples

Content type
application/json
{
  • "id": "123e4567-e89b-12d3-a456-426614174000",
  • "userId": "123e4567-e89b-12d3-a456-426614174000",
  • "context": "table.moment.columns",
  • "preference": {
    },
  • "createdAt": "2023-01-01T00:00:00.000Z",
  • "updatedAt": "2023-01-01T00:00:00.000Z"
}

Delete preference

Deletes a user preference by context

Authorizations:
JWT-auth
path Parameters
context
required
string (PreferenceContext)
Value: "table.moment.columns"

Context of the preference

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Get all user preferences

Retrieves all preferences for the authenticated user

Authorizations:
JWT-auth

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Internal - Fixture Sync

Trigger fixture sync for sports teams

Triggers async fixture sync for all eligible sports teams. Called by Cloud Scheduler on a schedule or manually for testing.

query Parameters
sport
string
Enum: "football" "basketball"

Filter by sport type

forceUpdate
boolean
Default: false

Force update existing moments even if unchanged

teamId
string

Sync only a specific team (for testing)

limit
number [ 1 .. 1000 ]

Maximum number of teams to process (for testing)

Responses

Response samples

Content type
application/json
{ }

Trigger fixture sync with auto-mapping for sports teams

Triggers async fixture sync for sports teams and auto-maps missing aggregator team IDs via search.

query Parameters
sport
string
Enum: "football" "basketball"

Filter by sport type

forceUpdate
boolean
Default: false

Force update existing moments even if unchanged

teamId
string

Sync only a specific team by ID

limit
number [ 1 .. 1000 ]

Maximum number of teams to process (for testing)

Responses

Response samples

Content type
application/json
{ }

Trigger fixture sync for a specific team by slug

Looks up the team by slug, ensures aggregator team mapping exists (searches and sets if missing), then triggers fixture sync for that team.

path Parameters
slug
required
string

The team slug (e.g., "lakers")

query Parameters
forceUpdate
boolean

Force update existing moments even if unchanged

Responses

Response samples

Content type
application/json
{ }

Get status of a sync run

Returns the current status and progress of an active sync run.

path Parameters
syncId
required
string

The sync run ID returned from trigger endpoint

Responses

List active sync runs

Returns all currently active sync runs.

Responses

Fixture sync service health check

Responses

Invitations

Send invitations to join team

Sends email invitations to the given addresses. Re-inviting the same email auto-cancels the previous pending invite and creates a fresh one. Rate limited to 10 invitations per sender per hour (auto-cancelled invites are excluded from the count) and 50 pending invitations per team. Returns per-email results with partial success support.

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: c91c90d2-2abf-419e-917d-a33959c0a2dc

UUID of the team to invite the user to

Request Body schema: application/json
required
emails
required
Array of strings

Email addresses to invite

email
string

Single email address to invite (backward-compatible)

role
string
Default: "member"
Enum: "owner" "member"

Role to assign to the invited users

Responses

Request samples

Content type
application/json
{
  • "emails": [
    ],
  • "email": "user@example.com",
  • "role": "owner"
}

Response samples

Content type
application/json
{
  • "results": [
    ],
  • "summary": {
    }
}

List team invitations

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: c91c90d2-2abf-419e-917d-a33959c0a2dc

UUID of the team

query Parameters
page
number
Example: page=1

Page number

limit
number
Example: limit=20

Items per page

Responses

Response samples

Content type
application/json
{
  • "invitations": [
    ],
  • "total": 12
}

Get invitation details

Public endpoint — no authentication required.

Authorizations:
JWT-auth
path Parameters
token
required
string
Example: rZtHLdX8hVWrvYPtkxgoLkOrULGw2xEUq4Ks148QdbY

Raw invitation token from the email link (256-bit base64url-encoded)

Responses

Response samples

Content type
application/json
{
  • "id": "3f2dd051-2f31-49eb-ad3b-1de965031d10",
  • "teamId": "c91c90d2-2abf-419e-917d-a33959c0a2dc",
  • "teamName": "Miami Heat",
  • "teamSlug": "miami-heat-52",
  • "inviterDisplayName": "Shahad Ishraq",
  • "invitedEmail": "newmember@example.com",
  • "role": "member",
  • "status": "pending",
  • "expiresAt": "2026-03-03T14:06:27.489Z",
  • "createdAt": "2026-02-24T14:06:27.489Z"
}

Accept a team invitation

Authorizations:
JWT-auth
path Parameters
token
required
string
Example: rZtHLdX8hVWrvYPtkxgoLkOrULGw2xEUq4Ks148QdbY

Raw invitation token from the email link (256-bit base64url-encoded)

Responses

Response samples

Content type
application/json
{
  • "teamId": "c91c90d2-2abf-419e-917d-a33959c0a2dc",
  • "teamName": "Miami Heat",
  • "teamSlug": "miami-heat-52"
}

Cancel a pending invitation

Authorizations:
JWT-auth
path Parameters
teamId
required
string
Example: c91c90d2-2abf-419e-917d-a33959c0a2dc

UUID of the team

invitationId
required
string
Example: 858d198b-6348-45ae-a8ac-572979e86f9e

UUID of the invitation to cancel

Responses

Response samples

Content type
application/json
{
  • "message": "Invitation cancelled successfully"
}