UnifiedOdds Feed SDK .NET library (.NET Standard 2.1) 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 - App.Metrics (3.2.0) - Castle.Core (4.4.0) - Dawn.Guard (1.12.0) - Humanizer (2.8.26) - Microsoft.CSharp (4.7.0) - Microsoft.Extensions.Logging (3.1.0) - Newtonsoft.Json (12.0.3) - RabbitMQ.Client (4.7.0) - Unity (5.11.3) The package contains: - DemoProject: A Visual Studio 2019 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 support@sportradar.com or visit https://iodocs.betradar.com/unifiedsdk/index.html CHANGE LOG: 2022-09-20 1.28.0 CustomBet - added support for calculate-filter endpoint 2022-07-15 1.27.0 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 2022-06-02 1.26.0 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 2022-04-26 1.25.0 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 2022-02-23 1.24.0 Added BetradarName to IRound Fix: ICompetition competitors did not expose IsVirtual correctly 2021-12-10 1.23.0 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 2021-11-18 1.22.0 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 2021-10-06 1.21.0 Extended configuration with ufEnvironment attribute Extended ITokenSetter and IEnvironmentSelector New values added to SdkEnvironment enum (GlobalIntegration, GlobalProduction, ProxySingapore, ProxyTokyo) 2021-09-09 1.20.0 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 2021-07-23 1.19.0 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 2021-07-07 1.18.1 Fix: problem within SemaphorePool not acquiring new semaphore - waiting indefinitely Fix: setting configuration via CustomConfigurationBuilder Fix: exception with modified competitor players list 2021-06-23 1.18.0 Added OperationManager to provide option to set sdk values Added option to ignore sport event status from timeline endpoint for BetPal events 2021-06-15 1.17.0 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 2021-05-28 1.16.0 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 2021-04-29 1.15.0 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 2021-04-07 1.14.1 Fix: parsing TeamStatistics for SportEventStatus 2021-03-31 1.14.0 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 2021-02-09 1.13.0 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 2020-12-15 1.12.0 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 2020-12-04 1.11.1 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 2020-11-13 1.11.0 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 2020-10-13 1.10.0 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 2020-08-19 1.9.0 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 2020-07-09 1.8.0 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 2020-06-24 1.7.0 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 2020-05-11 1.6.0 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 2020-04-16 1.5.0 Added GetScheduleAsync to the BasicTournament Added bookmakerId to the ClientProperties Fix: fixture endpoint on Replay Fix: refreshing categories after complete sport data cache reload 2020-03-25 1.4.1 Changed Replay API URL 2020-03-23 1.4.0 Fix: invalid timestamp for cashout probabilities Fix: handle settlement markets without outcomes Fix: EventRecoveryCompleted is properly raised when snapshot completes 2020-03-16 1.3.0 Fix: added IOutcomeSettlement.OutcomeResult instead of IOutcomeSettlement.Result (obsolete) Fix: competitor references for seasons Fix: failing API requests on some configurations 2020-02-18 1.2.0 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 2020-01-15 1.1.1 Fix: DI error for FeedRecoveryManager 2020-01-14 1.1.0 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 2020-01-06 1.0.0 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