GuidesAPI ReferenceRelease Notes
HomeLog InHome
Guides

BlazeSDK class

Use this reference for the Experiences Web SDK entry point: initialization, global options, widget methods, playback helpers, and types. API identifiers keep the Blaze prefix in code.

How this page is organized

## Methods groups the global static methods on BlazeSDK:

  • Lifecycle: isInitialized, Initialize, and readiness (onBlazeSDKConnect).
  • Widget constructors: WidgetGridView, WidgetRowView, WidgetEmbeddedStory, WidgetEmbeddedVideo, and the shared IWidgetViewOptions table.
  • Theme: Theme() and the available theme presets.
  • Privacy and tracking: setDoNotTrack, setDisableAnalytics, setDisableUserActivity, clearLocalUserActivity.
  • Viewer identity and localization: setExternalUserId, setPreferredLanguage, setGeoLocation.
  • Interaction: setOnItemClick.
  • Playback: playContent, playStory, playStories, appendContentToPlayer, setBeforeContentPlayCallback.
  • Player control: pauseCurrentPlayer, resumeCurrentPlayer.
  • App context: getAppContextManager.

## Ads covers the ad handlers, and ## Complete integration example puts several widget calls together.

Content and customization types live on their own pages:

Methods

Lifecycle

isInitialized(): boolean

The isInitialized method returns a boolean that indicates whether the SDK is already initialized. This helps prevent duplicate initialization calls and lets you run logic depending on the SDK's readiness. Call this method before initializing to confirm that the SDK hasn’t already been set up elsewhere in your application.

Initialize(apiKey: string, options: IBlazeSDKOptions): Promise<void>

The SDK injects a <blaze-sdk api-key="…" /> element into the document as part of startup. Initialize is synchronous; await it or handle its promise before you rely on widgets or playback.

Call Initialize once per page load. A second call can cause an inconsistent state. Run it as early as your app allows (for example, right after you create the root container). Pass a valid IBlazeSDKOptions object when you need global behavior (privacy, identity, geo, player styling, and so on).

To know when the SDK is ready, listen for onBlazeSDKConnect. Register the listener before you call Initialize so you don’t miss the event if it fires immediately. onBlazeSDKConnect runs once after the first successful initialization.

ParameterTypeRequiredDescription
apiKeystringYesAPI key
options.doNotTrack?booleannoSets do not track
options.externalUserId?stringnoSets the viewer ID for a logged-in viewer. Your app supplies this value. See Viewer ID specifications.
options.geoLocation?stringnoSets the geolocation feature globally. This value overrides the default IP-based country detection.
options.runInShadowDom?booleannoRuns the SDK inside a shadow dom. default = true
options.shouldModifyUrlWithStoryId?booleannoControls whether the SDK updates the browser URL when story content opens. If you support multiple content types in one integration, prefer options.shouldModifyUrlWithContentId.
options.shouldModifyUrlWithContentId?booleannoControls whether the SDK updates the browser URL using the content ID when content opens.
options.playerStyleCustomization?Partial <StoryPlayerStyle>noSet the global style on the player
options.prefetchingPolicy?string - 'low' | 'default'noDefault is the value if not defined
options.shouldAllowHorizontalStoriesbooleannoIf not defined, it displays vertical content on Desktop. Contact your account manager for more info.
options.layoutDirectionbooleannoSet the SDK direction - RTL/LTR
options.followedEntitiesstring[]noGlobally defines a list of followed entities used by the follow button.
options.disableAnalyticsbooleannoDisable analytics to WSC Sports, but allow delegation events
options.preferredLanguagestringnoEnables dynamic content localization by communicating the viewer's preferred language to the backend API.
document.addEventListener("onBlazeSDKConnect", onBlazeSDKConnect);

if (!BlazeSDK.isInitialized()) {
    BlazeSDK.Initialize('<API-KEY>',{
     geoLocation: 'IL', // Country code by two letters
     externalUserId: 'user-123',
     doNotTrack: false,
     runInShadowDom: true, // default value is true
     shouldModifyUrlWithContentId: true, // default value is true
     playerStyleCustomization: { // only for Stories, not supported to Moments
       iconsPosition: 'VERTICAL'
     },
     prefetchingPolicy: 'default',
     shouldAllowHorizontalStories: false, // by default false
     layoutDirection: "LTR", // by default LTR
     followedEntities: ['player-123', 'team-123', 'property-123'],
		 disableAnalytics: false,
		 disableUserActivity: false
   })
}

Prefetch Policy

LevelDescription
LowInitially, no pre-fetch While playing, the next page of the currently playing story, and the first unread page of the next story
DefaultInitially, pre-fetches the first story page in line. While playing, the next two pages of the currently playing story, the first unread page of the next story, and the first unread page of the previous story.

Widget constructors

WidgetGridView(containerId: string, options?: IWidgetViewOptions): IWidgetView

WidgetRowView(containerId: string, options?: IWidgetViewOptions): IWidgetView

WidgetEmbeddedStory(containerId: string, options?: IWidgetViewOptions): IWidgetView

WidgetEmbeddedVideo(containerId: string, options?: IWidgetViewOptions): IWidgetView

For guidance on when to use an embedded video widget versus a row or grid widget, plus an end-to-end example, see WidgetEmbeddedVideo.

BlazeSDK.WidgetRowView(...) and BlazeSDK.WidgetGridView(...) support options.widgetRemoteIdentifier?: string. When you provide this identifier, the widget loads its data source and layout styling from a remote widget configuration. After that, local runtime mutators, including theme and data source updates, are ignored because the widget is remote-managed.

BlazeSDK.WidgetEmbeddedStory(...) and BlazeSDK.WidgetEmbeddedVideo(...) do not accept widgetRemoteIdentifier.

Returns an IWidgetView object

ParameterTypeRequiredDescription
containerIdstringYesThe widget will be appended to the HTML element with the given container ID
options?IWidgetViewOptionsNoOptional. Here, you can determine the labels and theme for the created view
options.dataSourceBlazeDataSourceTypeif not labels or storyIds provided
options.labelsstringstring[]\BlazeWidgetLabelIf storyIds were not specifiedArray of strings is deprecated but still supported, string as value or create your labels with LabelBuilder
options.storyIdsstring[]If labels was not specified
  • deprecated - use contentIds instead Fetching and displaying the specific stories indicated with ['storyId1', 'storyId2'].\
Please note: In case you specify both "labels" and "storyIds" properties, only the "labels" property will be applied.
options.contentIdsstring[]if labels were not specified

deprecated Fetching and displaying the specific stories/moments indicated with ['1234', '5678'].

Please note: In case you specify both "labels" and "storyIds" properties, only the "labels" property will be applied.

options.contentType?'story' | 'moment' | 'video'if not provided, will be storyTo use specific content, it is recommended to set it
options.videoFilters?IVideoFilterOptionsNoFilter video content by type ('Video' = on-demand, 'Stream' = live streams) and stream state ('Live', 'Upcoming', 'Ended'). Use the VideoFilterBuilder helper for common scenarios. See VideoFiltersBuilder.
options.labelsPriority?stringNodeprecated The order is which the string will order the label's result. A string with an opening of '[' and close by ']'. Example: '[teama, teamb]'
options.widgetRemoteIdentifier?stringNoSupported only by BlazeSDK.WidgetRowView(...) and BlazeSDK.WidgetGridView(...). Loads the widget data source and layout styling from a remote widget configuration. When set, local runtime mutators, including theme and data source updates, are ignored.
options.theme?stringNoYou can pass your own theme object to this specific view
options.maxItemsCount?numberNodeprecated Specify the max items to fetch from server
options.maxDisplayItemsCount?numberNoSpecify the max items to display. You can display 3 items while having 10 items returned from server.
options.orderType?stringNo

Specify the items order type. Unread items will show first by selected order type, following by read items also ordered by selected order type.

Possible order types: Manual, AtoZ, ZtoA, RecentlyUpdatedFirst, RecentlyUpdatedLast, RecentlyCreatedFirst, RecentlyCreatedLast, StartTimeAsc, StartTimeDesc

options.perItemStyleOverrides?PerItemStyleOverridesno

The perItemStyleOverrides property in IWidgetViewOptions facilitates custom styling for individual items within a widget based on specific entity identifiers.

This feature enhances flexibility by allowing unique visual representations for each item within the widget.

options.shouldOrderWidgetByReadStatus?booleannoIf set to false, read/unread does not change item order. Items follow the data source orderType or server order. Default is true. See Ordering and item limits.
options.actionHandlers?ActionHandler[]noArray of actions, each action has id and options.
const myTheme: IWidgetTheme = BlazeSDK.Theme('row-rectangle');

const myDataSource = BlazeSDK.DataSourceBuilder().labels({
   labels: 'live-stories',
   orderType: 'RecentlyUpdatedFirst',
   maxItems: 10,
	 advancedOrdering: 'LiveFirst',

})

const options: IWidgetViewOptions = {
   dataSource: myDataSource, // Use a data source instead of labels
   maxDisplayItemsCount: 1, // Display only 1 item
   theme: myTheme // Set the theme of the widget,
   shouldOrderWidgetByReadStatus: true // the default value is true   
   perItemStyleOverrides: {
        "playerId": [
            {
                name: "35450",
                theme: rowCircleThemePlayer
            },
            {
                name: "28237",
                theme: rowCircleThemePlayer
            },
            {
                name: "46046",
                theme: rowCircleThemePlayer
            }
        ],
        "teamId": [
            {
                name: "real-madrid",
                theme: rowCircleThemeRealMadrid
            }
        ]
    },
    actionHandlers: [
        {
          actionId: 'addCustomActionButton',
          options: {
            buttonName: 'go-to-fans-page',
            onClick: (e, entities) => {
              console.log(entities?.gameId, entities?.playerId, entities?.teamId);
            },
          },
        },
        {
          actionId: 'addCustomActionButton',
          options: {
            buttonName: 'go-to-social-page',
            onClick: (e, entities) => {
              console.log(entities?.gameId, entities?.playerId, entities?.teamId);
            },
          },
        },
	{
          actionId: 'addFollowButton',
          options: {
            onClick: (e, data) => {
              console.log(data.sourceId,
                          data.sourceContentType,
                          data.newFollowingState,
                          data.followEntity.entityType,
 			  data.followEntity.entityId);
            },
          },
        },
     ],
};

const widgetView: IWidgetView = BlazeSDK.WidgetRowView('<DOM-CONTAINER-ID>', options);

//widgetView has an interface, which allows you to interact with the widget in the DOM 
//widgetView.reload()

For perItemStyleOverrides and actionHandlers, see Per item style overrides and Action handlers.

Theme

Theme(preset?: ThemeType): IWidgetTheme

Returns an IWIdgetTheme object with default theme preset

ParameterTypeRequiredDescription
presetThemeTypeNothe preset theme name like "grid-3-columns" / "row-circle"
contentType'story''moment''video'NoIf not provided it will return a playerStyle of story.
const theme = BlazeSDK.Theme('row-rectangle','story');
const theme: IWidgetTheme = BlazeSDK.Theme('row-rectangle');

Theme Type

ValueDescription
row-circleA row layout with circular items.
row-rectangleA row layout with rectangular items.
grid-2-columnsA grid layout with 2 columns.
grid-3-columnsA grid layout with 3 columns.
row-rectangle-horizontalA horizontal row layout with rectangular items.
row-rectangle-animatedA horizontal row layout with rectangular animated items. Supported only for moments and long-form videos.
grid-2-columns-horizontalA horizontal grid layout with 2 columns.
grid-3-columns-horizontalA horizontal grid layout with 3 columns.
defaultThe default theme style - row-circle

For the full theme object, its properties per surface, and how to apply one, see Theme.

Privacy and tracking

setDoNotTrack(value: boolean): void

ParameterTypeRequiredDescription
valuebooleanYesSet the value of Do Not Track after the client has created the widget or initialized the SDK.
BlazeSDK.setDoNotTrack(true);

setDisableAnalytics(value: boolean): void

ParameterTypeRequiredDescription
valuebooleanYesEnables or disables analytics data transmission to WSC Sports,
When set to true, no analytics data of any kind is sent to WSC Sports endpoints.
BlazeSDK.setDisableAnalytics(true);

setDisableUserActivity(value: boolean): void

ParameterTypeRequiredDescription
valuebooleanYesEnables or disables user activity tracking and syncing at runtime. When set to true, local database still tracks activities, but activities remain device-local only.
BlazeSDK.setDisableUserActivity(true);

clearLocalUserActivity(): Promise<void>

Clears all user activity data from the device's local storage only, without affecting remote data.

BlazeSDK.clearLocalUserActivity();

Viewer identity and localization

setExternalUserId(value: string): void

ParameterTypeRequiredDescription
valuestringYesThe viewer ID for the current viewer. The SDK sends it with all analytics events. See Viewer ID specifications.
BlazeSDK.setExternalUserId('1234');

setPreferredLanguage(value: string): void

ParameterTypeRequiredDescription
valuestringYesSet a preferred language for the SDK, make sure to use standard formats
BlazeSDK.setGeoLocation('IL')

setGeoLocation(value: string): void

ParameterTypeRequiredDescription
valuestringYesUpdates the geographic location used for content geo-blocking. This value overrides the default IP-based country detection. Use a two-letter country code (for example, 'US', 'IL').
BlazeSDK.setGeoLocation('IL')

Interaction

setOnItemClick(callback: ItemClickCallback | undefined): void

Registers a single, SDK wide callback that runs when a viewer clicks a widget item (tile) in a row or grid widget, before the player opens. Return { shouldPreventOpen: true } from the callback to stop the default player from opening (for example, to route to your own screen); return { shouldPreventOpen: false } to allow normal behavior. Pass undefined to remove the callback.

This is separate from delegation events (the delegates option / addDelegateListener), which are CustomEvents for SDK lifecycle changes and cannot prevent the default click action.

ParameterTypeRequiredDescription
callbackItemClickCallback | undefinedYesThe callback to run on item click, or undefined to clear it.

The callback receives an ItemClickContext:

PropertyTypeDescription
containerIdstringThe container ID of the widget that was clicked.
itemIContentThe clicked content item.
itemIndexInContainernumberThe zero based index of the item within its container.
contentTypeContentTypeThe content type of the item (story, moment, or video).
contentThumbnailUrl?stringURL of the item's static thumbnail (poster). undefined when the item has no static thumbnail.

Supported Web SDK version: contentThumbnailUrl is available in @wscsports/blaze-web-sdk 0.36.1 or later.

BlazeSDK.setOnItemClick((context) => {
  console.log('Clicked:', context.item.title, context.contentThumbnailUrl);
  return { shouldPreventOpen: false };
});

// Remove the callback
BlazeSDK.setOnItemClick(undefined);

Playback

playContent(contentType: ContentType, options: PlayContentOptions): Promise<void>

ParameterTypeRequired
contentType'story' | 'video'Yes
optionsPlayContentOptionsYes

The PlayContentOptions type defines the configuration options for the playContent function, allowing customization of content playback through data sources, action handlers, and styling options.

  • dataSource (BlazeDataSourceType): The source of the content to be played, providing the necessary data for rendering.
  • actionHandlers (ActionHandler[]?): Optional. An array of actions.
  • style (StoryPlayerStyle | VideoPlayerStyle?): Optional. Specifies the player’s visual styling. To ensure action handlers display buttons, set isVisible to true on customButtonsAction in the player style.
  • shouldOrderContentByReadStatus: Whether to order the content by read status, displaying unread items first. Default is true.
const dataSource = BlazeSDK.DataSourceBuilder().labels({
  labels: BlazeSDK.LabelBuilder().atLeastOneOf('top-stories', 'live-stories'),
  maxItems: 4,
})
const playerStyle = BlazeSDK.Theme('default').playerStyle;
theme.playerStyle.iconsButton.filter(icon => icon.value === 'CUSTOM_ACTION_BUTTON_ONE')[0].isVisible = true;
theme.playerStyle.iconsButton.filter(icon => icon.value === 'CUSTOM_ACTION_BUTTON_TWO')[0].isVisible = true;

actionHandlers: [
        {
          actionId: 'addCustomActionButton',
          options: {
            buttonName: 'go-to-fans-page',
            onClick: (e, entities) => {
              console.log(entities?.gameId, entities?.playerId, entities?.teamId);
            },
          },
        },
        {
          actionId: 'addCustomActionButton',
          options: {
            buttonName: 'go-to-social-page',
            onClick: (e, entities) => {
              console.log(entities?.gameId, entities?.playerId, entities?.teamId);
            },
          },
        },
      ],

BlazeSDK.playContent('story',{
  dataSource,
  style: playerStyle,
  actionHandlers,
  shouldOrderContentByReadStatus: true
});

playStory(storyId: string, style?: StoryPlayerStyle ): void

Deprecated: use playContent instead of playStory.

ParameterTypeRequiredDescription
storyIdstringYesthe ID of the story you would like to play
styleStoryPlayerStylenoif not provided, will use the default player style
actionHandlersActionHandler[]noArray of actions, each action has id and options.

const playerStyle = BlazeSDK.Theme('default').playerStyle;

BlazeSDK.playStory('66c0d0c6607d0c10cf3dd98d',playerStyle)

playStories(dataSource: BlazeDataSourceType, style?: StoryPlayerStyle, actionHandlers?: ActionHandler[]): Promise<void>

Deprecated: use playContent instead of playStories.

ParameterTypeRequiredDescription
dataSourceBlazeDataSourceTypeYes
styleStoryPlayerStylenoif not provided, will use the default player style
actionHandlersActionHandler[]noArray of actions, each action has id and options.
const dataSource = BlazeSDK.DataSourceBuilder().labels({
  labels: BlazeSDK.LabelBuilder().atLeastOneOf('top-stories', 'live-stories'),
  maxItems: 4,
})
const playerStyle = BlazeSDK.Theme('default').playerStyle;

BlazeSDK.playStories(dataSource, playerStyle)

appendContentToPlayer(contentType: ContentType, dataSource: BlazeDataSourceType, options?): Promise<void>

This function supports only moment content type for now

This function allows you to append content to the current opened player. It receives a content type, data source and options object, and append it to the end of the current content list of the player.

function appendContentToPlayer(contentType: ContentType, dataSource: BlazeDataSourceType, options?: {
    shouldOrderContentByReadStatus?: boolean;
}): Promise<void>

Usage examples:

BlazeSDK.appendContentToPlayer('moment', 
                                BlazeSDK.DataSourceBuilder().labels({ labels: "my-label" })
                              );
BlazeSDK.appendContentToPlayer('moment', 
                               BlazeSDK.DataSourceBuilder().ids({ ids: ["6706731d200c07e22d70a2ed","663a1c0a4e167da3d5a3ddf9"] }),
                               { shouldOrderContentByReadStatus: false } 
                              );

setBeforeContentPlayCallback(callback: BeforeContentPlayCallback | undefined): void

The callback runs only when enableClientPlaybackModification is true in the app configuration. If the callback throws an error or returns an invalid result, the SDK falls back to the original URL so playback continues. Keep callback execution time short to avoid delays in video playback.

Don't expose sensitive tokens or credentials in client-side code.

ParameterTypeRequiredDescription
callbackBeforeContentPlayCallback | undefinedYesCallback function that receives the original video URL and returns a modified URL before content playback begins. Pass undefined to remove an existing callback.
BeforeContentPlayCallback interfaces
InterfacePropertyTypeDescription
BeforeContentPlayContextoriginalUrlstringThe original video URL that needs to be processed before playback
BeforeContentPlayResultresultUrlstringThe modified/tokenized URL that will be used for actual video playback

BeforeContentPlayCallback: (context: BeforeContentPlayContext) => Promise<BeforeContentPlayResult> | BeforeContentPlayResult

interface BeforeContentPlayContext {
  originalUrl: string;
}

interface BeforeContentPlayResult {
  resultUrl: string;
}

type BeforeContentPlayCallback = (
  context: BeforeContentPlayContext
) => Promise<BeforeContentPlayResult> | BeforeContentPlayResult;
Async URL tokenization
// URL tokenization example for protected content
BlazeSDK.setBeforeContentPlayCallback(async (context) => {
  const { originalUrl } = context;

  const response = await fetch(`https://example-service.com/tokenGen?url=${originalUrl}`)
  const data = await response.json()

  return {
    resultUrl: data.data.url
  };
});
Synchronous URL modification
// Synchronous URL modification example
BlazeSDK.setBeforeContentPlayCallback((context) => {
  const { originalUrl } = context;
  
  const url = new URL(originalUrl);
  url.searchParams.set('token', getUserToken());
  url.searchParams.set('timestamp', Date.now().toString());
  
  return {
    resultUrl: url.toString()
  };
});
Remove callback
// Remove callback
BlazeSDK.setBeforeContentPlayCallback(undefined);

Player control

pauseCurrentPlayer(): void

Pause the story in the opened modal.

 BlazeSDK.pauseCurrentPlayer();

resumeCurrentPlayer(): void

Resume the story in the opened modal.

 BlazeSDK.resumeCurrentPlayer();

App context

getAppContextManager(): Record<string, any>

The app context manager allow you to send custom properties to your own enrichment layer. for example:

BlazeSDK.getAppContextManager().userName = "Lorem Ipsum"

Ads

setGoogleCustomNativeAdsHandler

Allows you to send optional properties for custom native ads. It is an optional method.

type CustomNativeTargeting = Record<string, string | string[]>;
type CustomNativeArgs = {
  path: string;
};

interface CustomNativeAdHandler {
  provideAdExtraParams?: (args: CustomNativeArgs, contentExtraInfo?: ContentExtraInfo) => CustomNativeTargeting;
}

provideAdExtraParams

method signature

function provideAdExtraParams(args: { path: string }, contentExtraInfo?: ContentExtraInfo): CustomNativeTargeting;

// Usage example:
BlazeSDK.setGoogleCustomNativeAdsHandler({
  provideAdExtraParams: (args, contentExtraInfo) => {
    return {
    	"gdpr": "1",
    	"age": ["1", "2"],
    	"next": JSON.stringify(contentExtraInfo?.next),
    	"prev": JSON.stringify(contentExtraInfo?.previous)     
}
}});

Optional function that will be triggered every time a custom native ad request an ad. Use this to customize how (and if) each viewer consent (or any other extra query params) behaves. If not implemented, the SDK will use the default value, which equals to {}.

setImaHandler

Allows you to send optional properties for custom native ads. It is an optional method.

type ImaExtraParams = Record<string, string>;

interface ImaAdHandler {  
  provideAdExtraParams?: (contentExtraInfo?: ContentExtraInfo) => ImaExtraParams;
}

provideAdExtraParams

method signature

function provideAdExtraParams(contentExtraInfo? : ContentExtraInfo): ImaExtraParams;

// Usage example:  
BlazeSDK.setImaHandler({  
  provideAdExtraParams: (contentExtraInfo) => {  
    return {
    	"cust_params": "gdpr=1"
    }  
}});

Optional function that will be triggered every time a ima ad request an ad. Use this to customize how (and if) each viewer consent (or any other extra query params) behaves. If not implemented, the SDK will use the default value, which equals to .

Ad types

ContentExtraInfo

ParameterTypeDescription
previous?ExtraInfoPrevious content's ExtraInfo
current?ExtraInfoCurrent content's ExtraInfo
next?ExtraInfoNext content's ExtraInfo

ExtraInfo

TypeDescription
Record<string,string>Content's ExtraInfo

Complete integration example

const filters = BlazeSDK.VideoFilterBuilder();

// Live games section
const liveGames = BlazeSDK.WidgetRowView('live-container', {
  dataSource: BlazeSDK.DataSourceBuilder().labels({
    labels: 'sports-games',
    advancedOrdering: 'LiveFirst',
    maxItems: 10
  }),
  contentType: 'video',
  videoFilters: filters.liveOnly()
});

// Upcoming schedule
const schedule = BlazeSDK.WidgetGridView('schedule-container', {
  dataSource: BlazeSDK.DataSourceBuilder().labels({
    labels: 'sports-games',
    orderType: 'OldestFirst',
    maxItems: 20
  }),
  contentType: 'video',
  videoFilters: filters.upcomingOnly()
});

// Replays library
const replays = BlazeSDK.WidgetRowView('replays-container', {
  dataSource: BlazeSDK.DataSourceBuilder().labels({
    labels: 'sports-games',
    orderType: 'RecentlyUpdatedFirst',
    maxItems: 20
  }),
  contentType: 'video',
  videoFilters: filters.endedOnly()
});

Did this page help you?