Notice: before starting DemoProject make sure to enter your bookmaker access token in app.config file and restore nuget packages by right-clicking the solution item and selecting "Restore NuGet Packages".
The SDK is also available via NuGet package manager. Use the following command in the Package Manager Console to install it along with it's dependencies:
Install-Package Sportradar.OddsFeed.SDKCore
The SDK uses the following 3rd party libraries which must be added via the NuGet package manager
- OpenTelemetry (1.6.0)
- Dawn.Guard (1.12.0)
- Humanizer (2.14.1)
- Microsoft.Extensions.Logging (7.0.0)
- Microsoft.Extensions.Caching.Memory (7.0.0)
- Microsoft.Extensions.Configuration (7.0.0)
- Microsoft.Extensions.Diagnostics.HealthChecks (7.0.11)
- Microsoft.Extensions.Http (7.0.0)
- RabbitMQ.Client (6.5.0)
The package contains:
- DemoProject: A Visual Studio 2022 solution containing a demo project showing the basic usage of the SDK
- libs: DLL file composing the Odds Feed SDK
- Odds Feed SDK Documentation.chm: A documentation file describing exposed entities
- Resources containing the log4net configuration needed by the Odds Feed SDK
For more information please contact [email protected] or visit https://iodocs.betradar.com/unifiedsdk/index.html
- New major release
- Added support for ICompetitor.Division (moved and replaced from ITeamCompetitor)
- Extended IJersey with SquareColor and HorizontalStripesColor
- Added support for IVenue.Courses (returns list of ICourse instead of list of IHole)
- TargetFramework changed from netstandard2.1 to netstandard2.0
- Removed all default method implementations on interfaces
- Removed obsolete property or methods:
- IOutcomeSettlement.Result
- IOddsFeedConfigurationSection.UseIntegrationEnvironment
- IRound.GroupName
- IRound.GetGroupName()
- Root classes renamed
- IOddsFeed to IUofSdk
- Feed to UofSdk
- ReplayFeed to UofSdkForReplay
- IOddsFeedExt to IUofSdkExtended
- FeedExt to UofSdkExtended
- IOddsFeedConfigurationSection to IUofConfigurationSection
- OddsFeedConfigurationSection to UofConfigurationSection
- IOddsFeedConfiguration to IUofConfiguration
- Introduced IUofAdditionalConfiguration
- Removed OperationManager (properties moved to IUofConfiguration)
- IEnvironmentSelector - removed SelectIntegration() and SelectProduction() - use SelectEnvironment(SdkEnvironment ufEnvironment)
- Renamed Feed.CreateBuilder() to UofSdk.GetSessionBuilder()
- App.config section moved to Sportradar.OddsFeed.SDK.Api.Internal.Config.UofConfigurationSection
- UofConfigurationSection property supportedLanguages renamed to desiredLanguages
- Renamed IRound.Name to Names
- Renamed IRound.PhaseOrGroupLongName to PhaseOrGroupLongNames
- IProducerManager method Get() renamed to GetProducer()
- Renamed suffix DTO to Dto (internal)
- Removed CI suffix in Exportable classes (internal)
- Renamed suffix CI to CacheItem (internal)
- Enum values in MessageType changed to CamelCase
- Enum values in ExceptionHandlingStrategy changed to CamelCase
- Enum values in CashoutStatus changed to CamelCase
- Enum values in FixtureChangeType changed to CamelCase
- Enum values in MarketStatus changed to CamelCase
- Enum values in OddsChangeReason changed to CamelCase
- Enum values in PropertyUsage changed to CamelCase
- Enum values in ResourceTypeGroup changed to CamelCase
- Dependent library changes:
- Removed Newtonsoft.Json
- Humanizer 2.8.26 -> 2.14.1
- RabbitMQ.Client 5.1.2 -> 6.5.0
- Microsoft.Extensions.Logging.Abstractions 3.1.0 -> 7.0.0
- System.Configuration.ConfigurationManager 4.7.0 -> 7.0.0 - Should be changed with Microsoft.Extensions.Configuration 7.0.0,
- Removed System.Runtime.Caching 4.7.0 replaced with Microsoft.Extensions.Caching.Memory
- App.Metrics replaced with OpenTelemetry 1.6.0
- Unity replaced with Microsoft.Extensions.DependencyInjection 7.0.0
- Introduced Microsoft.Extensions.Diagnostics.HealthChecks 7.0.11
- Introduced Microsoft.Extensions.Http 7.0.0
- Removed Castle.Core
- Tests projects upgraded to NET 6.0
- Tests projects depended libraries upgraded to latest versions
- Inconsistent naming
- IOddsFeedConfigurationSection.UseSSL -> UseSsl
- IOddsFeedConfigurationSection.UseApiSSL -> UseApiSsl
- ReplayPlayerStatus.Setting_up - SettingUp
- IFixture.StartTimeTBD -> StartTimeTbd
- ExportableFixture.StartTimeTBD -> StartTimeTbd
- EventStatus.Not_Started -> NotStarted
- FeedMessage.EventURN -> EventUrn
- URN -> Urn
- Changed namespace
- API namespace renamed to Api
- REST namespace renamed to Rest
- replay interfaces to Api.Replay
- feed managers to Api.Managers
- feed providers to Api.Managers
- enum types moved to Common.Enums
- IOddsFeedConfigurationSection moved to Api.Internal.Config
- configuration interfaces moved to Api.Config
- MessageInterest class moved to Api.Config
change
<configSections>
<section name="oddsFeedSection" type="Sportradar.OddsFeed.SDK.API.Internal.OddsFeedConfigurationSection, Sportradar.OddsFeed.SDK" />
</configSections>
to
<configSections>
<section name="uofSdkSection" type="Sportradar.OddsFeed.SDK.Api.Internal.Config.UofConfigurationSection, Sportradar.OddsFeed.SDK" />
</configSections>
- Added support for StageType.SprintRace
- Introduced OperationManager.MaxConnectionsPerServer property (in DI HttpClientHandler is created with setting MaxConnectionsPerServer)
- Fixed lock issue when calling SportDataProvider.GetActiveTournamentsAsync repeatedly
- Improved performance for market/outcome name generation
- CustomBetManager respects configured ExceptionHandlingStrategy
- BookingManager respects configured ExceptionHandlingStrategy
- Fixed WNS API endpoints (removed /sports/ from url)
- Optimized daily cache population of available sport and category data (does not delete any previous ones anymore)
- Optimized execution of some internal async methods
- Fixed lock issue when calling SportDataProvider.GetActiveTournamentsAsync repeatedly
- Improved performance for market/outcome name generation
- Fixed WNS API endpoints
- Improved speed on API requests with high concurrency
- IProducer extended with Scope property
- Added support for group urn type
- Changing API host for replay to non-global
- Optimizing number of competitor or player profile api calls
- Improvement so less chance the competition event returns null category
- Improvement so less chance the competition event returns null tournament
- Improved recovery retry on missing messages
- Fix ignore fixture_change_fixture endpoint for virtual producers
- Fix for competitor reference print
- Fix configuration apiHost for replay environment
- Fix merging of new sport and category which is not included in All tournaments for all sports endpoint
- Enabled BookingStatus for stages fetches fixture
- Fix for variant market descriptions (to ignore default static market description - effects playerprops markets)
- Fix for fetching missing summary only if required (effects ILongTermEvent entities)
- CustomBet - added support for calculate-filter endpoint
- Improved API data distribution to SportEventCache
- Setup that each API endpoint on critical path has its own HttpClient
- Fix: recovery request url when configuring custom environment
- Improvements for saving api data within caches (single item and for list of items)
- Changed the timestamp for periodic deletion of old event from cache (to now-12h)
- Improved logging format in LogHttpDataFetcher and SportDataProvider
- Improved logging for exceptions and warnings
- Added Age to FeedMessage string
- Added isOpen to OddsFeed
- Separate HttpClient for critical (summary, player profile, competitor profile and variant market description) and other requests
- Added configuration option for fast HttpClient in OperationManager (default timeout 5s)
- Extended ISportDataProvider with GetTimelineEventsAsync
- Improved merging of competitor profile
- Modified sliding expiration of profile cache items to avoid GC congestion
- Improved how SportDataProvider is handling exceptions
- Improved metrics and logging for raw data events
- Improved metrics with app and system metrics
- Added metrics for SemaphorePool
- Fixed exception handling in DataRouterManager
- Extended RawApiDataEventArgs with RequestParams, RequestTime and Language
- Other minor improvements for observability
- Added BetradarName to IRound
- Fix: ICompetition competitors did not expose IsVirtual correctly
- Added support for results in sportEventStatus received from api
- Added new log messages during recovery requests
- Improved how merging is done within Competitor
- Improved connection recovery after long disconnect
- Removed unnecessary locks in SportEventStatusCache
- Fix: connecting to replay server with production token
- Fix: some fields in raw feed message was not filled
- Fix: throws exception if match, stage or draw not found exception happens
- Improvements for connection resilience
- Added event RecoveryInitiated to IOddsFeed
- Added RabitConnectionTimeout and RabbitHeartbeat to OperationManager
- Improved logging regarding connection and recovery process
- Changed default UF environment from Integration to GlobalIntegration
- Extended StageType with Run enum value
- Fix: how connection is made
- Fix: case when 2 rabbit connections are made
- Fix: getting the names of category for simple_tournaments
- Extended configuration with ufEnvironment attribute
- Extended ITokenSetter and IEnvironmentSelector
- New values added to SdkEnvironment enum (GlobalIntegration, GlobalProduction, ProxySingapore, ProxyTokyo)
- Improved exporting/importing and merging of player profile data
- Improved SemaphorePool handling
- Improvement: when fetching non-cached fixture change endpoint fails due to server error, try also normal fixture endpoint
- Improved tracking of last message timestamp per producer
- Fix: DI for SportEventStatusCache
- Fix: wrong max recovery time was used (now default is 1h)
- Fix: issue with concurrency when getting missing languages for competitor profile
- Fix: merging market mapping when no outcome mappings exists
- Fix: how after parameter is checked when adjustAfterAge in config is set
- Other minor improvements and bug fixes
- IStage extended with getStatusAsync method providing IStageStatus and method for getting match status
- Added Prologue value to StageType enum
- Added improvement for connection recovery when disconnection happens
- Fix: implemented safe release of all internal SemaphoreSlims
- Fix: added handling of variant market description when different market id between requesting and received id
- Fix: problem within SemaphorePool not acquiring new semaphore - waiting indefinitely
- Fix: setting configuration via CustomConfigurationBuilder
- Fix: exception with modified competitor players list
- Added OperationManager to provide option to set sdk values
- Added option to ignore sport event status from timeline endpoint for BetPal events
- Added pitcher, batter, pitch_count, pitches_seen, total_hits, total_pitches to SportEventStatus.Properties
- PeriodScore - match status code 120 mapped to penalties
- Improved importing, exporting competitors
- Improved getting competitor players
- Fix: throwing exception when no market description received from API for variant markets
- Extended IMatch with GetEventTimeline for single culture
- IOutcomeProbabilities extended with property AdditionalProbabilities
- IMarketWithProbabilities extended with MarketMetaData
- Extended ITournament with GetScheduleAsync
- Fix: Issue retrieving child stages from parent using GetStagesAsync() method
- Fix: corrected which market description is returned for variant markets
- Improvement: optimized fetching of player/competitor profiles
- Added ISportDataProvider.GetPeriodStatusesAsync to fetch period summary for stages
- Extended ICompetitionStatus with PeriodOfLadder
- Added support for SportEventStatus PeriodOfLeader - added to Properties
- Improved handling of outright market mappings (before for some markets there were no mappings returned)
- Improved merging of Competitor data
- Fix: IMarketWithOdds.GetValidMappings() returns incorrect results
- Fix: parsing TeamStatistics for SportEventStatus
- Added IEventChangeManager to IOddsFeed for periodical fixture and result change updates
- Changed type of property ITimelineEvent.Player from IPlayer to IEventPlayer (breaking change)
- Added IEventPlayer.Bench property in ITimelineEvent.Player property
- Added IGoalScorer.Method in ITimelineEvent.GoalScorer property
- Added property ICompetitor.ShortName
- Added property IProductInfo.IsInLiveMatchTracker
- Improved how internal cache sport event items handle competitor lists
- Changed ExportableCurrentSeasonInfoCI, ExportableGroupCI, ExportableTournamentInfoCI to return Competitors ids as list of string instead of ExportableCompetitorCI
- Improved caching of competitors data on tournaments, seasons
- Reverted populating Round Name, GroupName and PhaseOrGroupLongName to exactly what is received from API
- Updated FixtureChangeType - also if not specified in fixtureChange message returns FixtureChangeType.NA
- Added period_of_leader to the SportEventStatus.Properties
- Added StartTime, EndTime and AamsId to the IMarketMetaData
- Improved connection handling when disconnected
- Improved merging tournament groups (when no group name or id)
- Added some logs for errors when using unaccepted token
- Fix: WNS event ids can have negative value
- Fix: merging tournament groups
- Fix: TeamStatistics returned 0 when actually null
- Fix: EventResult Home and Away Score could be returned as 0, when actually null
- Fix: exporting/importing season data
- Fix: resolution of dependencies - removed some Guard check
- Added ISportDataProvider.GetLotteriesAsync
- Improved translation of market names (upgraded referenced library Humanizer to 2.8.26 and Dawn.Guard to 1.12.0)
- Added support for eSoccer - returns SoccerEvent instead of Match
- Added support for simple_team urn
- Adding removal of obsolete tournament groups
- Improved internal sdk processing. API calls for markets done only per user request. Optimized feed message validation.
- Fix: for a case when sdk does not auto recover after disconnect
- Extended ILottery with GetDraws to return list of IDraw (not just ids)
- Extended ISportDataProvider with GetSportEvent so also IDraw can be obtained
- Fix: getting fixture from API when result is tournamentInfo
- Fix: added removal of obsolete EventTimeline events
- Fix: not getting tournament data for stages
- Fix: getting ScheduleForDay endpoint when no events throw exception
- Fix: missing totalStatistics in SoccerStatus.Statistics
- Fix: soccer events not instance of ISoccerEvent
- Fix: getting null fetching sport and parent stage info for stages
- Added new stage types in StageType enum (Practice, Qualifying, QualifyingPart, Lap)
- Added CashoutStatus to IMarketWithProbabilitiesV1
- Fix: loading sportEventType and stageType from parent stage if available
- Fix: IMarketWithOdds.GetMappedMarketIDsAsync() returns multiple mappings
- Fix: exception casting TournamentInfoCI to StageCI
- IRound - GroupName renamed to Group, added GroupName property (breaking change)
- IStage - added GetAdditionalParentStages, GetStageType (breaking change - result changed from SportEventType to StageType)
- IEventResult extended with Distance and CompetitorResults
- ICompetition extended with GetLiveOdds and GetSportEventType property
- Added Course to the IVenue
- Added Coverage to IMatch
- Improvements in recovery manager
- Added support for markets with outcome_type=competitors
- Make replay manager available before the feed is open
- Improved connection error handling and reporting
- Fix: exception thrown when there are no fixture changes
- Fix: soccer events not instance of ISoccerEvent
- Fix: entities null even though data is present on the API
- Fix: event status enumeration
- Extended SeasonInfo with startDate, endDate, year and tournamentId
- Fix: special case when recovery status does not reflect actual state - results in wrong triggering ProducerUp-Down event
- Fix: URN.TryParse could throw unhandled exception
- Fix: several issues with CustomBet(Manager) fixed
- Fix: Export-Import breaks on missing data
- Fix: Lottery throws exception when no schedule is obtained from api
- Fix: missing nodeId in snapshot_complete routing key
- Fix: SportDataProvider.GetActiveTournaments returned null
- Fix: SportEventCache: improved locking mechanism on period fetching of schedule for a date
- Fix: reloading market description in case variant descriptions are not available
- Improved logging of initial message processing
- Added GetSportAsync() and GetCategoryAsync() to ICompetitor interface
- Throttling recovery requests
- Fix: support Replay routing keys without node id
- Fix: calling Replay fixture endpoint with node id
- Added support for configuring HTTP timeout
- Added overloaded methods for fixture and result changes with filters
- Updated supported languages
- Removed logging of feed message for disabled producers
- Exposed RawMessage on UnparsableMessageEventArgs
- Changed retention policy for variant market cache
- Improved reporting of invalid message interest combinations
- Fix: Synchronized Producer Up/Down event dispatching
- Fix: Disposing of Feed instance
- Fix: Permanent failure to open connection to feed
- Added FullName, Nickname and CountryCode to IPlayerProfile
- Added support for result changes endpoint
- IMatchStatus provide nullable Home and Away score (extended with IMatchStatusV1)
- Fix: MaxRecoveryTime is properly used to check for timeouts
- Added GetScheduleAsync to the BasicTournament
- Added bookmakerId to the ClientProperties
- Fix: fixture endpoint on Replay
- Fix: refreshing categories after complete sport data cache reload
- Changed Replay API URL
- Fix: invalid timestamp for cashout probabilities
- Fix: handle settlement markets without outcomes
- Fix: EventRecoveryCompleted is properly raised when snapshot completes
- Fix: added IOutcomeSettlement.OutcomeResult instead of IOutcomeSettlement.Result (obsolete)
- Fix: competitor references for seasons
- Fix: failing API requests on some configurations
- Added State to the Competitor
- Added State to the Venue
- Extended ISportInfoProvider.DeleteSportEventFromCache with option to delete sport event status
- Improved logging for connection errors
- Improved fetching fixtures for Replay environment
- Fix: calling variant endpoint only if user requests market data
- Fix: NullPointerException in ReplayManager
- Fix: DI error for FeedRecoveryManager
- Added new Replay API endpoints
- Updated DemoProject to use ILoggerFactory
- Added metrics to SpecificEntityWriter in DemoProject
- Fix: fetching outcome mappings for special markets that exists only on dynamic variant endpoint
- Port of UF SDK to .NET Standard 2.1
- Replaced Metrics.NET with App.Metrics
- Replaced Code.Contracts with Dawn.Guard conditions
- Replaced Common.Logging with Microsoft.Extensions.Logging
- Upgraded RabbitMQ.Client to v5.1.2
- Upgraded Newtonsoft.Json to v12.0.3
- Upgraded Unity to 5.11.3
- Removed obsolete methods and properties
- Merged V1, V2, ... extended interfaces into base one