PinballApi 4.0.0

dotnet add package PinballApi --version 4.0.0
                    
NuGet\Install-Package PinballApi -Version 4.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="PinballApi" Version="4.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="PinballApi" Version="4.0.0" />
                    
Directory.Packages.props
<PackageReference Include="PinballApi" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add PinballApi --version 4.0.0
                    
#r "nuget: PinballApi, 4.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package PinballApi@4.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=PinballApi&version=4.0.0
                    
Install as a Cake Addin
#tool nuget:?package=PinballApi&version=4.0.0
                    
Install as a Cake Tool

PinballApi - .NET API for pinball data. Includes API Client wrappers in .NET for the IFPA, OPDB (via MatchPlay), IPDB and MatchPlay.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.0.0 84 8/28/2026
3.2.8 180 6/26/2026
3.2.7 156 5/24/2026
3.2.6 224 1/12/2026
3.2.5 302 12/7/2025
3.2.4 283 11/23/2025
3.2.3 269 11/23/2025
3.2.2 345 9/30/2025
3.2.1 317 9/21/2025
3.2.0 311 9/21/2025
3.1.15 345 8/17/2025
3.1.14 266 8/17/2025
3.1.13 491 5/29/2025
3.1.10 280 4/26/2025
3.1.9 346 4/20/2025
3.1.8 324 2/28/2025
3.1.7 284 2/20/2025
3.1.6 305 2/13/2025
Loading failed

BREAKING: OPDB data moved to MatchPlay. opdb.org shut its API endpoints down on 2026-10-01.

OPDB
- Removed OPDBApi, IOpdbApi and every model under PinballApi.Models.OPDB. Those endpoints no longer exist.
- Added OPDB and PinTips support to MatchPlayApi: GetOpdbEntry, GetOpdbChangelog, GetPinTipsByOpdbId and GetPinTipsByArenaId.
- Added the MatchPlay bulk data exports: GetOpdbExport, GetOpdbSlimExport and GetPinTipsExport. They need no API token.
- Added models under PinballApi.Models.MatchPlay.Opdb, including OpdbIdParts to split an OPDB id into its group, machine and alias parts.

Fixes
- GetArenas, GetLocations and GetPlayers dropped their id filters. They called a Flurl overload that adds parameters without values, so the API returned every record. The filters now work.
- GetTournament sent every include flag whether or not you asked for it, because the API reads the flags by presence. It now sends only the flags you set. Responses get smaller and callers that relied on always-on includes must now ask for them.
- Game.ResultPoints is List<float?> and Game.ResultScores is List<ulong?>. They were List<string> and List<object>. TournamentGame no longer hides them.

New endpoints
- ResolveUnknownPlayers, ResolveUnknownArenas, ResolveUnknownUsers, ResolveUnknownTournamentPlayers and ResolveUnknownTournamentArenas turn bare ids into full objects.
- GetTournamentArenaSummary, GetTournamentPlayerArenaSummary and GetTournamentMatchSummary.
- GetGames accepts series ids, game ids and a page. GetSinglePlayerGames and GetCards accept the full documented filter set. GetTournaments accepts a limit. GetTournament accepts includeEntryConfiguration, includeLinkedTournaments and includeEvent.

API shape
- Every async method takes a trailing CancellationToken. A cancelled call raises OperationCanceledException, not an API error.
- Failed calls raise PinballApiException instead of Flurl's FlurlHttpException. It carries StatusCode, ResponseBody, RequestUrl and the IsNotFound, IsUnauthorized and IsRateLimited helpers. The Flurl exception stays as InnerException.
- Added Enumerate* methods returning IAsyncEnumerable for every paged endpoint, so callers stop hand-rolling page loops.
- GetArenas takes List<int> arena ids. It took List<string> while every other id parameter took ints.
- Renamed for consistency: GetSeries list overload to GetSeriesList, GetMatchplayRoundStats to GetRoundStats, GetMatchplayArenaStats to GetArenaStats, GetMatchplayPlayerStats to GetPlayerStats, GetMatchplayMatchesStats to GetMatchStats, GetMatchplayGames to GetTournamentGames, GetTopFiveScoresByArena to GetTopScoresByArena.
- Removed GetMatchplayGame. It called the same endpoint as GetGame, which now returns TournamentGame with the players attached.
- Removed the MatchplayGames model. It duplicated Game with weaker types. Round.Games and the game endpoints use TournamentGame.
- Typed the remaining object members: User.Avatar and User.Banner are strings, Game.Suggestions is List<Suggestion>, and TournamentArena gained the fields the API actually returns.

Other
- Added an opt-in rate limit retry. new MatchPlayApi(token, rateLimitRetryCount: 2) waits out an HTTP 429 and sends the request again, honouring Retry-After and x-ratelimit-reset. The default of 0 keeps the old behaviour.
- MatchPlayApi now reuses one Flurl client instead of building a request from a string on every call.
- Added IMatchPlayApi so the client can be injected and replaced in tests.
- Upgraded HtmlAgilityPack to 1.13.0 and Humanizer.Core to 3.0.10.
- GetQueues returns List<Queue> instead of always throwing. GetMatchplayMatchesStats calls the API instead of always throwing.
- Renamed the GetIfpaEstimate parameter touramentId to tournamentId.
- Removed GetDashboard and GetAmazingRace. The first is a dead endpoint, the second never had an implementation.

To migrate off OPDBApi: replace it with MatchPlayApi and a MatchPlay API token. GetMachineInfo becomes GetOpdbEntry and Export becomes GetOpdbExport. Search, TypeAheadSearch and GetMachineInfoByIpdbId have no endpoint. Download an export and query your own store.