PinballApi 4.0.0
dotnet add package PinballApi --version 4.0.0
NuGet\Install-Package PinballApi -Version 4.0.0
<PackageReference Include="PinballApi" Version="4.0.0" />
<PackageVersion Include="PinballApi" Version="4.0.0" />
<PackageReference Include="PinballApi" />
paket add PinballApi --version 4.0.0
#r "nuget: PinballApi, 4.0.0"
#:package PinballApi@4.0.0
#addin nuget:?package=PinballApi&version=4.0.0
#tool nuget:?package=PinballApi&version=4.0.0
PinballApi - .NET API for pinball data. Includes API Client wrappers in .NET for the IFPA, OPDB (via MatchPlay), IPDB and MatchPlay.
| Product | Versions 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. |
-
net10.0
- Flurl (>= 4.0.0)
- Flurl.Http (>= 4.0.2)
- HtmlAgilityPack (>= 1.13.0)
- Humanizer.Core (>= 3.0.10)
-
net8.0
- Flurl (>= 4.0.0)
- Flurl.Http (>= 4.0.2)
- HtmlAgilityPack (>= 1.13.0)
- Humanizer.Core (>= 3.0.10)
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 | 174 | 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 |
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.