diff --git a/CHANGELOG.md b/CHANGELOG.md index b9c747c..f5b5664 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 0.3.5 — 2026-10-12 + +- List every supported endpoint in the repository and package READMEs. +- Add platform-specific search keywords to the npm, PyPI, and Composer package metadata. + ## 0.3.4 — 2026-10-09 - Keep the platform README as a language-package index without cross-language installation commands or code examples; pkg.go.dev now shows only its Go example. diff --git a/README.md b/README.md index d74ba50..140524f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # SofaScore clients for Crawlora -Official Crawlora client packages for the hosted SofaScore API. These clients call Crawlora's hosted API; they do not scrape SofaScore locally. Requests use your Crawlora account and `CRAWLORA_API_KEY`; service usage follows your account billing plan. Crawlora is independent from and not affiliated with or endorsed by SofaScore or its owners. +Official Crawlora client packages for the hosted SofaScore API. Access 109 API endpoints covering live events, match details, lineups, statistics, tournaments, and player/team data from JavaScript/TypeScript, Python, Go, Ruby, Java, and PHP. These clients call Crawlora's hosted API; they do not scrape SofaScore locally. Requests use your Crawlora account and `CRAWLORA_API_KEY`; service usage follows your account billing plan. Crawlora is independent from and not affiliated with or endorsed by SofaScore or its owners. ## Language packages @@ -8,16 +8,128 @@ Official Crawlora client packages for the hosted SofaScore API. These clients ca - Python: [`crawlora-sofascore`](python/README.md) - Go: [`github.com/Crawlora-org/crawlora-sofascore`](go.mod) - Ruby: [`crawlora-sofascore`](ruby/README.md) -- Java: [`net.crawlora:crawlora-sofascore:0.3.4`](java/README.md) +- Java: [`net.crawlora:crawlora-sofascore:0.3.5`](java/README.md) - PHP: [`crawlora/sofascore`](php/README.md) For installation and runnable examples, use the README for your language. See the [API endpoint and parameter reference](docs/usage.md) for shared operation details. Create an account at [crawlora.net](https://crawlora.net/signup?utm_source=github&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-repository-signup), open the [Crawlora console](https://crawlora.net/app?utm_source=github&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-repository-console) to get an API key, or read the [API documentation](https://crawlora.net/docs?utm_source=github&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-repository-api-docs). Keep `CRAWLORA_API_KEY` out of source control. -## API coverage +## API coverage and supported endpoints -The six clients provide access to 109 public API operations. See the [API reference](docs/usage.md) for supported operations, parameters, and response details. +The six language clients provide access to all 109 selected public SofaScore API operations. Search or browse by endpoint path and operation ID below; the [complete API reference](docs/usage.md) adds parameters, enums, and response details. + +| Method | Endpoint | API operation | Description | +| --- | --- | --- | --- | +| `GET` | `/sofascore/categories` | `sofascore-categories` | SofaScore categories for a sport | +| `GET` | `/sofascore/category-tournaments` | `sofascore-category-tournaments` | SofaScore competitions in a category | +| `GET` | `/sofascore/draft` | `sofascore-draft` | SofaScore league draft | +| `GET` | `/sofascore/draft-picks` | `sofascore-draft-picks` | SofaScore league draft picks | +| `GET` | `/sofascore/esports-game` | `sofascore-esports-game` | SofaScore esports game detail | +| `GET` | `/sofascore/event` | `sofascore-event` | SofaScore event detail | +| `GET` | `/sofascore/event-at-bat-pitches` | `sofascore-event-at-bat-pitches` | SofaScore event at-bat pitches | +| `GET` | `/sofascore/event-at-bats` | `sofascore-event-at-bats` | SofaScore event at-bats | +| `GET` | `/sofascore/event-average-positions` | `sofascore-event-average-positions` | SofaScore event average positions | +| `GET` | `/sofascore/event-baseball-top-performers` | `sofascore-event-baseball-top-performers` | SofaScore event baseball top performers | +| `GET` | `/sofascore/event-best-players` | `sofascore-event-best-players` | SofaScore event best players | +| `GET` | `/sofascore/event-comments` | `sofascore-event-comments` | SofaScore event commentary | +| `GET` | `/sofascore/event-esports-games` | `sofascore-event-esports-games` | SofaScore event esports games | +| `GET` | `/sofascore/event-graph` | `sofascore-event-graph` | SofaScore event momentum graph | +| `GET` | `/sofascore/event-h2h` | `sofascore-event-h2h` | SofaScore event head-to-head | +| `GET` | `/sofascore/event-highlights` | `sofascore-event-highlights` | SofaScore event highlights | +| `GET` | `/sofascore/event-incidents` | `sofascore-event-incidents` | SofaScore event incidents | +| `GET` | `/sofascore/event-innings` | `sofascore-event-innings` | SofaScore event innings | +| `GET` | `/sofascore/event-lineups` | `sofascore-event-lineups` | SofaScore event lineups | +| `GET` | `/sofascore/event-managers` | `sofascore-event-managers` | SofaScore event managers | +| `GET` | `/sofascore/event-odds` | `sofascore-event-odds` | SofaScore event odds | +| `GET` | `/sofascore/event-player-heatmap` | `sofascore-event-player-heatmap` | SofaScore event player heatmap | +| `GET` | `/sofascore/event-player-statistics` | `sofascore-event-player-statistics` | SofaScore event player statistics | +| `GET` | `/sofascore/event-point-by-point` | `sofascore-event-point-by-point` | SofaScore event point-by-point | +| `GET` | `/sofascore/event-pregame-form` | `sofascore-event-pregame-form` | SofaScore event pre-game form | +| `GET` | `/sofascore/event-shotmap` | `sofascore-event-shotmap` | SofaScore event shot map | +| `GET` | `/sofascore/event-statistics` | `sofascore-event-statistics` | SofaScore event statistics | +| `GET` | `/sofascore/event-team-heatmap` | `sofascore-event-team-heatmap` | SofaScore event team heatmap | +| `GET` | `/sofascore/event-team-streaks` | `sofascore-event-team-streaks` | SofaScore event team streaks | +| `GET` | `/sofascore/event-tennis-power` | `sofascore-event-tennis-power` | SofaScore event tennis power | +| `GET` | `/sofascore/event-tv-channels` | `sofascore-event-tv-channels` | SofaScore event TV channels | +| `GET` | `/sofascore/event-votes` | `sofascore-event-votes` | SofaScore event votes | +| `GET` | `/sofascore/live-events` | `sofascore-live-events` | SofaScore live events | +| `GET` | `/sofascore/manager` | `sofascore-manager` | SofaScore manager detail | +| `GET` | `/sofascore/manager-events` | `sofascore-manager-events` | SofaScore manager recent matches | +| `GET` | `/sofascore/mma-card` | `sofascore-mma-card` | SofaScore MMA card | +| `GET` | `/sofascore/mma-schedule` | `sofascore-mma-schedule` | SofaScore MMA schedule | +| `GET` | `/sofascore/odds-dropping` | `sofascore-odds-dropping` | SofaScore dropping odds | +| `GET` | `/sofascore/odds-winning` | `sofascore-odds-winning` | SofaScore winning odds | +| `GET` | `/sofascore/player` | `sofascore-player` | SofaScore player detail | +| `GET` | `/sofascore/player-attributes` | `sofascore-player-attributes` | SofaScore player attributes and characteristics | +| `GET` | `/sofascore/player-events` | `sofascore-player-events` | SofaScore player matches with per-match numbers | +| `GET` | `/sofascore/player-last-year-summary` | `sofascore-player-last-year-summary` | SofaScore player form over the last year | +| `GET` | `/sofascore/player-national-team-statistics` | `sofascore-player-national-team-statistics` | SofaScore player national team record | +| `GET` | `/sofascore/player-penalty-history` | `sofascore-player-penalty-history` | SofaScore player penalty history | +| `GET` | `/sofascore/player-ratings` | `sofascore-player-ratings` | SofaScore player match ratings for a season | +| `GET` | `/sofascore/player-season-heatmap` | `sofascore-player-season-heatmap` | SofaScore player season heatmap | +| `GET` | `/sofascore/player-season-statistics` | `sofascore-player-season-statistics` | SofaScore player season statistics | +| `GET` | `/sofascore/player-statistical-rankings` | `sofascore-player-statistical-rankings` | SofaScore player ranking among all players in a season | +| `GET` | `/sofascore/player-statistics-seasons` | `sofascore-player-statistics-seasons` | SofaScore player statistics seasons | +| `GET` | `/sofascore/player-tournaments` | `sofascore-player-tournaments` | SofaScore player competitions | +| `GET` | `/sofascore/player-transfers` | `sofascore-player-transfers` | SofaScore player transfer history | +| `GET` | `/sofascore/ranking-types` | `sofascore-ranking-types` | SofaScore ranking catalogue | +| `GET` | `/sofascore/rankings` | `sofascore-rankings` | SofaScore rankings | +| `GET` | `/sofascore/referee` | `sofascore-referee` | SofaScore referee profile | +| `GET` | `/sofascore/referee-events` | `sofascore-referee-events` | SofaScore referee officiated matches | +| `GET` | `/sofascore/referee-statistics` | `sofascore-referee-statistics` | SofaScore referee card statistics | +| `GET` | `/sofascore/round-events` | `sofascore-round-events` | SofaScore round fixtures | +| `GET` | `/sofascore/scheduled-events` | `sofascore-scheduled-events` | SofaScore events scheduled in a category on a date | +| `GET` | `/sofascore/scheduled-tournaments` | `sofascore-scheduled-tournaments` | SofaScore tournaments scheduled on a date | +| `GET` | `/sofascore/search` | `sofascore-search` | SofaScore universal search | +| `GET` | `/sofascore/search-typed` | `sofascore-search-typed` | SofaScore search by entity type | +| `GET` | `/sofascore/season-events` | `sofascore-season-events` | SofaScore season fixtures and results | +| `GET` | `/sofascore/sports` | `sofascore-sports` | SofaScore supported sports | +| `GET` | `/sofascore/stage` | `sofascore-stage` | SofaScore motorsport and cycling stage | +| `GET` | `/sofascore/stage-categories` | `sofascore-stage-categories` | SofaScore motorsport and cycling categories and competitions | +| `GET` | `/sofascore/stage-driver-performance` | `sofascore-stage-driver-performance` | SofaScore motorsport race progress per driver | +| `GET` | `/sofascore/stage-featured` | `sofascore-stage-featured` | SofaScore featured motorsport and cycling events | +| `GET` | `/sofascore/stage-schedule` | `sofascore-stage-schedule` | SofaScore motorsport and cycling events around a date | +| `GET` | `/sofascore/stage-seasons` | `sofascore-stage-seasons` | SofaScore seasons of a motorsport or cycling competition | +| `GET` | `/sofascore/stage-standings` | `sofascore-stage-standings` | SofaScore motorsport and cycling stage standings | +| `GET` | `/sofascore/stage-substages` | `sofascore-stage-substages` | SofaScore children of a motorsport or cycling stage | +| `GET` | `/sofascore/standings` | `sofascore-standings` | SofaScore standings | +| `GET` | `/sofascore/team` | `sofascore-team` | SofaScore team detail | +| `GET` | `/sofascore/team-achievements` | `sofascore-team-achievements` | SofaScore team trophies | +| `GET` | `/sofascore/team-events` | `sofascore-team-events` | SofaScore team fixtures | +| `GET` | `/sofascore/team-goal-distributions` | `sofascore-team-goal-distributions` | SofaScore team goals by match minute | +| `GET` | `/sofascore/team-near-events` | `sofascore-team-near-events` | SofaScore team previous and next match | +| `GET` | `/sofascore/team-of-the-week` | `sofascore-team-of-the-week` | SofaScore team of the week | +| `GET` | `/sofascore/team-of-the-week-periods` | `sofascore-team-of-the-week-periods` | SofaScore team of the week periods | +| `GET` | `/sofascore/team-performance` | `sofascore-team-performance` | SofaScore team recent performance | +| `GET` | `/sofascore/team-player-statistics` | `sofascore-team-player-statistics` | SofaScore team player statistics | +| `GET` | `/sofascore/team-player-statistics-seasons` | `sofascore-team-player-statistics-seasons` | SofaScore team player statistics seasons | +| `GET` | `/sofascore/team-players` | `sofascore-team-players` | SofaScore team players | +| `GET` | `/sofascore/team-rankings` | `sofascore-team-rankings` | SofaScore team rankings | +| `GET` | `/sofascore/team-season-statistics` | `sofascore-team-season-statistics` | SofaScore team season statistics | +| `GET` | `/sofascore/team-statistics-seasons` | `sofascore-team-statistics-seasons` | SofaScore team statistics seasons | +| `GET` | `/sofascore/team-top-players` | `sofascore-team-top-players` | SofaScore team top players | +| `GET` | `/sofascore/team-tournaments` | `sofascore-team-tournaments` | SofaScore team competitions | +| `GET` | `/sofascore/team-transfers` | `sofascore-team-transfers` | SofaScore team transfers | +| `GET` | `/sofascore/tennis-player-grand-slam-results` | `sofascore-tennis-player-grand-slam-results` | SofaScore tennis player grand slam results | +| `GET` | `/sofascore/tournament-cuptree` | `sofascore-tournament-cuptree` | SofaScore competition knockout tree | +| `GET` | `/sofascore/tournament-info` | `sofascore-tournament-info` | SofaScore competition info | +| `GET` | `/sofascore/tournament-player-of-the-season` | `sofascore-tournament-player-of-the-season` | SofaScore player of the season | +| `GET` | `/sofascore/tournament-player-statistics` | `sofascore-tournament-player-statistics` | SofaScore season player statistics table | +| `GET` | `/sofascore/tournament-rounds` | `sofascore-tournament-rounds` | SofaScore competition season rounds | +| `GET` | `/sofascore/tournament-seasons` | `sofascore-tournament-seasons` | SofaScore competition seasons | +| `GET` | `/sofascore/tournament-statistics-info` | `sofascore-tournament-statistics-info` | SofaScore player statistics table filters | +| `GET` | `/sofascore/tournament-team-of-the-season` | `sofascore-tournament-team-of-the-season` | SofaScore team of the season | +| `GET` | `/sofascore/tournament-teams` | `sofascore-tournament-teams` | SofaScore teams of a competition season | +| `GET` | `/sofascore/tournament-top-players` | `sofascore-tournament-top-players` | SofaScore season top players | +| `GET` | `/sofascore/tournament-top-teams` | `sofascore-tournament-top-teams` | SofaScore season top teams | +| `GET` | `/sofascore/tournament-venues` | `sofascore-tournament-venues` | SofaScore venues of a competition season | +| `GET` | `/sofascore/tournament-winners` | `sofascore-tournament-winners` | SofaScore past winners of a competition | +| `GET` | `/sofascore/tournaments-with-feature` | `sofascore-tournaments-with-feature` | SofaScore competitions that carry a feature | +| `GET` | `/sofascore/trending-events` | `sofascore-trending-events` | SofaScore trending events | +| `GET` | `/sofascore/trending-players` | `sofascore-trending-players` | SofaScore trending players | +| `GET` | `/sofascore/venue` | `sofascore-venue` | SofaScore venue | +| `GET` | `/sofascore/venue-events` | `sofascore-venue-events` | SofaScore matches at a venue | ## License diff --git a/client.go b/client.go index 8af83aa..bc27162 100644 --- a/client.go +++ b/client.go @@ -1,8 +1,9 @@ -// Package sofascore is a focused Go client for Crawlora's SofaScore endpoints. +// Package sofascore is Crawlora's SofaScore API client for 109 endpoints, covering live events, match details, lineups, statistics, tournaments, and player/team data. // API documentation: https://crawlora.net/docs?utm_source=pkg.go.dev&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-go-api-docs package sofascore import ( + "bytes" "context" "encoding/json" "fmt" @@ -17,7 +18,7 @@ import ( const ( DefaultBaseURL = "https://api.crawlora.net/api/v1" - Version = "0.3.4" + Version = "0.3.5" ) // Params maps the exact OpenAPI parameter names expected by this platform client. @@ -62,12 +63,31 @@ func (c *Client) Call(ctx context.Context, operationID string, params Params) (a if !ok { return nil, fmt.Errorf("unknown SofaScore operation: %s", operationID) } - if operation.Method != http.MethodGet { + if operation.Method != http.MethodGet && operation.Method != http.MethodPost { return nil, fmt.Errorf("unsupported HTTP method %s for %s", operation.Method, operationID) } if params == nil { params = Params{} } + var payload io.Reader + if operation.BodyParam != "" { + // The JSON body is passed under the operation's body parameter name or "body". + value, ok := params[operation.BodyParam] + if !ok || value == nil { + value, ok = params["body"] + } + if !ok || value == nil { + if operation.BodyRequired { + return nil, fmt.Errorf("missing required request body: %s", operation.BodyParam) + } + } else { + encoded, err := json.Marshal(value) + if err != nil { + return nil, fmt.Errorf("encode request body: %w", err) + } + payload = bytes.NewReader(encoded) + } + } requestURL, err := buildURL(c.BaseURL, operation, params) if err != nil { return nil, err @@ -77,11 +97,14 @@ func (c *Client) Call(ctx context.Context, operationID string, params Params) (a ctx, cancel = context.WithTimeout(ctx, c.Timeout) defer cancel() } - request, err := http.NewRequestWithContext(ctx, http.MethodGet, requestURL, nil) + request, err := http.NewRequestWithContext(ctx, operation.Method, requestURL, payload) if err != nil { return nil, err } - request.Header.Set("User-Agent", "crawlora-sofascore-go/0.3.4") + if payload != nil { + request.Header.Set("Content-Type", "application/json") + } + request.Header.Set("User-Agent", "crawlora-sofascore-go/0.3.5") for _, security := range operation.Security { if security == "ApiKeyAuth" && c.APIKey != "" { request.Header.Set("x-api-key", c.APIKey) diff --git a/composer.json b/composer.json index d27ce29..a3d8e8f 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,23 @@ { "name": "crawlora/sofascore", - "description": "SofaScore client for the Crawlora hosted API", + "description": "Crawlora SofaScore API client with 109 endpoints for live events, match details, lineups, statistics, tournaments, and player/team data", + "keywords": [ + "crawlora", + "api-client", + "sdk", + "web-scraping", + "scraping-api", + "sofascore", + "sofascore-api", + "sofascore-scraper", + "sofascore-data", + "sofascore-live-events", + "sofascore-match-details", + "sofascore-lineups", + "sofascore-statistics", + "sofascore-tournaments", + "sofascore-player-team-data" + ], "type": "library", "license": "MIT", "require": { diff --git a/docs/usage.md b/docs/usage.md index 20f98b7..9d97879 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,8 +1,8 @@ -# SofaScore client usage +# SofaScore API endpoint reference and client usage -The `@crawlora-org/sofascore` and `crawlora-sofascore` packages call Crawlora's hosted API. Set `CRAWLORA_API_KEY` to a key for your Crawlora account before making requests. Service usage is billed under that account. These clients do not run a browser or scrape SofaScore locally; Crawlora is independent from and not endorsed by SofaScore or its owners. +This reference lists all 109 public SofaScore API endpoints exposed by the `@crawlora-org/sofascore` and `crawlora-sofascore` packages, covering live events, match details, lineups, statistics, tournaments, and player/team data. The clients call Crawlora's hosted API. Set `CRAWLORA_API_KEY` to a key for your Crawlora account before making requests. Service usage is billed under that account. These clients do not run a browser or scrape SofaScore locally; Crawlora is independent from and not endorsed by SofaScore or its owners. -The package tracks the public API contract revision `sha256:645115670262bb86bf9c49f16ddbfdd94bbec67befb2aa8497f10f86ee2d5e46` bundled with release `0.3.4`. Maintainers can preview daily contract updates with the repository's `Sync live API contract` workflow; unchanged contracts do not produce package releases. +The package tracks the public API contract revision `sha256:645115670262bb86bf9c49f16ddbfdd94bbec67befb2aa8497f10f86ee2d5e46` bundled with release `0.3.5`. Maintainers can preview daily contract updates with the repository's `Sync live API contract` workflow; unchanged contracts do not produce package releases. Both packages expose all 109 operations in the bundled API contract. JavaScript uses camelCase methods and Python uses snake_case methods. Methods also remain available through the `sofascore` group and the generated `Client` alias. diff --git a/java/README.md b/java/README.md index 6ee674d..cdad24e 100644 --- a/java/README.md +++ b/java/README.md @@ -1,6 +1,6 @@ -# Crawlora SofaScore Java Client +# Crawlora SofaScore API client for Java -The official Java client for Crawlora's hosted SofaScore API. It calls Crawlora's hosted API with your `x-api-key`; it does not connect to the upstream site directly. +The official Java client for Crawlora's hosted SofaScore API. It exposes 109 endpoints covering live events, match details, lineups, statistics, tournaments, and player/team data. Requests use your `x-api-key`; the client does not connect to the upstream site directly. ## Install @@ -8,7 +8,7 @@ The official Java client for Crawlora's hosted SofaScore API. It calls Crawlora' net.crawlora crawlora-sofascore - 0.3.4 + 0.3.5 ``` @@ -31,6 +31,122 @@ Each operation has a direct method that accepts the parameters documented for th For custom hosted API routing and timeouts, use `new Client(apiKey, baseUrl, Duration.ofSeconds(20))`. Text responses are returned as `String`; JSON responses are parsed into Java maps, lists, and scalar values. +## Supported SofaScore API endpoints + +Browse every route included in this Java package. The [endpoint reference](https://github.com/Crawlora-org/crawlora-sofascore/blob/main/docs/usage.md) also lists parameters and response details. + +| Method | Endpoint | API operation | Description | +| --- | --- | --- | --- | +| `GET` | `/sofascore/categories` | `sofascore-categories` | SofaScore categories for a sport | +| `GET` | `/sofascore/category-tournaments` | `sofascore-category-tournaments` | SofaScore competitions in a category | +| `GET` | `/sofascore/draft` | `sofascore-draft` | SofaScore league draft | +| `GET` | `/sofascore/draft-picks` | `sofascore-draft-picks` | SofaScore league draft picks | +| `GET` | `/sofascore/esports-game` | `sofascore-esports-game` | SofaScore esports game detail | +| `GET` | `/sofascore/event` | `sofascore-event` | SofaScore event detail | +| `GET` | `/sofascore/event-at-bat-pitches` | `sofascore-event-at-bat-pitches` | SofaScore event at-bat pitches | +| `GET` | `/sofascore/event-at-bats` | `sofascore-event-at-bats` | SofaScore event at-bats | +| `GET` | `/sofascore/event-average-positions` | `sofascore-event-average-positions` | SofaScore event average positions | +| `GET` | `/sofascore/event-baseball-top-performers` | `sofascore-event-baseball-top-performers` | SofaScore event baseball top performers | +| `GET` | `/sofascore/event-best-players` | `sofascore-event-best-players` | SofaScore event best players | +| `GET` | `/sofascore/event-comments` | `sofascore-event-comments` | SofaScore event commentary | +| `GET` | `/sofascore/event-esports-games` | `sofascore-event-esports-games` | SofaScore event esports games | +| `GET` | `/sofascore/event-graph` | `sofascore-event-graph` | SofaScore event momentum graph | +| `GET` | `/sofascore/event-h2h` | `sofascore-event-h2h` | SofaScore event head-to-head | +| `GET` | `/sofascore/event-highlights` | `sofascore-event-highlights` | SofaScore event highlights | +| `GET` | `/sofascore/event-incidents` | `sofascore-event-incidents` | SofaScore event incidents | +| `GET` | `/sofascore/event-innings` | `sofascore-event-innings` | SofaScore event innings | +| `GET` | `/sofascore/event-lineups` | `sofascore-event-lineups` | SofaScore event lineups | +| `GET` | `/sofascore/event-managers` | `sofascore-event-managers` | SofaScore event managers | +| `GET` | `/sofascore/event-odds` | `sofascore-event-odds` | SofaScore event odds | +| `GET` | `/sofascore/event-player-heatmap` | `sofascore-event-player-heatmap` | SofaScore event player heatmap | +| `GET` | `/sofascore/event-player-statistics` | `sofascore-event-player-statistics` | SofaScore event player statistics | +| `GET` | `/sofascore/event-point-by-point` | `sofascore-event-point-by-point` | SofaScore event point-by-point | +| `GET` | `/sofascore/event-pregame-form` | `sofascore-event-pregame-form` | SofaScore event pre-game form | +| `GET` | `/sofascore/event-shotmap` | `sofascore-event-shotmap` | SofaScore event shot map | +| `GET` | `/sofascore/event-statistics` | `sofascore-event-statistics` | SofaScore event statistics | +| `GET` | `/sofascore/event-team-heatmap` | `sofascore-event-team-heatmap` | SofaScore event team heatmap | +| `GET` | `/sofascore/event-team-streaks` | `sofascore-event-team-streaks` | SofaScore event team streaks | +| `GET` | `/sofascore/event-tennis-power` | `sofascore-event-tennis-power` | SofaScore event tennis power | +| `GET` | `/sofascore/event-tv-channels` | `sofascore-event-tv-channels` | SofaScore event TV channels | +| `GET` | `/sofascore/event-votes` | `sofascore-event-votes` | SofaScore event votes | +| `GET` | `/sofascore/live-events` | `sofascore-live-events` | SofaScore live events | +| `GET` | `/sofascore/manager` | `sofascore-manager` | SofaScore manager detail | +| `GET` | `/sofascore/manager-events` | `sofascore-manager-events` | SofaScore manager recent matches | +| `GET` | `/sofascore/mma-card` | `sofascore-mma-card` | SofaScore MMA card | +| `GET` | `/sofascore/mma-schedule` | `sofascore-mma-schedule` | SofaScore MMA schedule | +| `GET` | `/sofascore/odds-dropping` | `sofascore-odds-dropping` | SofaScore dropping odds | +| `GET` | `/sofascore/odds-winning` | `sofascore-odds-winning` | SofaScore winning odds | +| `GET` | `/sofascore/player` | `sofascore-player` | SofaScore player detail | +| `GET` | `/sofascore/player-attributes` | `sofascore-player-attributes` | SofaScore player attributes and characteristics | +| `GET` | `/sofascore/player-events` | `sofascore-player-events` | SofaScore player matches with per-match numbers | +| `GET` | `/sofascore/player-last-year-summary` | `sofascore-player-last-year-summary` | SofaScore player form over the last year | +| `GET` | `/sofascore/player-national-team-statistics` | `sofascore-player-national-team-statistics` | SofaScore player national team record | +| `GET` | `/sofascore/player-penalty-history` | `sofascore-player-penalty-history` | SofaScore player penalty history | +| `GET` | `/sofascore/player-ratings` | `sofascore-player-ratings` | SofaScore player match ratings for a season | +| `GET` | `/sofascore/player-season-heatmap` | `sofascore-player-season-heatmap` | SofaScore player season heatmap | +| `GET` | `/sofascore/player-season-statistics` | `sofascore-player-season-statistics` | SofaScore player season statistics | +| `GET` | `/sofascore/player-statistical-rankings` | `sofascore-player-statistical-rankings` | SofaScore player ranking among all players in a season | +| `GET` | `/sofascore/player-statistics-seasons` | `sofascore-player-statistics-seasons` | SofaScore player statistics seasons | +| `GET` | `/sofascore/player-tournaments` | `sofascore-player-tournaments` | SofaScore player competitions | +| `GET` | `/sofascore/player-transfers` | `sofascore-player-transfers` | SofaScore player transfer history | +| `GET` | `/sofascore/ranking-types` | `sofascore-ranking-types` | SofaScore ranking catalogue | +| `GET` | `/sofascore/rankings` | `sofascore-rankings` | SofaScore rankings | +| `GET` | `/sofascore/referee` | `sofascore-referee` | SofaScore referee profile | +| `GET` | `/sofascore/referee-events` | `sofascore-referee-events` | SofaScore referee officiated matches | +| `GET` | `/sofascore/referee-statistics` | `sofascore-referee-statistics` | SofaScore referee card statistics | +| `GET` | `/sofascore/round-events` | `sofascore-round-events` | SofaScore round fixtures | +| `GET` | `/sofascore/scheduled-events` | `sofascore-scheduled-events` | SofaScore events scheduled in a category on a date | +| `GET` | `/sofascore/scheduled-tournaments` | `sofascore-scheduled-tournaments` | SofaScore tournaments scheduled on a date | +| `GET` | `/sofascore/search` | `sofascore-search` | SofaScore universal search | +| `GET` | `/sofascore/search-typed` | `sofascore-search-typed` | SofaScore search by entity type | +| `GET` | `/sofascore/season-events` | `sofascore-season-events` | SofaScore season fixtures and results | +| `GET` | `/sofascore/sports` | `sofascore-sports` | SofaScore supported sports | +| `GET` | `/sofascore/stage` | `sofascore-stage` | SofaScore motorsport and cycling stage | +| `GET` | `/sofascore/stage-categories` | `sofascore-stage-categories` | SofaScore motorsport and cycling categories and competitions | +| `GET` | `/sofascore/stage-driver-performance` | `sofascore-stage-driver-performance` | SofaScore motorsport race progress per driver | +| `GET` | `/sofascore/stage-featured` | `sofascore-stage-featured` | SofaScore featured motorsport and cycling events | +| `GET` | `/sofascore/stage-schedule` | `sofascore-stage-schedule` | SofaScore motorsport and cycling events around a date | +| `GET` | `/sofascore/stage-seasons` | `sofascore-stage-seasons` | SofaScore seasons of a motorsport or cycling competition | +| `GET` | `/sofascore/stage-standings` | `sofascore-stage-standings` | SofaScore motorsport and cycling stage standings | +| `GET` | `/sofascore/stage-substages` | `sofascore-stage-substages` | SofaScore children of a motorsport or cycling stage | +| `GET` | `/sofascore/standings` | `sofascore-standings` | SofaScore standings | +| `GET` | `/sofascore/team` | `sofascore-team` | SofaScore team detail | +| `GET` | `/sofascore/team-achievements` | `sofascore-team-achievements` | SofaScore team trophies | +| `GET` | `/sofascore/team-events` | `sofascore-team-events` | SofaScore team fixtures | +| `GET` | `/sofascore/team-goal-distributions` | `sofascore-team-goal-distributions` | SofaScore team goals by match minute | +| `GET` | `/sofascore/team-near-events` | `sofascore-team-near-events` | SofaScore team previous and next match | +| `GET` | `/sofascore/team-of-the-week` | `sofascore-team-of-the-week` | SofaScore team of the week | +| `GET` | `/sofascore/team-of-the-week-periods` | `sofascore-team-of-the-week-periods` | SofaScore team of the week periods | +| `GET` | `/sofascore/team-performance` | `sofascore-team-performance` | SofaScore team recent performance | +| `GET` | `/sofascore/team-player-statistics` | `sofascore-team-player-statistics` | SofaScore team player statistics | +| `GET` | `/sofascore/team-player-statistics-seasons` | `sofascore-team-player-statistics-seasons` | SofaScore team player statistics seasons | +| `GET` | `/sofascore/team-players` | `sofascore-team-players` | SofaScore team players | +| `GET` | `/sofascore/team-rankings` | `sofascore-team-rankings` | SofaScore team rankings | +| `GET` | `/sofascore/team-season-statistics` | `sofascore-team-season-statistics` | SofaScore team season statistics | +| `GET` | `/sofascore/team-statistics-seasons` | `sofascore-team-statistics-seasons` | SofaScore team statistics seasons | +| `GET` | `/sofascore/team-top-players` | `sofascore-team-top-players` | SofaScore team top players | +| `GET` | `/sofascore/team-tournaments` | `sofascore-team-tournaments` | SofaScore team competitions | +| `GET` | `/sofascore/team-transfers` | `sofascore-team-transfers` | SofaScore team transfers | +| `GET` | `/sofascore/tennis-player-grand-slam-results` | `sofascore-tennis-player-grand-slam-results` | SofaScore tennis player grand slam results | +| `GET` | `/sofascore/tournament-cuptree` | `sofascore-tournament-cuptree` | SofaScore competition knockout tree | +| `GET` | `/sofascore/tournament-info` | `sofascore-tournament-info` | SofaScore competition info | +| `GET` | `/sofascore/tournament-player-of-the-season` | `sofascore-tournament-player-of-the-season` | SofaScore player of the season | +| `GET` | `/sofascore/tournament-player-statistics` | `sofascore-tournament-player-statistics` | SofaScore season player statistics table | +| `GET` | `/sofascore/tournament-rounds` | `sofascore-tournament-rounds` | SofaScore competition season rounds | +| `GET` | `/sofascore/tournament-seasons` | `sofascore-tournament-seasons` | SofaScore competition seasons | +| `GET` | `/sofascore/tournament-statistics-info` | `sofascore-tournament-statistics-info` | SofaScore player statistics table filters | +| `GET` | `/sofascore/tournament-team-of-the-season` | `sofascore-tournament-team-of-the-season` | SofaScore team of the season | +| `GET` | `/sofascore/tournament-teams` | `sofascore-tournament-teams` | SofaScore teams of a competition season | +| `GET` | `/sofascore/tournament-top-players` | `sofascore-tournament-top-players` | SofaScore season top players | +| `GET` | `/sofascore/tournament-top-teams` | `sofascore-tournament-top-teams` | SofaScore season top teams | +| `GET` | `/sofascore/tournament-venues` | `sofascore-tournament-venues` | SofaScore venues of a competition season | +| `GET` | `/sofascore/tournament-winners` | `sofascore-tournament-winners` | SofaScore past winners of a competition | +| `GET` | `/sofascore/tournaments-with-feature` | `sofascore-tournaments-with-feature` | SofaScore competitions that carry a feature | +| `GET` | `/sofascore/trending-events` | `sofascore-trending-events` | SofaScore trending events | +| `GET` | `/sofascore/trending-players` | `sofascore-trending-players` | SofaScore trending players | +| `GET` | `/sofascore/venue` | `sofascore-venue` | SofaScore venue | +| `GET` | `/sofascore/venue-events` | `sofascore-venue-events` | SofaScore matches at a venue | + ## Links - [Crawlora](https://crawlora.net/?utm_source=maven-central&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-java-homepage) diff --git a/java/pom.xml b/java/pom.xml index 45bca1b..4fe5220 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -5,7 +5,7 @@ 4.0.0 net.crawlora crawlora-sofascore - 0.3.4 + 0.3.5 jar Crawlora SofaScore Java Client Java client for Crawlora's hosted SofaScore API, with direct methods for live events, match details, lineups, statistics, tournaments, and player/team data. Requires a Crawlora API key. @@ -35,6 +35,6 @@ org.apache.maven.pluginsmaven-source-plugin3.3.1attach-sourcesjar-no-fork org.apache.maven.pluginsmaven-javadoc-plugin3.6.3attach-javadocsjar org.apache.maven.pluginsmaven-gpg-plugin3.2.4MAVEN_GPG_PASSPHRASE--pinentry-modeloopbacksign-artifactsverifysign - org.sonatype.centralcentral-publishing-maven-plugin0.11.0truecentraltrueCrawlora SofaScore 0.3.4published + org.sonatype.centralcentral-publishing-maven-plugin0.11.0truecentraltrueCrawlora SofaScore 0.3.5published diff --git a/java/src/main/java/net/crawlora/sofascore/Client.java b/java/src/main/java/net/crawlora/sofascore/Client.java index 6f4379b..9b1fc6a 100644 --- a/java/src/main/java/net/crawlora/sofascore/Client.java +++ b/java/src/main/java/net/crawlora/sofascore/Client.java @@ -284,8 +284,14 @@ public Object request(String operationId, Map params) { Operation operation = OPERATIONS.get(operationId); if (operation == null) throw new IllegalArgumentException("unknown SofaScore operation: " + operationId); Map values = params == null ? Map.of() : params; + boolean post = operation.method().equals("POST"); Set unknown = new TreeSet<>(values.keySet()); unknown.removeAll(operation.params().keySet()); + // POST operations take their JSON body under the body parameter name or "body". + if (post) { + unknown.remove("body"); + unknown.remove(operation.bodyParam()); + } if (!unknown.isEmpty()) throw new IllegalArgumentException("unknown parameters for " + operationId + ": " + unknown); String path = operation.path(); @@ -309,11 +315,21 @@ public Object request(String operationId, Map params) { url.append(i == 0 ? '?' : '&').append(queryEncode(query.get(i).getKey())) .append('=').append(queryEncode(query.get(i).getValue())); } - HttpRequest request = HttpRequest.newBuilder(URI.create(url.toString())) + HttpRequest.Builder builder = HttpRequest.newBuilder(URI.create(url.toString())) .timeout(timeout) .header("x-api-key", apiKey) - .header("Accept", acceptHeader(operation)) - .GET().build(); + .header("Accept", acceptHeader(operation)); + if (post) { + Object body = values.get(operation.bodyParam()); + if (body == null) body = values.get("body"); + if (body == null) throw new IllegalArgumentException("missing request body for " + operationId); + String payload = body instanceof String text ? text : Json.write(body); + builder.header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(payload, StandardCharsets.UTF_8)); + } else { + builder.GET(); + } + HttpRequest request = builder.build(); try { HttpResponse response = http.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); String body = response.body(); diff --git a/java/src/main/java/net/crawlora/sofascore/Operation.java b/java/src/main/java/net/crawlora/sofascore/Operation.java index f9db918..906f0c4 100644 --- a/java/src/main/java/net/crawlora/sofascore/Operation.java +++ b/java/src/main/java/net/crawlora/sofascore/Operation.java @@ -4,4 +4,9 @@ import java.util.Map; /** Immutable metadata for one operation in this platform client. */ -public record Operation(String id, String method, String path, Map params, List produces) {} +public record Operation(String id, String method, String path, Map params, List produces, String bodyParam) { + /** Operation without a request body. */ + public Operation(String id, String method, String path, Map params, List produces) { + this(id, method, path, params, produces, ""); + } +} diff --git a/javascript/README.md b/javascript/README.md index 019fbeb..5371852 100644 --- a/javascript/README.md +++ b/javascript/README.md @@ -1,7 +1,7 @@ -# @crawlora-org/sofascore +# @crawlora-org/sofascore — SofaScore API client for JavaScript and TypeScript JavaScript and TypeScript client for Crawlora's hosted SofaScore API. -It calls [Crawlora](https://crawlora.net/?utm_source=npm&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-javascript-homepage); it does not run a browser or scrape SofaScore locally. A Crawlora account and `CRAWLORA_API_KEY` are required, and API use is billed under your Crawlora account. Crawlora is independent from and not endorsed by SofaScore or its owners. +It exposes 109 API endpoints for live events, match details, lineups, statistics, tournaments, and player/team data through [Crawlora](https://crawlora.net/?utm_source=npm&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-javascript-homepage). It does not run a browser or scrape SofaScore locally. A Crawlora account and `CRAWLORA_API_KEY` are required, and API use is billed under your Crawlora account. Crawlora is independent from and not endorsed by SofaScore or its owners. ## Install @@ -40,6 +40,121 @@ group. See the full method and parameter list in the [online reference](https:// Methods return promises and can be awaited. See the [runnable example](https://github.com/Crawlora-org/crawlora-sofascore/blob/main/examples/javascript.mjs) for a complete usage example. +## Supported SofaScore API endpoints + +This package exposes each route below as a direct method and through the `sofascore` group. See the [endpoint and parameter reference](https://github.com/Crawlora-org/crawlora-sofascore/blob/main/docs/usage.md) for complete input details. + +| Method | Endpoint | API operation | Description | +| --- | --- | --- | --- | +| `GET` | `/sofascore/categories` | `sofascore-categories` | SofaScore categories for a sport | +| `GET` | `/sofascore/category-tournaments` | `sofascore-category-tournaments` | SofaScore competitions in a category | +| `GET` | `/sofascore/draft` | `sofascore-draft` | SofaScore league draft | +| `GET` | `/sofascore/draft-picks` | `sofascore-draft-picks` | SofaScore league draft picks | +| `GET` | `/sofascore/esports-game` | `sofascore-esports-game` | SofaScore esports game detail | +| `GET` | `/sofascore/event` | `sofascore-event` | SofaScore event detail | +| `GET` | `/sofascore/event-at-bat-pitches` | `sofascore-event-at-bat-pitches` | SofaScore event at-bat pitches | +| `GET` | `/sofascore/event-at-bats` | `sofascore-event-at-bats` | SofaScore event at-bats | +| `GET` | `/sofascore/event-average-positions` | `sofascore-event-average-positions` | SofaScore event average positions | +| `GET` | `/sofascore/event-baseball-top-performers` | `sofascore-event-baseball-top-performers` | SofaScore event baseball top performers | +| `GET` | `/sofascore/event-best-players` | `sofascore-event-best-players` | SofaScore event best players | +| `GET` | `/sofascore/event-comments` | `sofascore-event-comments` | SofaScore event commentary | +| `GET` | `/sofascore/event-esports-games` | `sofascore-event-esports-games` | SofaScore event esports games | +| `GET` | `/sofascore/event-graph` | `sofascore-event-graph` | SofaScore event momentum graph | +| `GET` | `/sofascore/event-h2h` | `sofascore-event-h2h` | SofaScore event head-to-head | +| `GET` | `/sofascore/event-highlights` | `sofascore-event-highlights` | SofaScore event highlights | +| `GET` | `/sofascore/event-incidents` | `sofascore-event-incidents` | SofaScore event incidents | +| `GET` | `/sofascore/event-innings` | `sofascore-event-innings` | SofaScore event innings | +| `GET` | `/sofascore/event-lineups` | `sofascore-event-lineups` | SofaScore event lineups | +| `GET` | `/sofascore/event-managers` | `sofascore-event-managers` | SofaScore event managers | +| `GET` | `/sofascore/event-odds` | `sofascore-event-odds` | SofaScore event odds | +| `GET` | `/sofascore/event-player-heatmap` | `sofascore-event-player-heatmap` | SofaScore event player heatmap | +| `GET` | `/sofascore/event-player-statistics` | `sofascore-event-player-statistics` | SofaScore event player statistics | +| `GET` | `/sofascore/event-point-by-point` | `sofascore-event-point-by-point` | SofaScore event point-by-point | +| `GET` | `/sofascore/event-pregame-form` | `sofascore-event-pregame-form` | SofaScore event pre-game form | +| `GET` | `/sofascore/event-shotmap` | `sofascore-event-shotmap` | SofaScore event shot map | +| `GET` | `/sofascore/event-statistics` | `sofascore-event-statistics` | SofaScore event statistics | +| `GET` | `/sofascore/event-team-heatmap` | `sofascore-event-team-heatmap` | SofaScore event team heatmap | +| `GET` | `/sofascore/event-team-streaks` | `sofascore-event-team-streaks` | SofaScore event team streaks | +| `GET` | `/sofascore/event-tennis-power` | `sofascore-event-tennis-power` | SofaScore event tennis power | +| `GET` | `/sofascore/event-tv-channels` | `sofascore-event-tv-channels` | SofaScore event TV channels | +| `GET` | `/sofascore/event-votes` | `sofascore-event-votes` | SofaScore event votes | +| `GET` | `/sofascore/live-events` | `sofascore-live-events` | SofaScore live events | +| `GET` | `/sofascore/manager` | `sofascore-manager` | SofaScore manager detail | +| `GET` | `/sofascore/manager-events` | `sofascore-manager-events` | SofaScore manager recent matches | +| `GET` | `/sofascore/mma-card` | `sofascore-mma-card` | SofaScore MMA card | +| `GET` | `/sofascore/mma-schedule` | `sofascore-mma-schedule` | SofaScore MMA schedule | +| `GET` | `/sofascore/odds-dropping` | `sofascore-odds-dropping` | SofaScore dropping odds | +| `GET` | `/sofascore/odds-winning` | `sofascore-odds-winning` | SofaScore winning odds | +| `GET` | `/sofascore/player` | `sofascore-player` | SofaScore player detail | +| `GET` | `/sofascore/player-attributes` | `sofascore-player-attributes` | SofaScore player attributes and characteristics | +| `GET` | `/sofascore/player-events` | `sofascore-player-events` | SofaScore player matches with per-match numbers | +| `GET` | `/sofascore/player-last-year-summary` | `sofascore-player-last-year-summary` | SofaScore player form over the last year | +| `GET` | `/sofascore/player-national-team-statistics` | `sofascore-player-national-team-statistics` | SofaScore player national team record | +| `GET` | `/sofascore/player-penalty-history` | `sofascore-player-penalty-history` | SofaScore player penalty history | +| `GET` | `/sofascore/player-ratings` | `sofascore-player-ratings` | SofaScore player match ratings for a season | +| `GET` | `/sofascore/player-season-heatmap` | `sofascore-player-season-heatmap` | SofaScore player season heatmap | +| `GET` | `/sofascore/player-season-statistics` | `sofascore-player-season-statistics` | SofaScore player season statistics | +| `GET` | `/sofascore/player-statistical-rankings` | `sofascore-player-statistical-rankings` | SofaScore player ranking among all players in a season | +| `GET` | `/sofascore/player-statistics-seasons` | `sofascore-player-statistics-seasons` | SofaScore player statistics seasons | +| `GET` | `/sofascore/player-tournaments` | `sofascore-player-tournaments` | SofaScore player competitions | +| `GET` | `/sofascore/player-transfers` | `sofascore-player-transfers` | SofaScore player transfer history | +| `GET` | `/sofascore/ranking-types` | `sofascore-ranking-types` | SofaScore ranking catalogue | +| `GET` | `/sofascore/rankings` | `sofascore-rankings` | SofaScore rankings | +| `GET` | `/sofascore/referee` | `sofascore-referee` | SofaScore referee profile | +| `GET` | `/sofascore/referee-events` | `sofascore-referee-events` | SofaScore referee officiated matches | +| `GET` | `/sofascore/referee-statistics` | `sofascore-referee-statistics` | SofaScore referee card statistics | +| `GET` | `/sofascore/round-events` | `sofascore-round-events` | SofaScore round fixtures | +| `GET` | `/sofascore/scheduled-events` | `sofascore-scheduled-events` | SofaScore events scheduled in a category on a date | +| `GET` | `/sofascore/scheduled-tournaments` | `sofascore-scheduled-tournaments` | SofaScore tournaments scheduled on a date | +| `GET` | `/sofascore/search` | `sofascore-search` | SofaScore universal search | +| `GET` | `/sofascore/search-typed` | `sofascore-search-typed` | SofaScore search by entity type | +| `GET` | `/sofascore/season-events` | `sofascore-season-events` | SofaScore season fixtures and results | +| `GET` | `/sofascore/sports` | `sofascore-sports` | SofaScore supported sports | +| `GET` | `/sofascore/stage` | `sofascore-stage` | SofaScore motorsport and cycling stage | +| `GET` | `/sofascore/stage-categories` | `sofascore-stage-categories` | SofaScore motorsport and cycling categories and competitions | +| `GET` | `/sofascore/stage-driver-performance` | `sofascore-stage-driver-performance` | SofaScore motorsport race progress per driver | +| `GET` | `/sofascore/stage-featured` | `sofascore-stage-featured` | SofaScore featured motorsport and cycling events | +| `GET` | `/sofascore/stage-schedule` | `sofascore-stage-schedule` | SofaScore motorsport and cycling events around a date | +| `GET` | `/sofascore/stage-seasons` | `sofascore-stage-seasons` | SofaScore seasons of a motorsport or cycling competition | +| `GET` | `/sofascore/stage-standings` | `sofascore-stage-standings` | SofaScore motorsport and cycling stage standings | +| `GET` | `/sofascore/stage-substages` | `sofascore-stage-substages` | SofaScore children of a motorsport or cycling stage | +| `GET` | `/sofascore/standings` | `sofascore-standings` | SofaScore standings | +| `GET` | `/sofascore/team` | `sofascore-team` | SofaScore team detail | +| `GET` | `/sofascore/team-achievements` | `sofascore-team-achievements` | SofaScore team trophies | +| `GET` | `/sofascore/team-events` | `sofascore-team-events` | SofaScore team fixtures | +| `GET` | `/sofascore/team-goal-distributions` | `sofascore-team-goal-distributions` | SofaScore team goals by match minute | +| `GET` | `/sofascore/team-near-events` | `sofascore-team-near-events` | SofaScore team previous and next match | +| `GET` | `/sofascore/team-of-the-week` | `sofascore-team-of-the-week` | SofaScore team of the week | +| `GET` | `/sofascore/team-of-the-week-periods` | `sofascore-team-of-the-week-periods` | SofaScore team of the week periods | +| `GET` | `/sofascore/team-performance` | `sofascore-team-performance` | SofaScore team recent performance | +| `GET` | `/sofascore/team-player-statistics` | `sofascore-team-player-statistics` | SofaScore team player statistics | +| `GET` | `/sofascore/team-player-statistics-seasons` | `sofascore-team-player-statistics-seasons` | SofaScore team player statistics seasons | +| `GET` | `/sofascore/team-players` | `sofascore-team-players` | SofaScore team players | +| `GET` | `/sofascore/team-rankings` | `sofascore-team-rankings` | SofaScore team rankings | +| `GET` | `/sofascore/team-season-statistics` | `sofascore-team-season-statistics` | SofaScore team season statistics | +| `GET` | `/sofascore/team-statistics-seasons` | `sofascore-team-statistics-seasons` | SofaScore team statistics seasons | +| `GET` | `/sofascore/team-top-players` | `sofascore-team-top-players` | SofaScore team top players | +| `GET` | `/sofascore/team-tournaments` | `sofascore-team-tournaments` | SofaScore team competitions | +| `GET` | `/sofascore/team-transfers` | `sofascore-team-transfers` | SofaScore team transfers | +| `GET` | `/sofascore/tennis-player-grand-slam-results` | `sofascore-tennis-player-grand-slam-results` | SofaScore tennis player grand slam results | +| `GET` | `/sofascore/tournament-cuptree` | `sofascore-tournament-cuptree` | SofaScore competition knockout tree | +| `GET` | `/sofascore/tournament-info` | `sofascore-tournament-info` | SofaScore competition info | +| `GET` | `/sofascore/tournament-player-of-the-season` | `sofascore-tournament-player-of-the-season` | SofaScore player of the season | +| `GET` | `/sofascore/tournament-player-statistics` | `sofascore-tournament-player-statistics` | SofaScore season player statistics table | +| `GET` | `/sofascore/tournament-rounds` | `sofascore-tournament-rounds` | SofaScore competition season rounds | +| `GET` | `/sofascore/tournament-seasons` | `sofascore-tournament-seasons` | SofaScore competition seasons | +| `GET` | `/sofascore/tournament-statistics-info` | `sofascore-tournament-statistics-info` | SofaScore player statistics table filters | +| `GET` | `/sofascore/tournament-team-of-the-season` | `sofascore-tournament-team-of-the-season` | SofaScore team of the season | +| `GET` | `/sofascore/tournament-teams` | `sofascore-tournament-teams` | SofaScore teams of a competition season | +| `GET` | `/sofascore/tournament-top-players` | `sofascore-tournament-top-players` | SofaScore season top players | +| `GET` | `/sofascore/tournament-top-teams` | `sofascore-tournament-top-teams` | SofaScore season top teams | +| `GET` | `/sofascore/tournament-venues` | `sofascore-tournament-venues` | SofaScore venues of a competition season | +| `GET` | `/sofascore/tournament-winners` | `sofascore-tournament-winners` | SofaScore past winners of a competition | +| `GET` | `/sofascore/tournaments-with-feature` | `sofascore-tournaments-with-feature` | SofaScore competitions that carry a feature | +| `GET` | `/sofascore/trending-events` | `sofascore-trending-events` | SofaScore trending events | +| `GET` | `/sofascore/trending-players` | `sofascore-trending-players` | SofaScore trending players | +| `GET` | `/sofascore/venue` | `sofascore-venue` | SofaScore venue | +| `GET` | `/sofascore/venue-events` | `sofascore-venue-events` | SofaScore matches at a venue | ## Configuration diff --git a/javascript/package-lock.json b/javascript/package-lock.json index 287342c..317f3b4 100644 --- a/javascript/package-lock.json +++ b/javascript/package-lock.json @@ -1,12 +1,12 @@ { "name": "@crawlora-org/sofascore", - "version": "0.3.4", + "version": "0.3.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@crawlora-org/sofascore", - "version": "0.3.4", + "version": "0.3.5", "license": "MIT", "engines": { "node": ">=18" }, "devDependencies": { "typescript": "5.8.3" } diff --git a/javascript/package.json b/javascript/package.json index b020ed6..e0b7801 100644 --- a/javascript/package.json +++ b/javascript/package.json @@ -1,10 +1,10 @@ { "name": "@crawlora-org/sofascore", - "version": "0.3.4", - "description": "Typed JavaScript client for the Crawlora SofaScore API", + "version": "0.3.5", + "description": "Crawlora SofaScore API client with 109 endpoints for live events, match details, lineups, statistics, tournaments, and player/team data", "homepage": "https://crawlora.net/?utm_source=npm&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-javascript-homepage", "bugs": { "url": "https://github.com/Crawlora-org/crawlora-sofascore/issues" }, - "keywords": ["crawlora", "api-client", "web-scraping", "sofascore", "typescript"], + "keywords": ["crawlora", "api-client", "sdk", "web-scraping", "scraping-api", "sofascore", "sofascore-api", "sofascore-scraper", "sofascore-data", "sofascore-live-events", "sofascore-match-details", "sofascore-lineups", "sofascore-statistics", "sofascore-tournaments", "sofascore-player-team-data"], "type": "module", "main": "./src/index.js", "types": "./src/index.d.ts", diff --git a/javascript/src/index.js b/javascript/src/index.js index ad3a815..c59e018 100644 --- a/javascript/src/index.js +++ b/javascript/src/index.js @@ -9,7 +9,7 @@ import { export class SofascoreClient extends CrawloraClient { constructor(options = {}) { - super({ ...options, userAgent: options.userAgent ?? "crawlora-sofascore-js/0.3.4" }); + super({ ...options, userAgent: options.userAgent ?? "crawlora-sofascore-js/0.3.5" }); this["categories"] = (...args) => this.request("sofascore-categories", ...args); this["categoryTournaments"] = (...args) => this.request("sofascore-category-tournaments", ...args); this["draft"] = (...args) => this.request("sofascore-draft", ...args); @@ -131,5 +131,5 @@ export { CrawloraServerError }; export { groups, operations, operationCount, OperationIds } from "./operations.js"; -export const VERSION = "0.3.4"; +export const VERSION = "0.3.5"; export default SofascoreClient; diff --git a/javascript/test/client.test.js b/javascript/test/client.test.js index f619c0c..85e6446 100644 --- a/javascript/test/client.test.js +++ b/javascript/test/client.test.js @@ -26,7 +26,7 @@ test("serializes required query/path values, adds API key and platform User-Agen await client.request("sofascore-categories", {"sport": "american-football"}); assert.match(seen.url, /\/sofascore\/categories/); assert.equal(seen.headers["x-api-key"], "secret"); - assert.equal(seen.headers["user-agent"], "crawlora-sofascore-js/0.3.4"); + assert.equal(seen.headers["user-agent"], "crawlora-sofascore-js/0.3.5"); }); test("allows caller User-Agent override and response text mode", async () => { diff --git a/operations.go b/operations.go index 08b6bd1..a25e29a 100644 --- a/operations.go +++ b/operations.go @@ -23,6 +23,9 @@ type operationDefinition struct { QueryParams []parameterDefinition Produces []string Security []string + // BodyParam names the JSON request body parameter of a POST operation. + BodyParam string + BodyRequired bool } var operations = map[string]operationDefinition{ diff --git a/php/CHANGELOG.md b/php/CHANGELOG.md index b218507..711b807 100644 --- a/php/CHANGELOG.md +++ b/php/CHANGELOG.md @@ -1,5 +1,5 @@ # Changelog -## 0.3.4 +## 0.3.5 - Initial focused SofaScore PHP client for Crawlora's hosted API. diff --git a/php/README.md b/php/README.md index f0ff53b..c2f2818 100644 --- a/php/README.md +++ b/php/README.md @@ -1,6 +1,6 @@ -# Crawlora SofaScore PHP client +# Crawlora SofaScore API client for PHP (`crawlora/sofascore`) -This package calls the Crawlora hosted API at `https://api.crawlora.net/api/v1`. It does not call or scrape SofaScore directly. Requests require a Crawlora API key and use your Crawlora account's service plan. +This PHP package calls Crawlora's hosted SofaScore API at `https://api.crawlora.net/api/v1`. It exposes 109 endpoints covering live events, match details, lineups, statistics, tournaments, and player/team data. It does not call or scrape SofaScore directly. Requests require a Crawlora API key and use your Crawlora account's service plan. ## Install @@ -22,4 +22,120 @@ $client->close(); The client uses PHP cURL and JSON. Constructor options are `apiKey`, `baseUrl`, and `timeout`. Call the operation-specific method for direct access to each supported operation, or `request($operationId, $params, $responseType)` to dispatch by operation ID. Set `$responseType` to `text` for raw text output such as transcript formats. The package includes 109 API operations. +## Supported SofaScore API endpoints + +Browse every route included in this Composer package. The [endpoint reference](https://github.com/Crawlora-org/crawlora-sofascore/blob/main/docs/usage.md) includes parameter and response details. + +| Method | Endpoint | API operation | Description | +| --- | --- | --- | --- | +| `GET` | `/sofascore/categories` | `sofascore-categories` | SofaScore categories for a sport | +| `GET` | `/sofascore/category-tournaments` | `sofascore-category-tournaments` | SofaScore competitions in a category | +| `GET` | `/sofascore/draft` | `sofascore-draft` | SofaScore league draft | +| `GET` | `/sofascore/draft-picks` | `sofascore-draft-picks` | SofaScore league draft picks | +| `GET` | `/sofascore/esports-game` | `sofascore-esports-game` | SofaScore esports game detail | +| `GET` | `/sofascore/event` | `sofascore-event` | SofaScore event detail | +| `GET` | `/sofascore/event-at-bat-pitches` | `sofascore-event-at-bat-pitches` | SofaScore event at-bat pitches | +| `GET` | `/sofascore/event-at-bats` | `sofascore-event-at-bats` | SofaScore event at-bats | +| `GET` | `/sofascore/event-average-positions` | `sofascore-event-average-positions` | SofaScore event average positions | +| `GET` | `/sofascore/event-baseball-top-performers` | `sofascore-event-baseball-top-performers` | SofaScore event baseball top performers | +| `GET` | `/sofascore/event-best-players` | `sofascore-event-best-players` | SofaScore event best players | +| `GET` | `/sofascore/event-comments` | `sofascore-event-comments` | SofaScore event commentary | +| `GET` | `/sofascore/event-esports-games` | `sofascore-event-esports-games` | SofaScore event esports games | +| `GET` | `/sofascore/event-graph` | `sofascore-event-graph` | SofaScore event momentum graph | +| `GET` | `/sofascore/event-h2h` | `sofascore-event-h2h` | SofaScore event head-to-head | +| `GET` | `/sofascore/event-highlights` | `sofascore-event-highlights` | SofaScore event highlights | +| `GET` | `/sofascore/event-incidents` | `sofascore-event-incidents` | SofaScore event incidents | +| `GET` | `/sofascore/event-innings` | `sofascore-event-innings` | SofaScore event innings | +| `GET` | `/sofascore/event-lineups` | `sofascore-event-lineups` | SofaScore event lineups | +| `GET` | `/sofascore/event-managers` | `sofascore-event-managers` | SofaScore event managers | +| `GET` | `/sofascore/event-odds` | `sofascore-event-odds` | SofaScore event odds | +| `GET` | `/sofascore/event-player-heatmap` | `sofascore-event-player-heatmap` | SofaScore event player heatmap | +| `GET` | `/sofascore/event-player-statistics` | `sofascore-event-player-statistics` | SofaScore event player statistics | +| `GET` | `/sofascore/event-point-by-point` | `sofascore-event-point-by-point` | SofaScore event point-by-point | +| `GET` | `/sofascore/event-pregame-form` | `sofascore-event-pregame-form` | SofaScore event pre-game form | +| `GET` | `/sofascore/event-shotmap` | `sofascore-event-shotmap` | SofaScore event shot map | +| `GET` | `/sofascore/event-statistics` | `sofascore-event-statistics` | SofaScore event statistics | +| `GET` | `/sofascore/event-team-heatmap` | `sofascore-event-team-heatmap` | SofaScore event team heatmap | +| `GET` | `/sofascore/event-team-streaks` | `sofascore-event-team-streaks` | SofaScore event team streaks | +| `GET` | `/sofascore/event-tennis-power` | `sofascore-event-tennis-power` | SofaScore event tennis power | +| `GET` | `/sofascore/event-tv-channels` | `sofascore-event-tv-channels` | SofaScore event TV channels | +| `GET` | `/sofascore/event-votes` | `sofascore-event-votes` | SofaScore event votes | +| `GET` | `/sofascore/live-events` | `sofascore-live-events` | SofaScore live events | +| `GET` | `/sofascore/manager` | `sofascore-manager` | SofaScore manager detail | +| `GET` | `/sofascore/manager-events` | `sofascore-manager-events` | SofaScore manager recent matches | +| `GET` | `/sofascore/mma-card` | `sofascore-mma-card` | SofaScore MMA card | +| `GET` | `/sofascore/mma-schedule` | `sofascore-mma-schedule` | SofaScore MMA schedule | +| `GET` | `/sofascore/odds-dropping` | `sofascore-odds-dropping` | SofaScore dropping odds | +| `GET` | `/sofascore/odds-winning` | `sofascore-odds-winning` | SofaScore winning odds | +| `GET` | `/sofascore/player` | `sofascore-player` | SofaScore player detail | +| `GET` | `/sofascore/player-attributes` | `sofascore-player-attributes` | SofaScore player attributes and characteristics | +| `GET` | `/sofascore/player-events` | `sofascore-player-events` | SofaScore player matches with per-match numbers | +| `GET` | `/sofascore/player-last-year-summary` | `sofascore-player-last-year-summary` | SofaScore player form over the last year | +| `GET` | `/sofascore/player-national-team-statistics` | `sofascore-player-national-team-statistics` | SofaScore player national team record | +| `GET` | `/sofascore/player-penalty-history` | `sofascore-player-penalty-history` | SofaScore player penalty history | +| `GET` | `/sofascore/player-ratings` | `sofascore-player-ratings` | SofaScore player match ratings for a season | +| `GET` | `/sofascore/player-season-heatmap` | `sofascore-player-season-heatmap` | SofaScore player season heatmap | +| `GET` | `/sofascore/player-season-statistics` | `sofascore-player-season-statistics` | SofaScore player season statistics | +| `GET` | `/sofascore/player-statistical-rankings` | `sofascore-player-statistical-rankings` | SofaScore player ranking among all players in a season | +| `GET` | `/sofascore/player-statistics-seasons` | `sofascore-player-statistics-seasons` | SofaScore player statistics seasons | +| `GET` | `/sofascore/player-tournaments` | `sofascore-player-tournaments` | SofaScore player competitions | +| `GET` | `/sofascore/player-transfers` | `sofascore-player-transfers` | SofaScore player transfer history | +| `GET` | `/sofascore/ranking-types` | `sofascore-ranking-types` | SofaScore ranking catalogue | +| `GET` | `/sofascore/rankings` | `sofascore-rankings` | SofaScore rankings | +| `GET` | `/sofascore/referee` | `sofascore-referee` | SofaScore referee profile | +| `GET` | `/sofascore/referee-events` | `sofascore-referee-events` | SofaScore referee officiated matches | +| `GET` | `/sofascore/referee-statistics` | `sofascore-referee-statistics` | SofaScore referee card statistics | +| `GET` | `/sofascore/round-events` | `sofascore-round-events` | SofaScore round fixtures | +| `GET` | `/sofascore/scheduled-events` | `sofascore-scheduled-events` | SofaScore events scheduled in a category on a date | +| `GET` | `/sofascore/scheduled-tournaments` | `sofascore-scheduled-tournaments` | SofaScore tournaments scheduled on a date | +| `GET` | `/sofascore/search` | `sofascore-search` | SofaScore universal search | +| `GET` | `/sofascore/search-typed` | `sofascore-search-typed` | SofaScore search by entity type | +| `GET` | `/sofascore/season-events` | `sofascore-season-events` | SofaScore season fixtures and results | +| `GET` | `/sofascore/sports` | `sofascore-sports` | SofaScore supported sports | +| `GET` | `/sofascore/stage` | `sofascore-stage` | SofaScore motorsport and cycling stage | +| `GET` | `/sofascore/stage-categories` | `sofascore-stage-categories` | SofaScore motorsport and cycling categories and competitions | +| `GET` | `/sofascore/stage-driver-performance` | `sofascore-stage-driver-performance` | SofaScore motorsport race progress per driver | +| `GET` | `/sofascore/stage-featured` | `sofascore-stage-featured` | SofaScore featured motorsport and cycling events | +| `GET` | `/sofascore/stage-schedule` | `sofascore-stage-schedule` | SofaScore motorsport and cycling events around a date | +| `GET` | `/sofascore/stage-seasons` | `sofascore-stage-seasons` | SofaScore seasons of a motorsport or cycling competition | +| `GET` | `/sofascore/stage-standings` | `sofascore-stage-standings` | SofaScore motorsport and cycling stage standings | +| `GET` | `/sofascore/stage-substages` | `sofascore-stage-substages` | SofaScore children of a motorsport or cycling stage | +| `GET` | `/sofascore/standings` | `sofascore-standings` | SofaScore standings | +| `GET` | `/sofascore/team` | `sofascore-team` | SofaScore team detail | +| `GET` | `/sofascore/team-achievements` | `sofascore-team-achievements` | SofaScore team trophies | +| `GET` | `/sofascore/team-events` | `sofascore-team-events` | SofaScore team fixtures | +| `GET` | `/sofascore/team-goal-distributions` | `sofascore-team-goal-distributions` | SofaScore team goals by match minute | +| `GET` | `/sofascore/team-near-events` | `sofascore-team-near-events` | SofaScore team previous and next match | +| `GET` | `/sofascore/team-of-the-week` | `sofascore-team-of-the-week` | SofaScore team of the week | +| `GET` | `/sofascore/team-of-the-week-periods` | `sofascore-team-of-the-week-periods` | SofaScore team of the week periods | +| `GET` | `/sofascore/team-performance` | `sofascore-team-performance` | SofaScore team recent performance | +| `GET` | `/sofascore/team-player-statistics` | `sofascore-team-player-statistics` | SofaScore team player statistics | +| `GET` | `/sofascore/team-player-statistics-seasons` | `sofascore-team-player-statistics-seasons` | SofaScore team player statistics seasons | +| `GET` | `/sofascore/team-players` | `sofascore-team-players` | SofaScore team players | +| `GET` | `/sofascore/team-rankings` | `sofascore-team-rankings` | SofaScore team rankings | +| `GET` | `/sofascore/team-season-statistics` | `sofascore-team-season-statistics` | SofaScore team season statistics | +| `GET` | `/sofascore/team-statistics-seasons` | `sofascore-team-statistics-seasons` | SofaScore team statistics seasons | +| `GET` | `/sofascore/team-top-players` | `sofascore-team-top-players` | SofaScore team top players | +| `GET` | `/sofascore/team-tournaments` | `sofascore-team-tournaments` | SofaScore team competitions | +| `GET` | `/sofascore/team-transfers` | `sofascore-team-transfers` | SofaScore team transfers | +| `GET` | `/sofascore/tennis-player-grand-slam-results` | `sofascore-tennis-player-grand-slam-results` | SofaScore tennis player grand slam results | +| `GET` | `/sofascore/tournament-cuptree` | `sofascore-tournament-cuptree` | SofaScore competition knockout tree | +| `GET` | `/sofascore/tournament-info` | `sofascore-tournament-info` | SofaScore competition info | +| `GET` | `/sofascore/tournament-player-of-the-season` | `sofascore-tournament-player-of-the-season` | SofaScore player of the season | +| `GET` | `/sofascore/tournament-player-statistics` | `sofascore-tournament-player-statistics` | SofaScore season player statistics table | +| `GET` | `/sofascore/tournament-rounds` | `sofascore-tournament-rounds` | SofaScore competition season rounds | +| `GET` | `/sofascore/tournament-seasons` | `sofascore-tournament-seasons` | SofaScore competition seasons | +| `GET` | `/sofascore/tournament-statistics-info` | `sofascore-tournament-statistics-info` | SofaScore player statistics table filters | +| `GET` | `/sofascore/tournament-team-of-the-season` | `sofascore-tournament-team-of-the-season` | SofaScore team of the season | +| `GET` | `/sofascore/tournament-teams` | `sofascore-tournament-teams` | SofaScore teams of a competition season | +| `GET` | `/sofascore/tournament-top-players` | `sofascore-tournament-top-players` | SofaScore season top players | +| `GET` | `/sofascore/tournament-top-teams` | `sofascore-tournament-top-teams` | SofaScore season top teams | +| `GET` | `/sofascore/tournament-venues` | `sofascore-tournament-venues` | SofaScore venues of a competition season | +| `GET` | `/sofascore/tournament-winners` | `sofascore-tournament-winners` | SofaScore past winners of a competition | +| `GET` | `/sofascore/tournaments-with-feature` | `sofascore-tournaments-with-feature` | SofaScore competitions that carry a feature | +| `GET` | `/sofascore/trending-events` | `sofascore-trending-events` | SofaScore trending events | +| `GET` | `/sofascore/trending-players` | `sofascore-trending-players` | SofaScore trending players | +| `GET` | `/sofascore/venue` | `sofascore-venue` | SofaScore venue | +| `GET` | `/sofascore/venue-events` | `sofascore-venue-events` | SofaScore matches at a venue | + See [Crawlora](https://crawlora.net/?utm_source=packagist&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-php-homepage), the [API documentation](https://crawlora.net/docs?utm_source=packagist&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-php-api-docs), and the [PHP client source](https://github.com/Crawlora-org/crawlora-sofascore). The complete operation and parameter reference is in the [platform repository](https://github.com/Crawlora-org/crawlora-sofascore/blob/main/docs/usage.md). diff --git a/php/composer.json b/php/composer.json index e4a40dc..72938a6 100644 --- a/php/composer.json +++ b/php/composer.json @@ -1,6 +1,23 @@ { "name": "crawlora/sofascore", - "description": "SofaScore client for the Crawlora hosted API", + "description": "Crawlora SofaScore API client with 109 endpoints for live events, match details, lineups, statistics, tournaments, and player/team data", + "keywords": [ + "crawlora", + "api-client", + "sdk", + "web-scraping", + "scraping-api", + "sofascore", + "sofascore-api", + "sofascore-scraper", + "sofascore-data", + "sofascore-live-events", + "sofascore-match-details", + "sofascore-lineups", + "sofascore-statistics", + "sofascore-tournaments", + "sofascore-player-team-data" + ], "type": "library", "license": "MIT", "require": { diff --git a/php/src/Crawlora/Sofascore/Client.php b/php/src/Crawlora/Sofascore/Client.php index 4e5a643..e5c6304 100644 --- a/php/src/Crawlora/Sofascore/Client.php +++ b/php/src/Crawlora/Sofascore/Client.php @@ -26,7 +26,7 @@ final class Client private ?\Closure $transport; public const PLATFORM = 'sofascore'; - public const VERSION = '0.3.4'; + public const VERSION = '0.3.5'; public const OPERATION_COUNT = 109; public const OPERATION_IDS = ["sofascore-categories", "sofascore-category-tournaments", "sofascore-draft", "sofascore-draft-picks", "sofascore-esports-game", "sofascore-event", "sofascore-event-at-bat-pitches", "sofascore-event-at-bats", "sofascore-event-average-positions", "sofascore-event-baseball-top-performers", "sofascore-event-best-players", "sofascore-event-comments", "sofascore-event-esports-games", "sofascore-event-graph", "sofascore-event-h2h", "sofascore-event-highlights", "sofascore-event-incidents", "sofascore-event-innings", "sofascore-event-lineups", "sofascore-event-managers", "sofascore-event-odds", "sofascore-event-player-heatmap", "sofascore-event-player-statistics", "sofascore-event-point-by-point", "sofascore-event-pregame-form", "sofascore-event-shotmap", "sofascore-event-statistics", "sofascore-event-team-heatmap", "sofascore-event-team-streaks", "sofascore-event-tennis-power", "sofascore-event-tv-channels", "sofascore-event-votes", "sofascore-live-events", "sofascore-manager", "sofascore-manager-events", "sofascore-mma-card", "sofascore-mma-schedule", "sofascore-odds-dropping", "sofascore-odds-winning", "sofascore-player", "sofascore-player-attributes", "sofascore-player-events", "sofascore-player-last-year-summary", "sofascore-player-national-team-statistics", "sofascore-player-penalty-history", "sofascore-player-ratings", "sofascore-player-season-heatmap", "sofascore-player-season-statistics", "sofascore-player-statistical-rankings", "sofascore-player-statistics-seasons", "sofascore-player-tournaments", "sofascore-player-transfers", "sofascore-ranking-types", "sofascore-rankings", "sofascore-referee", "sofascore-referee-events", "sofascore-referee-statistics", "sofascore-round-events", "sofascore-scheduled-events", "sofascore-scheduled-tournaments", "sofascore-search", "sofascore-search-typed", "sofascore-season-events", "sofascore-sports", "sofascore-stage", "sofascore-stage-categories", "sofascore-stage-driver-performance", "sofascore-stage-featured", "sofascore-stage-schedule", "sofascore-stage-seasons", "sofascore-stage-standings", "sofascore-stage-substages", "sofascore-standings", "sofascore-team", "sofascore-team-achievements", "sofascore-team-events", "sofascore-team-goal-distributions", "sofascore-team-near-events", "sofascore-team-of-the-week", "sofascore-team-of-the-week-periods", "sofascore-team-performance", "sofascore-team-player-statistics", "sofascore-team-player-statistics-seasons", "sofascore-team-players", "sofascore-team-rankings", "sofascore-team-season-statistics", "sofascore-team-statistics-seasons", "sofascore-team-top-players", "sofascore-team-tournaments", "sofascore-team-transfers", "sofascore-tennis-player-grand-slam-results", "sofascore-tournament-cuptree", "sofascore-tournament-info", "sofascore-tournament-player-of-the-season", "sofascore-tournament-player-statistics", "sofascore-tournament-rounds", "sofascore-tournament-seasons", "sofascore-tournament-statistics-info", "sofascore-tournament-team-of-the-season", "sofascore-tournament-teams", "sofascore-tournament-top-players", "sofascore-tournament-top-teams", "sofascore-tournament-venues", "sofascore-tournament-winners", "sofascore-tournaments-with-feature", "sofascore-trending-events", "sofascore-trending-players", "sofascore-venue", "sofascore-venue-events"]; @@ -37,7 +37,7 @@ public function __construct(?string $apiKey = null, string $baseUrl = 'https://a $this->timeout = $timeout; $this->transport = $transport === null ? null : \Closure::fromCallable($transport); self::$operations ??= json_decode(<<<'JSON' -{"sofascore-categories": {"id": "sofascore-categories", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/categories", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-category-tournaments": {"id": "sofascore-category-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore category id from the categories endpoint", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "1"}], "path": "/sofascore/category-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-draft": {"id": "sofascore-draft", "method": "GET", "params": [{"description": "League whose draft to return", "enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string", "x-example": "nba"}, {"description": "Numeric SofaScore season id of the league", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "80229"}], "path": "/sofascore/draft", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-draft-picks": {"id": "sofascore-draft-picks", "method": "GET", "params": [{"description": "League whose draft to return", "enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string", "x-example": "nba"}, {"description": "Four-digit draft year", "in": "query", "name": "year", "required": true, "type": "string", "x-example": "2025"}, {"description": "Draft round: 1 to 2 for nba, 1 to 7 for nfl", "in": "query", "maximum": 7, "minimum": 1, "name": "round", "required": true, "type": "integer", "x-example": 1}], "path": "/sofascore/draft-picks", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string"}, {"in": "query", "name": "year", "required": true, "type": "string"}, {"in": "query", "name": "round", "required": true, "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-esports-game": {"id": "sofascore-esports-game", "method": "GET", "params": [{"description": "Numeric SofaScore esports game id from sofascore-event-esports-games", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "588883"}, {"description": "Which resource of the game to return", "enum": ["statistics", "lineups", "bans", "rounds"], "in": "query", "name": "part", "required": true, "type": "string", "x-example": "lineups"}], "path": "/sofascore/esports-game", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["statistics", "lineups", "bans", "rounds"], "in": "query", "name": "part", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event": {"id": "sofascore-event", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-at-bat-pitches": {"id": "sofascore-event-at-bat-pitches", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}, {"description": "Numeric at-bat id from sofascore-event-at-bats for the same event", "in": "query", "name": "at_bat_id", "required": true, "type": "string", "x-example": "2595879"}], "path": "/sofascore/event-at-bat-pitches", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "at_bat_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-at-bats": {"id": "sofascore-event-at-bats", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}], "path": "/sofascore/event-at-bats", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-average-positions": {"id": "sofascore-event-average-positions", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-average-positions", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-baseball-top-performers": {"id": "sofascore-event-baseball-top-performers", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}], "path": "/sofascore/event-baseball-top-performers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-best-players": {"id": "sofascore-event-best-players", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-best-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-comments": {"id": "sofascore-event-comments", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-comments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-esports-games": {"id": "sofascore-event-esports-games", "method": "GET", "params": [{"description": "Numeric SofaScore esports event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17260338"}], "path": "/sofascore/event-esports-games", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-graph": {"id": "sofascore-event-graph", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-graph", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-h2h": {"id": "sofascore-event-h2h", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-h2h", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-highlights": {"id": "sofascore-event-highlights", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-highlights", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-incidents": {"id": "sofascore-event-incidents", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-incidents", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-innings": {"id": "sofascore-event-innings", "method": "GET", "params": [{"description": "Numeric SofaScore cricket event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16253632"}], "path": "/sofascore/event-innings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-lineups": {"id": "sofascore-event-lineups", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-lineups", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-managers": {"id": "sofascore-event-managers", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-managers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-odds": {"id": "sofascore-event-odds", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-odds", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-player-heatmap": {"id": "sofascore-event-player-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore player id that played in the match", "in": "query", "name": "player_id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/event-player-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "player_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-player-statistics": {"id": "sofascore-event-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore player id that took part in the match", "in": "query", "name": "player_id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/event-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "player_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-point-by-point": {"id": "sofascore-event-point-by-point", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17257382"}], "path": "/sofascore/event-point-by-point", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-pregame-form": {"id": "sofascore-event-pregame-form", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-pregame-form", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-shotmap": {"id": "sofascore-event-shotmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-shotmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-statistics": {"id": "sofascore-event-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-team-heatmap": {"id": "sofascore-event-team-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore team id of the home or away side", "in": "query", "name": "team_id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/event-team-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "team_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-team-streaks": {"id": "sofascore-event-team-streaks", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-team-streaks", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-tennis-power": {"id": "sofascore-event-tennis-power", "method": "GET", "params": [{"description": "Numeric SofaScore tennis event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17257382"}], "path": "/sofascore/event-tennis-power", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-tv-channels": {"id": "sofascore-event-tv-channels", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Two-letter ISO 3166-1 alpha-2 country code. Omit to list the broadcasting countries only", "in": "query", "name": "country", "type": "string", "x-example": "GB"}], "path": "/sofascore/event-tv-channels", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "country", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-votes": {"id": "sofascore-event-votes", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-votes", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-live-events": {"id": "sofascore-live-events", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/live-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-manager": {"id": "sofascore-manager", "method": "GET", "params": [{"description": "Numeric SofaScore manager id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "794873"}], "path": "/sofascore/manager", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-manager-events": {"id": "sofascore-manager-events", "method": "GET", "params": [{"description": "Numeric SofaScore manager id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "794873"}, {"description": "Zero-based page number", "in": "query", "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/manager-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-mma-card": {"id": "sofascore-mma-card", "method": "GET", "params": [{"description": "Numeric SofaScore MMA organisation id", "in": "query", "name": "org_id", "required": true, "type": "string", "x-example": "19906"}, {"description": "Numeric card id (card_id) from sofascore-mma-schedule", "in": "query", "name": "card_id", "required": true, "type": "string", "x-example": "197311"}, {"description": "Which segment of the card to return", "enum": ["all", "maincard", "prelims", "earlyprelims"], "in": "query", "name": "part", "required": true, "type": "string", "x-example": "all"}], "path": "/sofascore/mma-card", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "org_id", "required": true, "type": "string"}, {"in": "query", "name": "card_id", "required": true, "type": "string"}, {"enum": ["all", "maincard", "prelims", "earlyprelims"], "in": "query", "name": "part", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-mma-schedule": {"id": "sofascore-mma-schedule", "method": "GET", "params": [{"description": "Numeric SofaScore MMA organisation id", "in": "query", "name": "org_id", "required": true, "type": "string", "x-example": "19906"}, {"description": "Calendar month as YYYY-MM", "in": "query", "name": "month", "required": true, "type": "string", "x-example": "2026-10"}], "path": "/sofascore/mma-schedule", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "org_id", "required": true, "type": "string"}, {"in": "query", "name": "month", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-odds-dropping": {"id": "sofascore-odds-dropping", "method": "GET", "params": [{"description": "Sport key, or all for every sport. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/odds-dropping", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-odds-winning": {"id": "sofascore-odds-winning", "method": "GET", "params": [{"description": "Sport key, or all for every sport. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/odds-winning", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player": {"id": "sofascore-player", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "855833"}], "path": "/sofascore/player", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-attributes": {"id": "sofascore-player-attributes", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-attributes", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-events": {"id": "sofascore-player-events", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/player-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-player-last-year-summary": {"id": "sofascore-player-last-year-summary", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-last-year-summary", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-national-team-statistics": {"id": "sofascore-player-national-team-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-national-team-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-penalty-history": {"id": "sofascore-player-penalty-history", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-penalty-history", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-ratings": {"id": "sofascore-player-ratings", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-ratings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-season-heatmap": {"id": "sofascore-player-season-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/player-season-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-season-statistics": {"id": "sofascore-player-season-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-season-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-statistical-rankings": {"id": "sofascore-player-statistical-rankings", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-statistical-rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-statistics-seasons": {"id": "sofascore-player-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-tournaments": {"id": "sofascore-player-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-transfers": {"id": "sofascore-player-transfers", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-transfers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-ranking-types": {"id": "sofascore-ranking-types", "method": "GET", "params": [], "path": "/sofascore/ranking-types", "pathParams": [], "produces": ["application/json"], "queryParams": [], "security": ["ApiKeyAuth"]}, "sofascore-rankings": {"id": "sofascore-rankings", "method": "GET", "params": [{"description": "Ranking id from sofascore-ranking-types", "enum": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45, 46], "in": "query", "name": "type", "required": true, "type": "integer", "x-example": 5}, {"description": "Return only the first N rows, 1 to 500. Omit to return every row", "in": "query", "maximum": 500, "minimum": 1, "name": "limit", "type": "integer", "x-example": 10}], "path": "/sofascore/rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "34", "35", "36", "37", "40", "41", "42", "43", "44", "45", "46"], "in": "query", "name": "type", "required": true, "type": "integer"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-referee": {"id": "sofascore-referee", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}], "path": "/sofascore/referee", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-referee-events": {"id": "sofascore-referee-events", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/referee-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-referee-statistics": {"id": "sofascore-referee-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}], "path": "/sofascore/referee-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-round-events": {"id": "sofascore-round-events", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"description": "Round number", "in": "query", "name": "round", "required": true, "type": "integer", "x-example": 1}, {"description": "Round slug from tournament-rounds, for example round-of-16; required for knockout and named cup rounds", "in": "query", "name": "slug", "type": "string", "x-example": "round-of-16"}, {"description": "Round prefix from tournament-rounds, for example Qualification; only valid together with slug", "in": "query", "name": "prefix", "type": "string", "x-example": "Qualification"}], "path": "/sofascore/round-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"in": "query", "name": "round", "required": true, "type": "integer"}, {"in": "query", "name": "slug", "type": "string"}, {"in": "query", "name": "prefix", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-scheduled-events": {"id": "sofascore-scheduled-events", "method": "GET", "params": [{"description": "Numeric SofaScore category id from the categories endpoint", "in": "query", "name": "category_id", "required": true, "type": "string", "x-example": "13"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-08"}], "path": "/sofascore/scheduled-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "category_id", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-scheduled-tournaments": {"id": "sofascore-scheduled-tournaments", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-08"}, {"description": "One-based page number; defaults to 1", "in": "query", "maximum": 100, "minimum": 1, "name": "page", "type": "integer", "x-example": 1}], "path": "/sofascore/scheduled-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-search": {"id": "sofascore-search", "method": "GET", "params": [{"description": "Free-text search query", "in": "query", "name": "q", "required": true, "type": "string", "x-example": "barcelona"}], "path": "/sofascore/search", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "q", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-search-typed": {"id": "sofascore-search-typed", "method": "GET", "params": [{"description": "Entity type to search", "enum": ["events", "teams", "players", "managers", "referees", "venues", "unique_tournaments"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "teams"}, {"description": "Search text, up to 128 characters", "in": "query", "name": "q", "required": true, "type": "string", "x-example": "arsenal"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}, {"description": "Restrict teams, players, managers or unique_tournaments to one sport", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/search-typed", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["events", "teams", "players", "managers", "referees", "venues", "unique_tournaments"], "in": "query", "name": "type", "required": true, "type": "string"}, {"in": "query", "name": "q", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}, {"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-season-events": {"id": "sofascore-season-events", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Upcoming fixtures or finished results", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "last"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/season-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-sports": {"id": "sofascore-sports", "method": "GET", "params": [], "path": "/sofascore/sports", "pathParams": [], "produces": ["application/json"], "queryParams": [], "security": ["ApiKeyAuth"]}, "sofascore-stage": {"id": "sofascore-stage", "method": "GET", "params": [{"description": "Numeric SofaScore stage id from stage-schedule, stage-seasons or stage-substages", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}], "path": "/sofascore/stage", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-categories": {"id": "sofascore-stage-categories", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}], "path": "/sofascore/stage-categories", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-driver-performance": {"id": "sofascore-stage-driver-performance", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a finished race, sprint or rally", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}], "path": "/sofascore/stage-driver-performance", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-featured": {"id": "sofascore-stage-featured", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}], "path": "/sofascore/stage-featured", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-schedule": {"id": "sofascore-stage-schedule", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-04"}], "path": "/sofascore/stage-schedule", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-seasons": {"id": "sofascore-stage-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore competition id from stage-categories", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "40"}], "path": "/sofascore/stage-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-standings": {"id": "sofascore-stage-standings", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a season, event, session or cycling stage", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}, {"description": "Classification kind", "enum": ["competitor", "team"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "competitor"}], "path": "/sofascore/stage-standings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["competitor", "team"], "in": "query", "name": "type", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-substages": {"id": "sofascore-stage-substages", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a season or an event", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214253"}], "path": "/sofascore/stage-substages", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-standings": {"id": "sofascore-standings", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"description": "Standings variant", "enum": ["total", "home", "away"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "total"}], "path": "/sofascore/standings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["total", "home", "away"], "in": "query", "name": "type", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team": {"id": "sofascore-team", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}], "path": "/sofascore/team", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-achievements": {"id": "sofascore-team-achievements", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-achievements", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-events": {"id": "sofascore-team-events", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}, {"description": "Fixture direction", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "next"}, {"description": "Zero-based page number", "in": "query", "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/team-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-team-goal-distributions": {"id": "sofascore-team-goal-distributions", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/team-goal-distributions", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-near-events": {"id": "sofascore-team-near-events", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-near-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-of-the-week": {"id": "sofascore-team-of-the-week", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Numeric period id from sofascore-team-of-the-week-periods", "in": "query", "name": "period", "required": true, "type": "string", "x-example": "29321"}], "path": "/sofascore/team-of-the-week", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"in": "query", "name": "period", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-of-the-week-periods": {"id": "sofascore-team-of-the-week-periods", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/team-of-the-week-periods", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-performance": {"id": "sofascore-team-performance", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-performance", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-player-statistics": {"id": "sofascore-team-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/team-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-player-statistics-seasons": {"id": "sofascore-team-player-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-player-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-players": {"id": "sofascore-team-players", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}], "path": "/sofascore/team-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-rankings": {"id": "sofascore-team-rankings", "method": "GET", "params": [{"description": "Numeric SofaScore team id (a tennis player id for tennis)", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "112783"}], "path": "/sofascore/team-rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-season-statistics": {"id": "sofascore-team-season-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/team-season-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-statistics-seasons": {"id": "sofascore-team-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-top-players": {"id": "sofascore-team-top-players", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics scope", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/team-top-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-team-tournaments": {"id": "sofascore-team-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"default": false, "description": "false returns current competitions, true returns every recorded competition", "in": "query", "name": "all", "type": "boolean"}], "path": "/sofascore/team-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "all", "type": "boolean"}], "security": ["ApiKeyAuth"]}, "sofascore-team-transfers": {"id": "sofascore-team-transfers", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-transfers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tennis-player-grand-slam-results": {"id": "sofascore-tennis-player-grand-slam-results", "method": "GET", "params": [{"description": "Numeric SofaScore team id of a tennis player", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14882"}], "path": "/sofascore/tennis-player-grand-slam-results", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-cuptree": {"id": "sofascore-tournament-cuptree", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a cup or playoff competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "7"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76953"}], "path": "/sofascore/tournament-cuptree", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-info": {"id": "sofascore-tournament-info", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id. Omit for competition metadata only", "in": "query", "name": "season", "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-info", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-player-of-the-season": {"id": "sofascore-tournament-player-of-the-season", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id of a finished season", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/tournament-player-of-the-season", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-player-statistics": {"id": "sofascore-tournament-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistic to sort by. Defaults to rating", "enum": ["rating", "goals", "expectedGoals", "assists", "successfulDribbles", "tackles", "accuratePassesPercentage", "bigChancesMissed", "totalShots", "goalConversionPercentage", "interceptions", "clearances", "errorLeadToGoal", "outfielderBlocks", "bigChancesCreated", "accuratePasses", "keyPasses", "saves", "cleanSheet", "penaltySave", "savedShotsFromInsideTheBox", "runsOut"], "in": "query", "name": "order", "type": "string", "x-example": "goals"}, {"description": "Sort direction. Defaults to desc", "enum": ["desc", "asc"], "in": "query", "name": "direction", "type": "string", "x-example": "desc"}, {"description": "How statistics are accumulated. Defaults to total", "enum": ["total", "perGame", "per90"], "in": "query", "name": "accumulation", "type": "string", "x-example": "total"}, {"description": "Statistic columns returned. Defaults to summary", "enum": ["summary", "attack", "defence", "passing", "goalkeeper"], "in": "query", "name": "group", "type": "string", "x-example": "summary"}, {"description": "Rows per page, 1 to 100. Defaults to 20", "in": "query", "maximum": 100, "minimum": 1, "name": "limit", "type": "integer", "x-example": 20}, {"description": "Rows to skip. Defaults to 0", "in": "query", "minimum": 0, "name": "offset", "type": "integer", "x-example": 0}, {"collectionFormat": "csv", "description": "Team ids to keep, comma separated, up to 20 (ids from tournament-statistics-info or tournament-teams)", "in": "query", "items": {"type": "string"}, "name": "team", "type": "array", "x-example": "42"}, {"collectionFormat": "csv", "description": "Nationality codes to keep, comma separated, up to 20 (codes from tournament-statistics-info)", "in": "query", "items": {"type": "string"}, "name": "nationality", "type": "array", "x-example": "EN"}, {"collectionFormat": "csv", "description": "Position codes to keep, comma separated", "in": "query", "items": {"enum": ["G", "D", "M", "F"], "type": "string"}, "name": "position", "type": "array", "x-example": "F"}, {"description": "Keep players with at least this many appearances, 0 to 1000. Omit for no minimum", "in": "query", "maximum": 1000, "minimum": 0, "name": "min_appearances", "type": "integer", "x-example": 10}, {"description": "Keep players with at least this many minutes played, 0 to 100000. Omit for no minimum", "in": "query", "maximum": 100000, "minimum": 0, "name": "min_minutes", "type": "integer", "x-example": 900}], "path": "/sofascore/tournament-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["rating", "goals", "expectedGoals", "assists", "successfulDribbles", "tackles", "accuratePassesPercentage", "bigChancesMissed", "totalShots", "goalConversionPercentage", "interceptions", "clearances", "errorLeadToGoal", "outfielderBlocks", "bigChancesCreated", "accuratePasses", "keyPasses", "saves", "cleanSheet", "penaltySave", "savedShotsFromInsideTheBox", "runsOut"], "in": "query", "name": "order", "type": "string"}, {"enum": ["desc", "asc"], "in": "query", "name": "direction", "type": "string"}, {"enum": ["total", "perGame", "per90"], "in": "query", "name": "accumulation", "type": "string"}, {"enum": ["summary", "attack", "defence", "passing", "goalkeeper"], "in": "query", "name": "group", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}, {"in": "query", "name": "offset", "type": "integer"}, {"collectionFormat": "csv", "in": "query", "name": "team", "type": "array"}, {"collectionFormat": "csv", "in": "query", "name": "nationality", "type": "array"}, {"collectionFormat": "csv", "enum": ["G", "D", "M", "F"], "in": "query", "name": "position", "type": "array"}, {"in": "query", "name": "min_appearances", "type": "integer"}, {"in": "query", "name": "min_minutes", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-rounds": {"id": "sofascore-tournament-rounds", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "7"}, {"description": "Numeric SofaScore season id from tournament-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76953"}], "path": "/sofascore/tournament-rounds", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-seasons": {"id": "sofascore-tournament-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/tournament-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-statistics-info": {"id": "sofascore-tournament-statistics-info", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-statistics-info", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-team-of-the-season": {"id": "sofascore-tournament-team-of-the-season", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id of a finished season", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/tournament-team-of-the-season", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-teams": {"id": "sofascore-tournament-teams", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-teams", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-top-players": {"id": "sofascore-tournament-top-players", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistics scope. Defaults to overall", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string", "x-example": "overall"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/tournament-top-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-top-teams": {"id": "sofascore-tournament-top-teams", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistics scope. Defaults to overall", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string", "x-example": "overall"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/tournament-top-teams", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-venues": {"id": "sofascore-tournament-venues", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-venues", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-winners": {"id": "sofascore-tournament-winners", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/tournament-winners", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournaments-with-feature": {"id": "sofascore-tournaments-with-feature", "method": "GET", "params": [{"description": "Competition feature", "enum": ["cuptree", "standings", "totw", "power_rankings"], "in": "query", "name": "feature", "required": true, "type": "string", "x-example": "cuptree"}, {"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "minifootball", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/tournaments-with-feature", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["cuptree", "standings", "totw", "power_rankings"], "in": "query", "name": "feature", "required": true, "type": "string"}, {"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "minifootball", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-trending-events": {"id": "sofascore-trending-events", "method": "GET", "params": [{"description": "Two-letter ISO 3166-1 alpha-2 country code", "in": "query", "name": "country", "required": true, "type": "string", "x-example": "GB"}], "path": "/sofascore/trending-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "country", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-trending-players": {"id": "sofascore-trending-players", "method": "GET", "params": [{"description": "Sport key", "enum": ["football", "basketball"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/trending-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["football", "basketball"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-venue": {"id": "sofascore-venue", "method": "GET", "params": [{"description": "Numeric SofaScore venue id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "624"}], "path": "/sofascore/venue", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-venue-events": {"id": "sofascore-venue-events", "method": "GET", "params": [{"description": "Numeric SofaScore venue id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "624"}, {"description": "Upcoming matches or finished matches", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "last"}, {"description": "Sport filter for the venue-wide list. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}, {"description": "Numeric unique-tournament id; with season, lists that competition season's matches at the venue", "in": "query", "name": "tournament", "type": "string", "x-example": "17"}, {"description": "Numeric season id; with tournament, lists that competition season's matches at the venue", "in": "query", "name": "season", "type": "string", "x-example": "96668"}], "path": "/sofascore/venue-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}, {"in": "query", "name": "page", "type": "integer"}, {"in": "query", "name": "tournament", "type": "string"}, {"in": "query", "name": "season", "type": "string"}], "security": ["ApiKeyAuth"]}} +{"sofascore-categories": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-categories", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/categories", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-category-tournaments": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-category-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore category id from the categories endpoint", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "1"}], "path": "/sofascore/category-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-draft": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-draft", "method": "GET", "params": [{"description": "League whose draft to return", "enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string", "x-example": "nba"}, {"description": "Numeric SofaScore season id of the league", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "80229"}], "path": "/sofascore/draft", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-draft-picks": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-draft-picks", "method": "GET", "params": [{"description": "League whose draft to return", "enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string", "x-example": "nba"}, {"description": "Four-digit draft year", "in": "query", "name": "year", "required": true, "type": "string", "x-example": "2025"}, {"description": "Draft round: 1 to 2 for nba, 1 to 7 for nfl", "in": "query", "maximum": 7, "minimum": 1, "name": "round", "required": true, "type": "integer", "x-example": 1}], "path": "/sofascore/draft-picks", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string"}, {"in": "query", "name": "year", "required": true, "type": "string"}, {"in": "query", "name": "round", "required": true, "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-esports-game": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-esports-game", "method": "GET", "params": [{"description": "Numeric SofaScore esports game id from sofascore-event-esports-games", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "588883"}, {"description": "Which resource of the game to return", "enum": ["statistics", "lineups", "bans", "rounds"], "in": "query", "name": "part", "required": true, "type": "string", "x-example": "lineups"}], "path": "/sofascore/esports-game", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["statistics", "lineups", "bans", "rounds"], "in": "query", "name": "part", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-at-bat-pitches": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-at-bat-pitches", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}, {"description": "Numeric at-bat id from sofascore-event-at-bats for the same event", "in": "query", "name": "at_bat_id", "required": true, "type": "string", "x-example": "2595879"}], "path": "/sofascore/event-at-bat-pitches", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "at_bat_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-at-bats": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-at-bats", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}], "path": "/sofascore/event-at-bats", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-average-positions": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-average-positions", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-average-positions", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-baseball-top-performers": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-baseball-top-performers", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}], "path": "/sofascore/event-baseball-top-performers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-best-players": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-best-players", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-best-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-comments": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-comments", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-comments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-esports-games": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-esports-games", "method": "GET", "params": [{"description": "Numeric SofaScore esports event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17260338"}], "path": "/sofascore/event-esports-games", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-graph": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-graph", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-graph", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-h2h": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-h2h", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-h2h", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-highlights": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-highlights", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-highlights", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-incidents": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-incidents", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-incidents", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-innings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-innings", "method": "GET", "params": [{"description": "Numeric SofaScore cricket event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16253632"}], "path": "/sofascore/event-innings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-lineups": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-lineups", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-lineups", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-managers": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-managers", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-managers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-odds": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-odds", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-odds", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-player-heatmap": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-player-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore player id that played in the match", "in": "query", "name": "player_id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/event-player-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "player_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-player-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore player id that took part in the match", "in": "query", "name": "player_id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/event-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "player_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-point-by-point": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-point-by-point", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17257382"}], "path": "/sofascore/event-point-by-point", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-pregame-form": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-pregame-form", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-pregame-form", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-shotmap": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-shotmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-shotmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-team-heatmap": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-team-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore team id of the home or away side", "in": "query", "name": "team_id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/event-team-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "team_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-team-streaks": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-team-streaks", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-team-streaks", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-tennis-power": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-tennis-power", "method": "GET", "params": [{"description": "Numeric SofaScore tennis event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17257382"}], "path": "/sofascore/event-tennis-power", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-tv-channels": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-tv-channels", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Two-letter ISO 3166-1 alpha-2 country code. Omit to list the broadcasting countries only", "in": "query", "name": "country", "type": "string", "x-example": "GB"}], "path": "/sofascore/event-tv-channels", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "country", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-votes": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-votes", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-votes", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-live-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-live-events", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/live-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-manager": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-manager", "method": "GET", "params": [{"description": "Numeric SofaScore manager id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "794873"}], "path": "/sofascore/manager", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-manager-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-manager-events", "method": "GET", "params": [{"description": "Numeric SofaScore manager id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "794873"}, {"description": "Zero-based page number", "in": "query", "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/manager-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-mma-card": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-mma-card", "method": "GET", "params": [{"description": "Numeric SofaScore MMA organisation id", "in": "query", "name": "org_id", "required": true, "type": "string", "x-example": "19906"}, {"description": "Numeric card id (card_id) from sofascore-mma-schedule", "in": "query", "name": "card_id", "required": true, "type": "string", "x-example": "197311"}, {"description": "Which segment of the card to return", "enum": ["all", "maincard", "prelims", "earlyprelims"], "in": "query", "name": "part", "required": true, "type": "string", "x-example": "all"}], "path": "/sofascore/mma-card", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "org_id", "required": true, "type": "string"}, {"in": "query", "name": "card_id", "required": true, "type": "string"}, {"enum": ["all", "maincard", "prelims", "earlyprelims"], "in": "query", "name": "part", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-mma-schedule": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-mma-schedule", "method": "GET", "params": [{"description": "Numeric SofaScore MMA organisation id", "in": "query", "name": "org_id", "required": true, "type": "string", "x-example": "19906"}, {"description": "Calendar month as YYYY-MM", "in": "query", "name": "month", "required": true, "type": "string", "x-example": "2026-10"}], "path": "/sofascore/mma-schedule", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "org_id", "required": true, "type": "string"}, {"in": "query", "name": "month", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-odds-dropping": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-odds-dropping", "method": "GET", "params": [{"description": "Sport key, or all for every sport. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/odds-dropping", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-odds-winning": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-odds-winning", "method": "GET", "params": [{"description": "Sport key, or all for every sport. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/odds-winning", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "855833"}], "path": "/sofascore/player", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-attributes": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-attributes", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-attributes", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-events", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/player-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-player-last-year-summary": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-last-year-summary", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-last-year-summary", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-national-team-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-national-team-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-national-team-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-penalty-history": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-penalty-history", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-penalty-history", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-ratings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-ratings", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-ratings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-season-heatmap": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-season-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/player-season-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-season-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-season-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-season-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-statistical-rankings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-statistical-rankings", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-statistical-rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-statistics-seasons": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-tournaments": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-transfers": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-transfers", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-transfers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-ranking-types": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-ranking-types", "method": "GET", "params": [], "path": "/sofascore/ranking-types", "pathParams": [], "produces": ["application/json"], "queryParams": [], "security": ["ApiKeyAuth"]}, "sofascore-rankings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-rankings", "method": "GET", "params": [{"description": "Ranking id from sofascore-ranking-types", "enum": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45, 46], "in": "query", "name": "type", "required": true, "type": "integer", "x-example": 5}, {"description": "Return only the first N rows, 1 to 500. Omit to return every row", "in": "query", "maximum": 500, "minimum": 1, "name": "limit", "type": "integer", "x-example": 10}], "path": "/sofascore/rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "34", "35", "36", "37", "40", "41", "42", "43", "44", "45", "46"], "in": "query", "name": "type", "required": true, "type": "integer"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-referee": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-referee", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}], "path": "/sofascore/referee", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-referee-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-referee-events", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/referee-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-referee-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-referee-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}], "path": "/sofascore/referee-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-round-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-round-events", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"description": "Round number", "in": "query", "name": "round", "required": true, "type": "integer", "x-example": 1}, {"description": "Round slug from tournament-rounds, for example round-of-16; required for knockout and named cup rounds", "in": "query", "name": "slug", "type": "string", "x-example": "round-of-16"}, {"description": "Round prefix from tournament-rounds, for example Qualification; only valid together with slug", "in": "query", "name": "prefix", "type": "string", "x-example": "Qualification"}], "path": "/sofascore/round-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"in": "query", "name": "round", "required": true, "type": "integer"}, {"in": "query", "name": "slug", "type": "string"}, {"in": "query", "name": "prefix", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-scheduled-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-scheduled-events", "method": "GET", "params": [{"description": "Numeric SofaScore category id from the categories endpoint", "in": "query", "name": "category_id", "required": true, "type": "string", "x-example": "13"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-08"}], "path": "/sofascore/scheduled-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "category_id", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-scheduled-tournaments": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-scheduled-tournaments", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-08"}, {"description": "One-based page number; defaults to 1", "in": "query", "maximum": 100, "minimum": 1, "name": "page", "type": "integer", "x-example": 1}], "path": "/sofascore/scheduled-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-search": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-search", "method": "GET", "params": [{"description": "Free-text search query", "in": "query", "name": "q", "required": true, "type": "string", "x-example": "barcelona"}], "path": "/sofascore/search", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "q", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-search-typed": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-search-typed", "method": "GET", "params": [{"description": "Entity type to search", "enum": ["events", "teams", "players", "managers", "referees", "venues", "unique_tournaments"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "teams"}, {"description": "Search text, up to 128 characters", "in": "query", "name": "q", "required": true, "type": "string", "x-example": "arsenal"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}, {"description": "Restrict teams, players, managers or unique_tournaments to one sport", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/search-typed", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["events", "teams", "players", "managers", "referees", "venues", "unique_tournaments"], "in": "query", "name": "type", "required": true, "type": "string"}, {"in": "query", "name": "q", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}, {"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-season-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-season-events", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Upcoming fixtures or finished results", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "last"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/season-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-sports": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-sports", "method": "GET", "params": [], "path": "/sofascore/sports", "pathParams": [], "produces": ["application/json"], "queryParams": [], "security": ["ApiKeyAuth"]}, "sofascore-stage": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage", "method": "GET", "params": [{"description": "Numeric SofaScore stage id from stage-schedule, stage-seasons or stage-substages", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}], "path": "/sofascore/stage", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-categories": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-categories", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}], "path": "/sofascore/stage-categories", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-driver-performance": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-driver-performance", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a finished race, sprint or rally", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}], "path": "/sofascore/stage-driver-performance", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-featured": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-featured", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}], "path": "/sofascore/stage-featured", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-schedule": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-schedule", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-04"}], "path": "/sofascore/stage-schedule", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-seasons": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore competition id from stage-categories", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "40"}], "path": "/sofascore/stage-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-standings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-standings", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a season, event, session or cycling stage", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}, {"description": "Classification kind", "enum": ["competitor", "team"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "competitor"}], "path": "/sofascore/stage-standings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["competitor", "team"], "in": "query", "name": "type", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-substages": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-substages", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a season or an event", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214253"}], "path": "/sofascore/stage-substages", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-standings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-standings", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"description": "Standings variant", "enum": ["total", "home", "away"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "total"}], "path": "/sofascore/standings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["total", "home", "away"], "in": "query", "name": "type", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}], "path": "/sofascore/team", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-achievements": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-achievements", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-achievements", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-events", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}, {"description": "Fixture direction", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "next"}, {"description": "Zero-based page number", "in": "query", "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/team-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-team-goal-distributions": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-goal-distributions", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/team-goal-distributions", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-near-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-near-events", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-near-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-of-the-week": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-of-the-week", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Numeric period id from sofascore-team-of-the-week-periods", "in": "query", "name": "period", "required": true, "type": "string", "x-example": "29321"}], "path": "/sofascore/team-of-the-week", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"in": "query", "name": "period", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-of-the-week-periods": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-of-the-week-periods", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/team-of-the-week-periods", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-performance": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-performance", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-performance", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-player-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/team-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-player-statistics-seasons": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-player-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-player-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-players": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-players", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}], "path": "/sofascore/team-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-rankings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-rankings", "method": "GET", "params": [{"description": "Numeric SofaScore team id (a tennis player id for tennis)", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "112783"}], "path": "/sofascore/team-rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-season-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-season-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/team-season-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-statistics-seasons": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-top-players": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-top-players", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics scope", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/team-top-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-team-tournaments": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"default": false, "description": "false returns current competitions, true returns every recorded competition", "in": "query", "name": "all", "type": "boolean"}], "path": "/sofascore/team-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "all", "type": "boolean"}], "security": ["ApiKeyAuth"]}, "sofascore-team-transfers": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-transfers", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-transfers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tennis-player-grand-slam-results": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tennis-player-grand-slam-results", "method": "GET", "params": [{"description": "Numeric SofaScore team id of a tennis player", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14882"}], "path": "/sofascore/tennis-player-grand-slam-results", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-cuptree": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-cuptree", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a cup or playoff competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "7"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76953"}], "path": "/sofascore/tournament-cuptree", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-info": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-info", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id. Omit for competition metadata only", "in": "query", "name": "season", "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-info", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-player-of-the-season": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-player-of-the-season", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id of a finished season", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/tournament-player-of-the-season", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-player-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistic to sort by. Defaults to rating", "enum": ["rating", "goals", "expectedGoals", "assists", "successfulDribbles", "tackles", "accuratePassesPercentage", "bigChancesMissed", "totalShots", "goalConversionPercentage", "interceptions", "clearances", "errorLeadToGoal", "outfielderBlocks", "bigChancesCreated", "accuratePasses", "keyPasses", "saves", "cleanSheet", "penaltySave", "savedShotsFromInsideTheBox", "runsOut"], "in": "query", "name": "order", "type": "string", "x-example": "goals"}, {"description": "Sort direction. Defaults to desc", "enum": ["desc", "asc"], "in": "query", "name": "direction", "type": "string", "x-example": "desc"}, {"description": "How statistics are accumulated. Defaults to total", "enum": ["total", "perGame", "per90"], "in": "query", "name": "accumulation", "type": "string", "x-example": "total"}, {"description": "Statistic columns returned. Defaults to summary", "enum": ["summary", "attack", "defence", "passing", "goalkeeper"], "in": "query", "name": "group", "type": "string", "x-example": "summary"}, {"description": "Rows per page, 1 to 100. Defaults to 20", "in": "query", "maximum": 100, "minimum": 1, "name": "limit", "type": "integer", "x-example": 20}, {"description": "Rows to skip. Defaults to 0", "in": "query", "minimum": 0, "name": "offset", "type": "integer", "x-example": 0}, {"collectionFormat": "csv", "description": "Team ids to keep, comma separated, up to 20 (ids from tournament-statistics-info or tournament-teams)", "in": "query", "items": {"type": "string"}, "name": "team", "type": "array", "x-example": "42"}, {"collectionFormat": "csv", "description": "Nationality codes to keep, comma separated, up to 20 (codes from tournament-statistics-info)", "in": "query", "items": {"type": "string"}, "name": "nationality", "type": "array", "x-example": "EN"}, {"collectionFormat": "csv", "description": "Position codes to keep, comma separated", "in": "query", "items": {"enum": ["G", "D", "M", "F"], "type": "string"}, "name": "position", "type": "array", "x-example": "F"}, {"description": "Keep players with at least this many appearances, 0 to 1000. Omit for no minimum", "in": "query", "maximum": 1000, "minimum": 0, "name": "min_appearances", "type": "integer", "x-example": 10}, {"description": "Keep players with at least this many minutes played, 0 to 100000. Omit for no minimum", "in": "query", "maximum": 100000, "minimum": 0, "name": "min_minutes", "type": "integer", "x-example": 900}], "path": "/sofascore/tournament-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["rating", "goals", "expectedGoals", "assists", "successfulDribbles", "tackles", "accuratePassesPercentage", "bigChancesMissed", "totalShots", "goalConversionPercentage", "interceptions", "clearances", "errorLeadToGoal", "outfielderBlocks", "bigChancesCreated", "accuratePasses", "keyPasses", "saves", "cleanSheet", "penaltySave", "savedShotsFromInsideTheBox", "runsOut"], "in": "query", "name": "order", "type": "string"}, {"enum": ["desc", "asc"], "in": "query", "name": "direction", "type": "string"}, {"enum": ["total", "perGame", "per90"], "in": "query", "name": "accumulation", "type": "string"}, {"enum": ["summary", "attack", "defence", "passing", "goalkeeper"], "in": "query", "name": "group", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}, {"in": "query", "name": "offset", "type": "integer"}, {"collectionFormat": "csv", "in": "query", "name": "team", "type": "array"}, {"collectionFormat": "csv", "in": "query", "name": "nationality", "type": "array"}, {"collectionFormat": "csv", "enum": ["G", "D", "M", "F"], "in": "query", "name": "position", "type": "array"}, {"in": "query", "name": "min_appearances", "type": "integer"}, {"in": "query", "name": "min_minutes", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-rounds": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-rounds", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "7"}, {"description": "Numeric SofaScore season id from tournament-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76953"}], "path": "/sofascore/tournament-rounds", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-seasons": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/tournament-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-statistics-info": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-statistics-info", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-statistics-info", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-team-of-the-season": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-team-of-the-season", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id of a finished season", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/tournament-team-of-the-season", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-teams": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-teams", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-teams", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-top-players": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-top-players", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistics scope. Defaults to overall", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string", "x-example": "overall"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/tournament-top-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-top-teams": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-top-teams", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistics scope. Defaults to overall", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string", "x-example": "overall"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/tournament-top-teams", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-venues": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-venues", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-venues", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-winners": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-winners", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/tournament-winners", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournaments-with-feature": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournaments-with-feature", "method": "GET", "params": [{"description": "Competition feature", "enum": ["cuptree", "standings", "totw", "power_rankings"], "in": "query", "name": "feature", "required": true, "type": "string", "x-example": "cuptree"}, {"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "minifootball", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/tournaments-with-feature", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["cuptree", "standings", "totw", "power_rankings"], "in": "query", "name": "feature", "required": true, "type": "string"}, {"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "minifootball", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-trending-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-trending-events", "method": "GET", "params": [{"description": "Two-letter ISO 3166-1 alpha-2 country code", "in": "query", "name": "country", "required": true, "type": "string", "x-example": "GB"}], "path": "/sofascore/trending-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "country", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-trending-players": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-trending-players", "method": "GET", "params": [{"description": "Sport key", "enum": ["football", "basketball"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/trending-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["football", "basketball"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-venue": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-venue", "method": "GET", "params": [{"description": "Numeric SofaScore venue id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "624"}], "path": "/sofascore/venue", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-venue-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-venue-events", "method": "GET", "params": [{"description": "Numeric SofaScore venue id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "624"}, {"description": "Upcoming matches or finished matches", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "last"}, {"description": "Sport filter for the venue-wide list. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}, {"description": "Numeric unique-tournament id; with season, lists that competition season's matches at the venue", "in": "query", "name": "tournament", "type": "string", "x-example": "17"}, {"description": "Numeric season id; with tournament, lists that competition season's matches at the venue", "in": "query", "name": "season", "type": "string", "x-example": "96668"}], "path": "/sofascore/venue-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}, {"in": "query", "name": "page", "type": "integer"}, {"in": "query", "name": "tournament", "type": "string"}, {"in": "query", "name": "season", "type": "string"}], "security": ["ApiKeyAuth"]}} JSON, true, 512, JSON_THROW_ON_ERROR); } @@ -53,14 +53,18 @@ public function request(string $operationId, array $params = [], string $respons if ($this->apiKey === '') { throw new ClientException('Crawlora API key is required', null, $operationId); } + $payload = $this->requestBody($operation, $params); $url = $this->buildUrl($operation, $params); $headers = [ 'x-api-key: ' . $this->apiKey, - 'User-Agent: crawlora-sofascore-php/0.3.4', + 'User-Agent: crawlora-sofascore-php/0.3.5', 'Accept: ' . (in_array('text/plain', $operation['produces'], true) ? 'application/json, text/plain' : 'application/json'), ]; + if ($payload !== null) { + $headers[] = 'Content-Type: application/json'; + } try { - [$status, $contentType, $body] = $this->send($url, $headers, $operationId); + [$status, $contentType, $body] = $this->send($url, $headers, $operationId, $operation['method'], $payload); } catch (CrawloraException $exception) { throw $exception; } catch (\Throwable $exception) { @@ -753,9 +757,29 @@ public function venue_events(mixed ...$params): mixed return $this->request("sofascore-venue-events", $params, $responseType); } + /** POST operations take their JSON body under the body parameter name or "body". */ + private function requestBody(array $operation, array $params): ?string + { + $name = $operation['bodyParam'] ?? null; + if ($name === null) { + return null; + } + $value = $params[$name] ?? ($params['body'] ?? null); + if ($value === null) { + if ($operation['bodyRequired'] ?? false) { + throw new ClientException('Missing request body: ' . $name, null, $operation['id']); + } + return null; + } + return is_string($value) ? $value : json_encode($value, JSON_THROW_ON_ERROR); + } + private function buildUrl(array $operation, array $params): string { $known = array_column($operation['params'], 'name'); + if (($operation['bodyParam'] ?? null) !== null) { + $known[] = 'body'; + } $unknown = array_diff(array_keys($params), $known, ['response_type', '_response_type']); if ($unknown !== []) { throw new ClientException('Unknown parameters: ' . implode(', ', $unknown), null, $operation['id']); @@ -822,17 +846,26 @@ private function stringify(mixed $value): string return (string) $value; } - private function send(string $url, array $headers, string $operationId): array + private function send(string $url, array $headers, string $operationId, string $method = 'GET', ?string $payload = null): array { if ($this->transport !== null) { - $result = ($this->transport)($url, $headers, $this->timeout); + $result = $method === 'POST' + ? ($this->transport)($url, $headers, $this->timeout, $method, $payload) + : ($this->transport)($url, $headers, $this->timeout); return [(int) $result['status'], (string) ($result['content_type'] ?? ''), (string) ($result['body'] ?? '')]; } $handle = curl_init($url); if ($handle === false) { throw new NetworkException('Could not initialize cURL', null, $operationId); } - curl_setopt_array($handle, [ + curl_setopt_array($handle, $method === 'POST' ? [ + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => $payload ?? '', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => $headers, + CURLOPT_TIMEOUT_MS => (int) ($this->timeout * 1000), + CURLOPT_CONNECTTIMEOUT_MS => (int) ($this->timeout * 1000), + ] : [ CURLOPT_HTTPGET => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => $headers, diff --git a/php/src/Crawlora/Sofascore/operations.json b/php/src/Crawlora/Sofascore/operations.json index 2cc3a31..a43c857 100644 --- a/php/src/Crawlora/Sofascore/operations.json +++ b/php/src/Crawlora/Sofascore/operations.json @@ -263,6 +263,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key", @@ -319,6 +321,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore category id from the categories endpoint", @@ -359,6 +363,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "League whose draft to return", @@ -417,6 +423,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "League whose draft to return", @@ -481,6 +489,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore esports game id from sofascore-event-esports-games", @@ -525,6 +535,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -561,6 +573,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore baseball event (match) id", @@ -599,6 +613,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore baseball event (match) id", @@ -629,6 +645,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -659,6 +677,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore baseball event (match) id", @@ -689,6 +709,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -719,6 +741,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -749,6 +773,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore esports event (match) id", @@ -779,6 +805,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -809,6 +837,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -839,6 +869,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -869,6 +901,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -899,6 +933,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore cricket event (match) id", @@ -929,6 +965,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -959,6 +997,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -989,6 +1029,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1025,6 +1067,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1069,6 +1113,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1107,6 +1153,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1137,6 +1185,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1167,6 +1217,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1197,6 +1249,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1233,6 +1287,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1271,6 +1327,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1301,6 +1359,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore tennis event (match) id", @@ -1336,6 +1396,8 @@ "type": "string" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1373,6 +1435,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1429,6 +1493,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key", @@ -1485,6 +1551,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore manager id", @@ -1520,6 +1588,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore manager id", @@ -1575,6 +1645,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore MMA organisation id", @@ -1633,6 +1705,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore MMA organisation id", @@ -1697,6 +1771,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key, or all for every sport. Defaults to all", @@ -1779,6 +1855,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key, or all for every sport. Defaults to all", @@ -1835,6 +1913,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -1865,6 +1945,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -1900,6 +1982,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -1938,6 +2022,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -1968,6 +2054,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -1998,6 +2086,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2052,6 +2142,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2124,6 +2216,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2194,6 +2288,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2268,6 +2364,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2316,6 +2414,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2346,6 +2446,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2376,6 +2478,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2399,6 +2503,8 @@ "path": "/sofascore/ranking-types", "pathParams": [], "queryParams": [], + "bodyParam": null, + "bodyRequired": false, "params": [], "produces": [ "application/json" @@ -2459,6 +2565,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Ranking id from sofascore-ranking-types", @@ -2532,6 +2640,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore referee id", @@ -2567,6 +2677,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore referee id", @@ -2605,6 +2717,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore referee id", @@ -2657,6 +2771,8 @@ "type": "string" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -2723,6 +2839,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore category id from the categories endpoint", @@ -2798,6 +2916,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key", @@ -2871,6 +2991,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Free-text search query", @@ -2952,6 +3074,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Entity type to search", @@ -3061,6 +3185,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -3112,6 +3238,8 @@ "path": "/sofascore/sports", "pathParams": [], "queryParams": [], + "bodyParam": null, + "bodyRequired": false, "params": [], "produces": [ "application/json" @@ -3133,6 +3261,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore stage id from stage-schedule, stage-seasons or stage-substages", @@ -3167,6 +3297,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Stage sport key", @@ -3201,6 +3333,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore stage id of a finished race, sprint or rally", @@ -3235,6 +3369,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Stage sport key", @@ -3279,6 +3415,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Stage sport key", @@ -3321,6 +3459,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore competition id from stage-categories", @@ -3361,6 +3501,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore stage id of a season, event, session or cycling stage", @@ -3403,6 +3545,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore stage id of a season or an event", @@ -3450,6 +3594,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -3501,6 +3647,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3531,6 +3679,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3576,6 +3726,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3637,6 +3789,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3683,6 +3837,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3725,6 +3881,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -3777,6 +3935,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -3815,6 +3975,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3869,6 +4031,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3929,6 +4093,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3959,6 +4125,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3989,6 +4157,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id (a tennis player id for tennis)", @@ -4043,6 +4213,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -4103,6 +4275,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -4160,6 +4334,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -4232,6 +4408,8 @@ "type": "boolean" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -4269,6 +4447,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -4299,6 +4479,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id of a tennis player", @@ -4335,6 +4517,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id of a cup or playoff competition", @@ -4378,6 +4562,8 @@ "type": "string" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4421,6 +4607,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4569,6 +4757,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id of a football competition", @@ -4755,6 +4945,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4793,6 +4985,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4829,6 +5023,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id of a football competition", @@ -4873,6 +5069,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4917,6 +5115,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4976,6 +5176,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -5056,6 +5258,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -5121,6 +5325,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -5164,6 +5370,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -5238,6 +5446,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Competition feature", @@ -5306,6 +5516,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Two-letter ISO 3166-1 alpha-2 country code", @@ -5340,6 +5552,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key", @@ -5374,6 +5588,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore venue id", @@ -5461,6 +5677,8 @@ "type": "string" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore venue id", diff --git a/platform.json b/platform.json index cbe5d98..2e8c814 100644 --- a/platform.json +++ b/platform.json @@ -5,7 +5,7 @@ "display_name": "SofaScore", "general_sdk_version": "1.46.0-sdk.1", "golang_module_name": "github.com/Crawlora-org/crawlora-sofascore", - "golang_version": "0.3.4", + "golang_version": "0.3.5", "group_name": "sofascore", "maven_artifact_id": "crawlora-sofascore", "java_description": "Java client for Crawlora's hosted SofaScore API, with direct methods for live events, match details, lineups, statistics, tournaments, and player/team data. Requires a Crawlora API key.", @@ -16,6 +16,14 @@ "platform": "sofascore", "python_name": "crawlora-sofascore", "releases": [ + { + "version": "0.3.5", + "date": "2026-10-12", + "changes": [ + "List every supported endpoint in the repository and package READMEs.", + "Add platform-specific search keywords to the npm, PyPI, and Composer package metadata." + ] + }, { "version": "0.3.4", "date": "2026-10-09", @@ -104,6 +112,6 @@ "repository": "https://github.com/Crawlora-org/crawlora-sofascore", "ruby_gem_name": "crawlora-sofascore", "source_contract_sha256": "3827d3a93489515b45354477d4e75fb05f173af262cf358e80878442d7d258f2", - "version": "0.3.4", + "version": "0.3.5", "php_repository": "https://github.com/Crawlora-org/crawlora-sofascore" } diff --git a/python/README.md b/python/README.md index 24e7420..88a0be8 100644 --- a/python/README.md +++ b/python/README.md @@ -1,7 +1,6 @@ -# crawlora-sofascore +# crawlora-sofascore — SofaScore API client for Python -Python client for Crawlora's hosted SofaScore API. It calls Crawlora's -service at [Crawlora](https://crawlora.net/?utm_source=pypi&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-python-homepage); it does not run a browser or scrape +Python client for Crawlora's hosted SofaScore API. It exposes 109 API endpoints covering live events, match details, lineups, statistics, tournaments, and player/team data. Requests go to [Crawlora](https://crawlora.net/?utm_source=pypi&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-python-homepage); the package does not run a browser or scrape SofaScore locally. A Crawlora account and `CRAWLORA_API_KEY` are required, and API use is billed under your Crawlora account. Crawlora is independent from and not endorsed by SofaScore or its owners. @@ -68,6 +67,122 @@ asyncio.run(main()) See the [runnable example](https://github.com/Crawlora-org/crawlora-sofascore/blob/main/examples/python.py) for a complete usage example. +## Supported SofaScore API endpoints + +This package exposes every route below through direct snake_case methods and the `sofascore` group. See the [endpoint and parameter reference](https://github.com/Crawlora-org/crawlora-sofascore/blob/main/docs/usage.md) for complete input details. + +| Method | Endpoint | API operation | Description | +| --- | --- | --- | --- | +| `GET` | `/sofascore/categories` | `sofascore-categories` | SofaScore categories for a sport | +| `GET` | `/sofascore/category-tournaments` | `sofascore-category-tournaments` | SofaScore competitions in a category | +| `GET` | `/sofascore/draft` | `sofascore-draft` | SofaScore league draft | +| `GET` | `/sofascore/draft-picks` | `sofascore-draft-picks` | SofaScore league draft picks | +| `GET` | `/sofascore/esports-game` | `sofascore-esports-game` | SofaScore esports game detail | +| `GET` | `/sofascore/event` | `sofascore-event` | SofaScore event detail | +| `GET` | `/sofascore/event-at-bat-pitches` | `sofascore-event-at-bat-pitches` | SofaScore event at-bat pitches | +| `GET` | `/sofascore/event-at-bats` | `sofascore-event-at-bats` | SofaScore event at-bats | +| `GET` | `/sofascore/event-average-positions` | `sofascore-event-average-positions` | SofaScore event average positions | +| `GET` | `/sofascore/event-baseball-top-performers` | `sofascore-event-baseball-top-performers` | SofaScore event baseball top performers | +| `GET` | `/sofascore/event-best-players` | `sofascore-event-best-players` | SofaScore event best players | +| `GET` | `/sofascore/event-comments` | `sofascore-event-comments` | SofaScore event commentary | +| `GET` | `/sofascore/event-esports-games` | `sofascore-event-esports-games` | SofaScore event esports games | +| `GET` | `/sofascore/event-graph` | `sofascore-event-graph` | SofaScore event momentum graph | +| `GET` | `/sofascore/event-h2h` | `sofascore-event-h2h` | SofaScore event head-to-head | +| `GET` | `/sofascore/event-highlights` | `sofascore-event-highlights` | SofaScore event highlights | +| `GET` | `/sofascore/event-incidents` | `sofascore-event-incidents` | SofaScore event incidents | +| `GET` | `/sofascore/event-innings` | `sofascore-event-innings` | SofaScore event innings | +| `GET` | `/sofascore/event-lineups` | `sofascore-event-lineups` | SofaScore event lineups | +| `GET` | `/sofascore/event-managers` | `sofascore-event-managers` | SofaScore event managers | +| `GET` | `/sofascore/event-odds` | `sofascore-event-odds` | SofaScore event odds | +| `GET` | `/sofascore/event-player-heatmap` | `sofascore-event-player-heatmap` | SofaScore event player heatmap | +| `GET` | `/sofascore/event-player-statistics` | `sofascore-event-player-statistics` | SofaScore event player statistics | +| `GET` | `/sofascore/event-point-by-point` | `sofascore-event-point-by-point` | SofaScore event point-by-point | +| `GET` | `/sofascore/event-pregame-form` | `sofascore-event-pregame-form` | SofaScore event pre-game form | +| `GET` | `/sofascore/event-shotmap` | `sofascore-event-shotmap` | SofaScore event shot map | +| `GET` | `/sofascore/event-statistics` | `sofascore-event-statistics` | SofaScore event statistics | +| `GET` | `/sofascore/event-team-heatmap` | `sofascore-event-team-heatmap` | SofaScore event team heatmap | +| `GET` | `/sofascore/event-team-streaks` | `sofascore-event-team-streaks` | SofaScore event team streaks | +| `GET` | `/sofascore/event-tennis-power` | `sofascore-event-tennis-power` | SofaScore event tennis power | +| `GET` | `/sofascore/event-tv-channels` | `sofascore-event-tv-channels` | SofaScore event TV channels | +| `GET` | `/sofascore/event-votes` | `sofascore-event-votes` | SofaScore event votes | +| `GET` | `/sofascore/live-events` | `sofascore-live-events` | SofaScore live events | +| `GET` | `/sofascore/manager` | `sofascore-manager` | SofaScore manager detail | +| `GET` | `/sofascore/manager-events` | `sofascore-manager-events` | SofaScore manager recent matches | +| `GET` | `/sofascore/mma-card` | `sofascore-mma-card` | SofaScore MMA card | +| `GET` | `/sofascore/mma-schedule` | `sofascore-mma-schedule` | SofaScore MMA schedule | +| `GET` | `/sofascore/odds-dropping` | `sofascore-odds-dropping` | SofaScore dropping odds | +| `GET` | `/sofascore/odds-winning` | `sofascore-odds-winning` | SofaScore winning odds | +| `GET` | `/sofascore/player` | `sofascore-player` | SofaScore player detail | +| `GET` | `/sofascore/player-attributes` | `sofascore-player-attributes` | SofaScore player attributes and characteristics | +| `GET` | `/sofascore/player-events` | `sofascore-player-events` | SofaScore player matches with per-match numbers | +| `GET` | `/sofascore/player-last-year-summary` | `sofascore-player-last-year-summary` | SofaScore player form over the last year | +| `GET` | `/sofascore/player-national-team-statistics` | `sofascore-player-national-team-statistics` | SofaScore player national team record | +| `GET` | `/sofascore/player-penalty-history` | `sofascore-player-penalty-history` | SofaScore player penalty history | +| `GET` | `/sofascore/player-ratings` | `sofascore-player-ratings` | SofaScore player match ratings for a season | +| `GET` | `/sofascore/player-season-heatmap` | `sofascore-player-season-heatmap` | SofaScore player season heatmap | +| `GET` | `/sofascore/player-season-statistics` | `sofascore-player-season-statistics` | SofaScore player season statistics | +| `GET` | `/sofascore/player-statistical-rankings` | `sofascore-player-statistical-rankings` | SofaScore player ranking among all players in a season | +| `GET` | `/sofascore/player-statistics-seasons` | `sofascore-player-statistics-seasons` | SofaScore player statistics seasons | +| `GET` | `/sofascore/player-tournaments` | `sofascore-player-tournaments` | SofaScore player competitions | +| `GET` | `/sofascore/player-transfers` | `sofascore-player-transfers` | SofaScore player transfer history | +| `GET` | `/sofascore/ranking-types` | `sofascore-ranking-types` | SofaScore ranking catalogue | +| `GET` | `/sofascore/rankings` | `sofascore-rankings` | SofaScore rankings | +| `GET` | `/sofascore/referee` | `sofascore-referee` | SofaScore referee profile | +| `GET` | `/sofascore/referee-events` | `sofascore-referee-events` | SofaScore referee officiated matches | +| `GET` | `/sofascore/referee-statistics` | `sofascore-referee-statistics` | SofaScore referee card statistics | +| `GET` | `/sofascore/round-events` | `sofascore-round-events` | SofaScore round fixtures | +| `GET` | `/sofascore/scheduled-events` | `sofascore-scheduled-events` | SofaScore events scheduled in a category on a date | +| `GET` | `/sofascore/scheduled-tournaments` | `sofascore-scheduled-tournaments` | SofaScore tournaments scheduled on a date | +| `GET` | `/sofascore/search` | `sofascore-search` | SofaScore universal search | +| `GET` | `/sofascore/search-typed` | `sofascore-search-typed` | SofaScore search by entity type | +| `GET` | `/sofascore/season-events` | `sofascore-season-events` | SofaScore season fixtures and results | +| `GET` | `/sofascore/sports` | `sofascore-sports` | SofaScore supported sports | +| `GET` | `/sofascore/stage` | `sofascore-stage` | SofaScore motorsport and cycling stage | +| `GET` | `/sofascore/stage-categories` | `sofascore-stage-categories` | SofaScore motorsport and cycling categories and competitions | +| `GET` | `/sofascore/stage-driver-performance` | `sofascore-stage-driver-performance` | SofaScore motorsport race progress per driver | +| `GET` | `/sofascore/stage-featured` | `sofascore-stage-featured` | SofaScore featured motorsport and cycling events | +| `GET` | `/sofascore/stage-schedule` | `sofascore-stage-schedule` | SofaScore motorsport and cycling events around a date | +| `GET` | `/sofascore/stage-seasons` | `sofascore-stage-seasons` | SofaScore seasons of a motorsport or cycling competition | +| `GET` | `/sofascore/stage-standings` | `sofascore-stage-standings` | SofaScore motorsport and cycling stage standings | +| `GET` | `/sofascore/stage-substages` | `sofascore-stage-substages` | SofaScore children of a motorsport or cycling stage | +| `GET` | `/sofascore/standings` | `sofascore-standings` | SofaScore standings | +| `GET` | `/sofascore/team` | `sofascore-team` | SofaScore team detail | +| `GET` | `/sofascore/team-achievements` | `sofascore-team-achievements` | SofaScore team trophies | +| `GET` | `/sofascore/team-events` | `sofascore-team-events` | SofaScore team fixtures | +| `GET` | `/sofascore/team-goal-distributions` | `sofascore-team-goal-distributions` | SofaScore team goals by match minute | +| `GET` | `/sofascore/team-near-events` | `sofascore-team-near-events` | SofaScore team previous and next match | +| `GET` | `/sofascore/team-of-the-week` | `sofascore-team-of-the-week` | SofaScore team of the week | +| `GET` | `/sofascore/team-of-the-week-periods` | `sofascore-team-of-the-week-periods` | SofaScore team of the week periods | +| `GET` | `/sofascore/team-performance` | `sofascore-team-performance` | SofaScore team recent performance | +| `GET` | `/sofascore/team-player-statistics` | `sofascore-team-player-statistics` | SofaScore team player statistics | +| `GET` | `/sofascore/team-player-statistics-seasons` | `sofascore-team-player-statistics-seasons` | SofaScore team player statistics seasons | +| `GET` | `/sofascore/team-players` | `sofascore-team-players` | SofaScore team players | +| `GET` | `/sofascore/team-rankings` | `sofascore-team-rankings` | SofaScore team rankings | +| `GET` | `/sofascore/team-season-statistics` | `sofascore-team-season-statistics` | SofaScore team season statistics | +| `GET` | `/sofascore/team-statistics-seasons` | `sofascore-team-statistics-seasons` | SofaScore team statistics seasons | +| `GET` | `/sofascore/team-top-players` | `sofascore-team-top-players` | SofaScore team top players | +| `GET` | `/sofascore/team-tournaments` | `sofascore-team-tournaments` | SofaScore team competitions | +| `GET` | `/sofascore/team-transfers` | `sofascore-team-transfers` | SofaScore team transfers | +| `GET` | `/sofascore/tennis-player-grand-slam-results` | `sofascore-tennis-player-grand-slam-results` | SofaScore tennis player grand slam results | +| `GET` | `/sofascore/tournament-cuptree` | `sofascore-tournament-cuptree` | SofaScore competition knockout tree | +| `GET` | `/sofascore/tournament-info` | `sofascore-tournament-info` | SofaScore competition info | +| `GET` | `/sofascore/tournament-player-of-the-season` | `sofascore-tournament-player-of-the-season` | SofaScore player of the season | +| `GET` | `/sofascore/tournament-player-statistics` | `sofascore-tournament-player-statistics` | SofaScore season player statistics table | +| `GET` | `/sofascore/tournament-rounds` | `sofascore-tournament-rounds` | SofaScore competition season rounds | +| `GET` | `/sofascore/tournament-seasons` | `sofascore-tournament-seasons` | SofaScore competition seasons | +| `GET` | `/sofascore/tournament-statistics-info` | `sofascore-tournament-statistics-info` | SofaScore player statistics table filters | +| `GET` | `/sofascore/tournament-team-of-the-season` | `sofascore-tournament-team-of-the-season` | SofaScore team of the season | +| `GET` | `/sofascore/tournament-teams` | `sofascore-tournament-teams` | SofaScore teams of a competition season | +| `GET` | `/sofascore/tournament-top-players` | `sofascore-tournament-top-players` | SofaScore season top players | +| `GET` | `/sofascore/tournament-top-teams` | `sofascore-tournament-top-teams` | SofaScore season top teams | +| `GET` | `/sofascore/tournament-venues` | `sofascore-tournament-venues` | SofaScore venues of a competition season | +| `GET` | `/sofascore/tournament-winners` | `sofascore-tournament-winners` | SofaScore past winners of a competition | +| `GET` | `/sofascore/tournaments-with-feature` | `sofascore-tournaments-with-feature` | SofaScore competitions that carry a feature | +| `GET` | `/sofascore/trending-events` | `sofascore-trending-events` | SofaScore trending events | +| `GET` | `/sofascore/trending-players` | `sofascore-trending-players` | SofaScore trending players | +| `GET` | `/sofascore/venue` | `sofascore-venue` | SofaScore venue | +| `GET` | `/sofascore/venue-events` | `sofascore-venue-events` | SofaScore matches at a venue | + ## Configuration Pass your key through `api_key` or read `CRAWLORA_API_KEY` from the environment. diff --git a/python/crawlora_sofascore/__init__.py b/python/crawlora_sofascore/__init__.py index ccb284e..3ef2331 100644 --- a/python/crawlora_sofascore/__init__.py +++ b/python/crawlora_sofascore/__init__.py @@ -6,7 +6,7 @@ Client = SofascoreClient AsyncClient = AsyncSofascoreClient -__version__ = '0.3.4' +__version__ = '0.3.5' DISPLAY_NAME = 'SofaScore' PLATFORM = 'sofascore' CONTRACT_REVISION = 'sha256:645115670262bb86bf9c49f16ddbfdd94bbec67befb2aa8497f10f86ee2d5e46' diff --git a/python/crawlora_sofascore/platform.py b/python/crawlora_sofascore/platform.py index 3bc7a9f..2530015 100644 --- a/python/crawlora_sofascore/platform.py +++ b/python/crawlora_sofascore/platform.py @@ -7,7 +7,7 @@ class SofascoreClient(CrawloraClient): """Synchronous SofaScore API client.""" def __init__(self, *args: Any, **kwargs: Any) -> None: - kwargs.setdefault('user_agent', 'crawlora-sofascore-python/0.3.4') + kwargs.setdefault('user_agent', 'crawlora-sofascore-python/0.3.5') super().__init__(*args, **kwargs) def categories(self, **params: Any) -> Any: @@ -667,7 +667,7 @@ def venue_events(self, **params: Any) -> Any: class AsyncSofascoreClient(AsyncCrawloraClient): """Asynchronous SofaScore API client.""" def __init__(self, *args: Any, **kwargs: Any) -> None: - kwargs.setdefault('user_agent', 'crawlora-sofascore-python/0.3.4') + kwargs.setdefault('user_agent', 'crawlora-sofascore-python/0.3.5') super().__init__(*args, **kwargs) async def categories(self, **params: Any) -> Any: diff --git a/python/pyproject.toml b/python/pyproject.toml index bbb316d..8f84096 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -4,9 +4,10 @@ build-backend = "setuptools.build_meta" [project] name = "crawlora-sofascore" -version = "0.3.4" -description = "Typed SofaScore client for the Crawlora hosted API" +version = "0.3.5" +description = "Crawlora SofaScore API client with 109 endpoints for live events, match details, lineups, statistics, tournaments, and player/team data" readme = "README.md" +keywords = ["crawlora", "api-client", "sdk", "web-scraping", "scraping-api", "sofascore", "sofascore-api", "sofascore-scraper", "sofascore-data", "sofascore-live-events", "sofascore-match-details", "sofascore-lineups", "sofascore-statistics", "sofascore-tournaments", "sofascore-player-team-data"] requires-python = ">=3.10" license = "MIT" license-files = ["LICENSE"] diff --git a/python/tests/test_package.py b/python/tests/test_package.py index 80d73f3..f566dca 100644 --- a/python/tests/test_package.py +++ b/python/tests/test_package.py @@ -28,7 +28,7 @@ def __call__(self, request, _timeout): class PackageTests(unittest.TestCase): def test_platform_metadata_and_aliases(self): self.assertEqual(client_package.PLATFORM, "sofascore") - self.assertEqual(client_package.__version__, "0.3.4") + self.assertEqual(client_package.__version__, "0.3.5") self.assertIs(client_package.Client, client_package.SofascoreClient) self.assertIs(client_package.AsyncClient, client_package.AsyncSofascoreClient) self.assertEqual(client_package.OPERATION_COUNT, len(client_package.OPERATION_IDS)) diff --git a/ruby/CHANGELOG.md b/ruby/CHANGELOG.md index 1264c63..141695c 100644 --- a/ruby/CHANGELOG.md +++ b/ruby/CHANGELOG.md @@ -1,5 +1,5 @@ # Changelog -## 0.3.4 +## 0.3.5 - Initial focused SofaScore Ruby client for Crawlora's hosted API. diff --git a/ruby/README.md b/ruby/README.md index c1d8469..6d8b5be 100644 --- a/ruby/README.md +++ b/ruby/README.md @@ -1,6 +1,6 @@ -# Crawlora SofaScore Ruby client +# Crawlora SofaScore API client for Ruby (`crawlora-sofascore`) -This gem calls the Crawlora hosted API at `https://api.crawlora.net/api/v1`. It does not call or scrape SofaScore directly. Requests require your Crawlora API key and use your account's service plan. +This Ruby gem calls Crawlora's hosted SofaScore API at `https://api.crawlora.net/api/v1`. It exposes 109 endpoints covering live events, match details, lineups, statistics, tournaments, and player/team data; it does not call or scrape SofaScore directly. Requests require your Crawlora API key and use your account's service plan. ## Install @@ -30,4 +30,120 @@ client.close Client options include `api_key`, `base_url`, and `timeout`. Ruby stdlib provides the HTTP and JSON support. +## Supported SofaScore API endpoints + +Browse every route included in this gem. The [endpoint reference](https://github.com/Crawlora-org/crawlora-sofascore/blob/main/docs/usage.md) includes parameter and response details. + +| Method | Endpoint | API operation | Description | +| --- | --- | --- | --- | +| `GET` | `/sofascore/categories` | `sofascore-categories` | SofaScore categories for a sport | +| `GET` | `/sofascore/category-tournaments` | `sofascore-category-tournaments` | SofaScore competitions in a category | +| `GET` | `/sofascore/draft` | `sofascore-draft` | SofaScore league draft | +| `GET` | `/sofascore/draft-picks` | `sofascore-draft-picks` | SofaScore league draft picks | +| `GET` | `/sofascore/esports-game` | `sofascore-esports-game` | SofaScore esports game detail | +| `GET` | `/sofascore/event` | `sofascore-event` | SofaScore event detail | +| `GET` | `/sofascore/event-at-bat-pitches` | `sofascore-event-at-bat-pitches` | SofaScore event at-bat pitches | +| `GET` | `/sofascore/event-at-bats` | `sofascore-event-at-bats` | SofaScore event at-bats | +| `GET` | `/sofascore/event-average-positions` | `sofascore-event-average-positions` | SofaScore event average positions | +| `GET` | `/sofascore/event-baseball-top-performers` | `sofascore-event-baseball-top-performers` | SofaScore event baseball top performers | +| `GET` | `/sofascore/event-best-players` | `sofascore-event-best-players` | SofaScore event best players | +| `GET` | `/sofascore/event-comments` | `sofascore-event-comments` | SofaScore event commentary | +| `GET` | `/sofascore/event-esports-games` | `sofascore-event-esports-games` | SofaScore event esports games | +| `GET` | `/sofascore/event-graph` | `sofascore-event-graph` | SofaScore event momentum graph | +| `GET` | `/sofascore/event-h2h` | `sofascore-event-h2h` | SofaScore event head-to-head | +| `GET` | `/sofascore/event-highlights` | `sofascore-event-highlights` | SofaScore event highlights | +| `GET` | `/sofascore/event-incidents` | `sofascore-event-incidents` | SofaScore event incidents | +| `GET` | `/sofascore/event-innings` | `sofascore-event-innings` | SofaScore event innings | +| `GET` | `/sofascore/event-lineups` | `sofascore-event-lineups` | SofaScore event lineups | +| `GET` | `/sofascore/event-managers` | `sofascore-event-managers` | SofaScore event managers | +| `GET` | `/sofascore/event-odds` | `sofascore-event-odds` | SofaScore event odds | +| `GET` | `/sofascore/event-player-heatmap` | `sofascore-event-player-heatmap` | SofaScore event player heatmap | +| `GET` | `/sofascore/event-player-statistics` | `sofascore-event-player-statistics` | SofaScore event player statistics | +| `GET` | `/sofascore/event-point-by-point` | `sofascore-event-point-by-point` | SofaScore event point-by-point | +| `GET` | `/sofascore/event-pregame-form` | `sofascore-event-pregame-form` | SofaScore event pre-game form | +| `GET` | `/sofascore/event-shotmap` | `sofascore-event-shotmap` | SofaScore event shot map | +| `GET` | `/sofascore/event-statistics` | `sofascore-event-statistics` | SofaScore event statistics | +| `GET` | `/sofascore/event-team-heatmap` | `sofascore-event-team-heatmap` | SofaScore event team heatmap | +| `GET` | `/sofascore/event-team-streaks` | `sofascore-event-team-streaks` | SofaScore event team streaks | +| `GET` | `/sofascore/event-tennis-power` | `sofascore-event-tennis-power` | SofaScore event tennis power | +| `GET` | `/sofascore/event-tv-channels` | `sofascore-event-tv-channels` | SofaScore event TV channels | +| `GET` | `/sofascore/event-votes` | `sofascore-event-votes` | SofaScore event votes | +| `GET` | `/sofascore/live-events` | `sofascore-live-events` | SofaScore live events | +| `GET` | `/sofascore/manager` | `sofascore-manager` | SofaScore manager detail | +| `GET` | `/sofascore/manager-events` | `sofascore-manager-events` | SofaScore manager recent matches | +| `GET` | `/sofascore/mma-card` | `sofascore-mma-card` | SofaScore MMA card | +| `GET` | `/sofascore/mma-schedule` | `sofascore-mma-schedule` | SofaScore MMA schedule | +| `GET` | `/sofascore/odds-dropping` | `sofascore-odds-dropping` | SofaScore dropping odds | +| `GET` | `/sofascore/odds-winning` | `sofascore-odds-winning` | SofaScore winning odds | +| `GET` | `/sofascore/player` | `sofascore-player` | SofaScore player detail | +| `GET` | `/sofascore/player-attributes` | `sofascore-player-attributes` | SofaScore player attributes and characteristics | +| `GET` | `/sofascore/player-events` | `sofascore-player-events` | SofaScore player matches with per-match numbers | +| `GET` | `/sofascore/player-last-year-summary` | `sofascore-player-last-year-summary` | SofaScore player form over the last year | +| `GET` | `/sofascore/player-national-team-statistics` | `sofascore-player-national-team-statistics` | SofaScore player national team record | +| `GET` | `/sofascore/player-penalty-history` | `sofascore-player-penalty-history` | SofaScore player penalty history | +| `GET` | `/sofascore/player-ratings` | `sofascore-player-ratings` | SofaScore player match ratings for a season | +| `GET` | `/sofascore/player-season-heatmap` | `sofascore-player-season-heatmap` | SofaScore player season heatmap | +| `GET` | `/sofascore/player-season-statistics` | `sofascore-player-season-statistics` | SofaScore player season statistics | +| `GET` | `/sofascore/player-statistical-rankings` | `sofascore-player-statistical-rankings` | SofaScore player ranking among all players in a season | +| `GET` | `/sofascore/player-statistics-seasons` | `sofascore-player-statistics-seasons` | SofaScore player statistics seasons | +| `GET` | `/sofascore/player-tournaments` | `sofascore-player-tournaments` | SofaScore player competitions | +| `GET` | `/sofascore/player-transfers` | `sofascore-player-transfers` | SofaScore player transfer history | +| `GET` | `/sofascore/ranking-types` | `sofascore-ranking-types` | SofaScore ranking catalogue | +| `GET` | `/sofascore/rankings` | `sofascore-rankings` | SofaScore rankings | +| `GET` | `/sofascore/referee` | `sofascore-referee` | SofaScore referee profile | +| `GET` | `/sofascore/referee-events` | `sofascore-referee-events` | SofaScore referee officiated matches | +| `GET` | `/sofascore/referee-statistics` | `sofascore-referee-statistics` | SofaScore referee card statistics | +| `GET` | `/sofascore/round-events` | `sofascore-round-events` | SofaScore round fixtures | +| `GET` | `/sofascore/scheduled-events` | `sofascore-scheduled-events` | SofaScore events scheduled in a category on a date | +| `GET` | `/sofascore/scheduled-tournaments` | `sofascore-scheduled-tournaments` | SofaScore tournaments scheduled on a date | +| `GET` | `/sofascore/search` | `sofascore-search` | SofaScore universal search | +| `GET` | `/sofascore/search-typed` | `sofascore-search-typed` | SofaScore search by entity type | +| `GET` | `/sofascore/season-events` | `sofascore-season-events` | SofaScore season fixtures and results | +| `GET` | `/sofascore/sports` | `sofascore-sports` | SofaScore supported sports | +| `GET` | `/sofascore/stage` | `sofascore-stage` | SofaScore motorsport and cycling stage | +| `GET` | `/sofascore/stage-categories` | `sofascore-stage-categories` | SofaScore motorsport and cycling categories and competitions | +| `GET` | `/sofascore/stage-driver-performance` | `sofascore-stage-driver-performance` | SofaScore motorsport race progress per driver | +| `GET` | `/sofascore/stage-featured` | `sofascore-stage-featured` | SofaScore featured motorsport and cycling events | +| `GET` | `/sofascore/stage-schedule` | `sofascore-stage-schedule` | SofaScore motorsport and cycling events around a date | +| `GET` | `/sofascore/stage-seasons` | `sofascore-stage-seasons` | SofaScore seasons of a motorsport or cycling competition | +| `GET` | `/sofascore/stage-standings` | `sofascore-stage-standings` | SofaScore motorsport and cycling stage standings | +| `GET` | `/sofascore/stage-substages` | `sofascore-stage-substages` | SofaScore children of a motorsport or cycling stage | +| `GET` | `/sofascore/standings` | `sofascore-standings` | SofaScore standings | +| `GET` | `/sofascore/team` | `sofascore-team` | SofaScore team detail | +| `GET` | `/sofascore/team-achievements` | `sofascore-team-achievements` | SofaScore team trophies | +| `GET` | `/sofascore/team-events` | `sofascore-team-events` | SofaScore team fixtures | +| `GET` | `/sofascore/team-goal-distributions` | `sofascore-team-goal-distributions` | SofaScore team goals by match minute | +| `GET` | `/sofascore/team-near-events` | `sofascore-team-near-events` | SofaScore team previous and next match | +| `GET` | `/sofascore/team-of-the-week` | `sofascore-team-of-the-week` | SofaScore team of the week | +| `GET` | `/sofascore/team-of-the-week-periods` | `sofascore-team-of-the-week-periods` | SofaScore team of the week periods | +| `GET` | `/sofascore/team-performance` | `sofascore-team-performance` | SofaScore team recent performance | +| `GET` | `/sofascore/team-player-statistics` | `sofascore-team-player-statistics` | SofaScore team player statistics | +| `GET` | `/sofascore/team-player-statistics-seasons` | `sofascore-team-player-statistics-seasons` | SofaScore team player statistics seasons | +| `GET` | `/sofascore/team-players` | `sofascore-team-players` | SofaScore team players | +| `GET` | `/sofascore/team-rankings` | `sofascore-team-rankings` | SofaScore team rankings | +| `GET` | `/sofascore/team-season-statistics` | `sofascore-team-season-statistics` | SofaScore team season statistics | +| `GET` | `/sofascore/team-statistics-seasons` | `sofascore-team-statistics-seasons` | SofaScore team statistics seasons | +| `GET` | `/sofascore/team-top-players` | `sofascore-team-top-players` | SofaScore team top players | +| `GET` | `/sofascore/team-tournaments` | `sofascore-team-tournaments` | SofaScore team competitions | +| `GET` | `/sofascore/team-transfers` | `sofascore-team-transfers` | SofaScore team transfers | +| `GET` | `/sofascore/tennis-player-grand-slam-results` | `sofascore-tennis-player-grand-slam-results` | SofaScore tennis player grand slam results | +| `GET` | `/sofascore/tournament-cuptree` | `sofascore-tournament-cuptree` | SofaScore competition knockout tree | +| `GET` | `/sofascore/tournament-info` | `sofascore-tournament-info` | SofaScore competition info | +| `GET` | `/sofascore/tournament-player-of-the-season` | `sofascore-tournament-player-of-the-season` | SofaScore player of the season | +| `GET` | `/sofascore/tournament-player-statistics` | `sofascore-tournament-player-statistics` | SofaScore season player statistics table | +| `GET` | `/sofascore/tournament-rounds` | `sofascore-tournament-rounds` | SofaScore competition season rounds | +| `GET` | `/sofascore/tournament-seasons` | `sofascore-tournament-seasons` | SofaScore competition seasons | +| `GET` | `/sofascore/tournament-statistics-info` | `sofascore-tournament-statistics-info` | SofaScore player statistics table filters | +| `GET` | `/sofascore/tournament-team-of-the-season` | `sofascore-tournament-team-of-the-season` | SofaScore team of the season | +| `GET` | `/sofascore/tournament-teams` | `sofascore-tournament-teams` | SofaScore teams of a competition season | +| `GET` | `/sofascore/tournament-top-players` | `sofascore-tournament-top-players` | SofaScore season top players | +| `GET` | `/sofascore/tournament-top-teams` | `sofascore-tournament-top-teams` | SofaScore season top teams | +| `GET` | `/sofascore/tournament-venues` | `sofascore-tournament-venues` | SofaScore venues of a competition season | +| `GET` | `/sofascore/tournament-winners` | `sofascore-tournament-winners` | SofaScore past winners of a competition | +| `GET` | `/sofascore/tournaments-with-feature` | `sofascore-tournaments-with-feature` | SofaScore competitions that carry a feature | +| `GET` | `/sofascore/trending-events` | `sofascore-trending-events` | SofaScore trending events | +| `GET` | `/sofascore/trending-players` | `sofascore-trending-players` | SofaScore trending players | +| `GET` | `/sofascore/venue` | `sofascore-venue` | SofaScore venue | +| `GET` | `/sofascore/venue-events` | `sofascore-venue-events` | SofaScore matches at a venue | + See [Crawlora](https://crawlora.net/?utm_source=rubygems&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-ruby-homepage), the [API documentation](https://crawlora.net/docs?utm_source=rubygems&utm_medium=referral&utm_campaign=platform-clients&utm_content=sofascore-ruby-api-docs), and [the package repository](https://github.com/Crawlora-org/crawlora-sofascore) for account setup, the API operation reference, and release history. diff --git a/ruby/crawlora-sofascore.gemspec b/ruby/crawlora-sofascore.gemspec index b04452a..7aa7172 100644 --- a/ruby/crawlora-sofascore.gemspec +++ b/ruby/crawlora-sofascore.gemspec @@ -3,8 +3,8 @@ require_relative "lib/crawlora/sofascore/version" Gem::Specification.new do |spec| spec.name = "crawlora-sofascore" spec.version = Crawlora::Sofascore::VERSION - spec.summary = "SofaScore client for the Crawlora hosted API" - spec.description = "Credential-free SofaScore API access through Crawlora's hosted service." + spec.summary = "SofaScore API client for Crawlora (109 endpoints)" + spec.description = "Ruby client for Crawlora's hosted SofaScore API. Covers live events, match details, lineups, statistics, tournaments, and player/team data across 109 endpoints." spec.authors = ["Crawlora"] spec.license = "MIT" spec.required_ruby_version = ">= 2.6" diff --git a/ruby/lib/crawlora/sofascore/client.rb b/ruby/lib/crawlora/sofascore/client.rb index 0c964cc..c5831c0 100644 --- a/ruby/lib/crawlora/sofascore/client.rb +++ b/ruby/lib/crawlora/sofascore/client.rb @@ -19,7 +19,7 @@ class NetworkError < Error; end end OPERATIONS = JSON.parse(<<~'JSON').freeze - {"sofascore-categories": {"id": "sofascore-categories", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/categories", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-category-tournaments": {"id": "sofascore-category-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore category id from the categories endpoint", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "1"}], "path": "/sofascore/category-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-draft": {"id": "sofascore-draft", "method": "GET", "params": [{"description": "League whose draft to return", "enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string", "x-example": "nba"}, {"description": "Numeric SofaScore season id of the league", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "80229"}], "path": "/sofascore/draft", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-draft-picks": {"id": "sofascore-draft-picks", "method": "GET", "params": [{"description": "League whose draft to return", "enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string", "x-example": "nba"}, {"description": "Four-digit draft year", "in": "query", "name": "year", "required": true, "type": "string", "x-example": "2025"}, {"description": "Draft round: 1 to 2 for nba, 1 to 7 for nfl", "in": "query", "maximum": 7, "minimum": 1, "name": "round", "required": true, "type": "integer", "x-example": 1}], "path": "/sofascore/draft-picks", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string"}, {"in": "query", "name": "year", "required": true, "type": "string"}, {"in": "query", "name": "round", "required": true, "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-esports-game": {"id": "sofascore-esports-game", "method": "GET", "params": [{"description": "Numeric SofaScore esports game id from sofascore-event-esports-games", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "588883"}, {"description": "Which resource of the game to return", "enum": ["statistics", "lineups", "bans", "rounds"], "in": "query", "name": "part", "required": true, "type": "string", "x-example": "lineups"}], "path": "/sofascore/esports-game", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["statistics", "lineups", "bans", "rounds"], "in": "query", "name": "part", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event": {"id": "sofascore-event", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-at-bat-pitches": {"id": "sofascore-event-at-bat-pitches", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}, {"description": "Numeric at-bat id from sofascore-event-at-bats for the same event", "in": "query", "name": "at_bat_id", "required": true, "type": "string", "x-example": "2595879"}], "path": "/sofascore/event-at-bat-pitches", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "at_bat_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-at-bats": {"id": "sofascore-event-at-bats", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}], "path": "/sofascore/event-at-bats", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-average-positions": {"id": "sofascore-event-average-positions", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-average-positions", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-baseball-top-performers": {"id": "sofascore-event-baseball-top-performers", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}], "path": "/sofascore/event-baseball-top-performers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-best-players": {"id": "sofascore-event-best-players", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-best-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-comments": {"id": "sofascore-event-comments", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-comments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-esports-games": {"id": "sofascore-event-esports-games", "method": "GET", "params": [{"description": "Numeric SofaScore esports event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17260338"}], "path": "/sofascore/event-esports-games", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-graph": {"id": "sofascore-event-graph", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-graph", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-h2h": {"id": "sofascore-event-h2h", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-h2h", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-highlights": {"id": "sofascore-event-highlights", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-highlights", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-incidents": {"id": "sofascore-event-incidents", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-incidents", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-innings": {"id": "sofascore-event-innings", "method": "GET", "params": [{"description": "Numeric SofaScore cricket event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16253632"}], "path": "/sofascore/event-innings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-lineups": {"id": "sofascore-event-lineups", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-lineups", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-managers": {"id": "sofascore-event-managers", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-managers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-odds": {"id": "sofascore-event-odds", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-odds", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-player-heatmap": {"id": "sofascore-event-player-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore player id that played in the match", "in": "query", "name": "player_id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/event-player-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "player_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-player-statistics": {"id": "sofascore-event-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore player id that took part in the match", "in": "query", "name": "player_id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/event-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "player_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-point-by-point": {"id": "sofascore-event-point-by-point", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17257382"}], "path": "/sofascore/event-point-by-point", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-pregame-form": {"id": "sofascore-event-pregame-form", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-pregame-form", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-shotmap": {"id": "sofascore-event-shotmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-shotmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-statistics": {"id": "sofascore-event-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-team-heatmap": {"id": "sofascore-event-team-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore team id of the home or away side", "in": "query", "name": "team_id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/event-team-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "team_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-team-streaks": {"id": "sofascore-event-team-streaks", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-team-streaks", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-tennis-power": {"id": "sofascore-event-tennis-power", "method": "GET", "params": [{"description": "Numeric SofaScore tennis event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17257382"}], "path": "/sofascore/event-tennis-power", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-tv-channels": {"id": "sofascore-event-tv-channels", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Two-letter ISO 3166-1 alpha-2 country code. Omit to list the broadcasting countries only", "in": "query", "name": "country", "type": "string", "x-example": "GB"}], "path": "/sofascore/event-tv-channels", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "country", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-votes": {"id": "sofascore-event-votes", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-votes", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-live-events": {"id": "sofascore-live-events", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/live-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-manager": {"id": "sofascore-manager", "method": "GET", "params": [{"description": "Numeric SofaScore manager id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "794873"}], "path": "/sofascore/manager", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-manager-events": {"id": "sofascore-manager-events", "method": "GET", "params": [{"description": "Numeric SofaScore manager id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "794873"}, {"description": "Zero-based page number", "in": "query", "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/manager-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-mma-card": {"id": "sofascore-mma-card", "method": "GET", "params": [{"description": "Numeric SofaScore MMA organisation id", "in": "query", "name": "org_id", "required": true, "type": "string", "x-example": "19906"}, {"description": "Numeric card id (card_id) from sofascore-mma-schedule", "in": "query", "name": "card_id", "required": true, "type": "string", "x-example": "197311"}, {"description": "Which segment of the card to return", "enum": ["all", "maincard", "prelims", "earlyprelims"], "in": "query", "name": "part", "required": true, "type": "string", "x-example": "all"}], "path": "/sofascore/mma-card", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "org_id", "required": true, "type": "string"}, {"in": "query", "name": "card_id", "required": true, "type": "string"}, {"enum": ["all", "maincard", "prelims", "earlyprelims"], "in": "query", "name": "part", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-mma-schedule": {"id": "sofascore-mma-schedule", "method": "GET", "params": [{"description": "Numeric SofaScore MMA organisation id", "in": "query", "name": "org_id", "required": true, "type": "string", "x-example": "19906"}, {"description": "Calendar month as YYYY-MM", "in": "query", "name": "month", "required": true, "type": "string", "x-example": "2026-10"}], "path": "/sofascore/mma-schedule", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "org_id", "required": true, "type": "string"}, {"in": "query", "name": "month", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-odds-dropping": {"id": "sofascore-odds-dropping", "method": "GET", "params": [{"description": "Sport key, or all for every sport. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/odds-dropping", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-odds-winning": {"id": "sofascore-odds-winning", "method": "GET", "params": [{"description": "Sport key, or all for every sport. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/odds-winning", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player": {"id": "sofascore-player", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "855833"}], "path": "/sofascore/player", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-attributes": {"id": "sofascore-player-attributes", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-attributes", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-events": {"id": "sofascore-player-events", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/player-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-player-last-year-summary": {"id": "sofascore-player-last-year-summary", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-last-year-summary", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-national-team-statistics": {"id": "sofascore-player-national-team-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-national-team-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-penalty-history": {"id": "sofascore-player-penalty-history", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-penalty-history", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-ratings": {"id": "sofascore-player-ratings", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-ratings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-season-heatmap": {"id": "sofascore-player-season-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/player-season-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-season-statistics": {"id": "sofascore-player-season-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-season-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-statistical-rankings": {"id": "sofascore-player-statistical-rankings", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-statistical-rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-statistics-seasons": {"id": "sofascore-player-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-tournaments": {"id": "sofascore-player-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-transfers": {"id": "sofascore-player-transfers", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-transfers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-ranking-types": {"id": "sofascore-ranking-types", "method": "GET", "params": [], "path": "/sofascore/ranking-types", "pathParams": [], "produces": ["application/json"], "queryParams": [], "security": ["ApiKeyAuth"]}, "sofascore-rankings": {"id": "sofascore-rankings", "method": "GET", "params": [{"description": "Ranking id from sofascore-ranking-types", "enum": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45, 46], "in": "query", "name": "type", "required": true, "type": "integer", "x-example": 5}, {"description": "Return only the first N rows, 1 to 500. Omit to return every row", "in": "query", "maximum": 500, "minimum": 1, "name": "limit", "type": "integer", "x-example": 10}], "path": "/sofascore/rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "34", "35", "36", "37", "40", "41", "42", "43", "44", "45", "46"], "in": "query", "name": "type", "required": true, "type": "integer"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-referee": {"id": "sofascore-referee", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}], "path": "/sofascore/referee", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-referee-events": {"id": "sofascore-referee-events", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/referee-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-referee-statistics": {"id": "sofascore-referee-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}], "path": "/sofascore/referee-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-round-events": {"id": "sofascore-round-events", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"description": "Round number", "in": "query", "name": "round", "required": true, "type": "integer", "x-example": 1}, {"description": "Round slug from tournament-rounds, for example round-of-16; required for knockout and named cup rounds", "in": "query", "name": "slug", "type": "string", "x-example": "round-of-16"}, {"description": "Round prefix from tournament-rounds, for example Qualification; only valid together with slug", "in": "query", "name": "prefix", "type": "string", "x-example": "Qualification"}], "path": "/sofascore/round-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"in": "query", "name": "round", "required": true, "type": "integer"}, {"in": "query", "name": "slug", "type": "string"}, {"in": "query", "name": "prefix", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-scheduled-events": {"id": "sofascore-scheduled-events", "method": "GET", "params": [{"description": "Numeric SofaScore category id from the categories endpoint", "in": "query", "name": "category_id", "required": true, "type": "string", "x-example": "13"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-08"}], "path": "/sofascore/scheduled-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "category_id", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-scheduled-tournaments": {"id": "sofascore-scheduled-tournaments", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-08"}, {"description": "One-based page number; defaults to 1", "in": "query", "maximum": 100, "minimum": 1, "name": "page", "type": "integer", "x-example": 1}], "path": "/sofascore/scheduled-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-search": {"id": "sofascore-search", "method": "GET", "params": [{"description": "Free-text search query", "in": "query", "name": "q", "required": true, "type": "string", "x-example": "barcelona"}], "path": "/sofascore/search", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "q", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-search-typed": {"id": "sofascore-search-typed", "method": "GET", "params": [{"description": "Entity type to search", "enum": ["events", "teams", "players", "managers", "referees", "venues", "unique_tournaments"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "teams"}, {"description": "Search text, up to 128 characters", "in": "query", "name": "q", "required": true, "type": "string", "x-example": "arsenal"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}, {"description": "Restrict teams, players, managers or unique_tournaments to one sport", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/search-typed", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["events", "teams", "players", "managers", "referees", "venues", "unique_tournaments"], "in": "query", "name": "type", "required": true, "type": "string"}, {"in": "query", "name": "q", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}, {"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-season-events": {"id": "sofascore-season-events", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Upcoming fixtures or finished results", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "last"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/season-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-sports": {"id": "sofascore-sports", "method": "GET", "params": [], "path": "/sofascore/sports", "pathParams": [], "produces": ["application/json"], "queryParams": [], "security": ["ApiKeyAuth"]}, "sofascore-stage": {"id": "sofascore-stage", "method": "GET", "params": [{"description": "Numeric SofaScore stage id from stage-schedule, stage-seasons or stage-substages", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}], "path": "/sofascore/stage", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-categories": {"id": "sofascore-stage-categories", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}], "path": "/sofascore/stage-categories", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-driver-performance": {"id": "sofascore-stage-driver-performance", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a finished race, sprint or rally", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}], "path": "/sofascore/stage-driver-performance", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-featured": {"id": "sofascore-stage-featured", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}], "path": "/sofascore/stage-featured", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-schedule": {"id": "sofascore-stage-schedule", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-04"}], "path": "/sofascore/stage-schedule", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-seasons": {"id": "sofascore-stage-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore competition id from stage-categories", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "40"}], "path": "/sofascore/stage-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-standings": {"id": "sofascore-stage-standings", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a season, event, session or cycling stage", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}, {"description": "Classification kind", "enum": ["competitor", "team"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "competitor"}], "path": "/sofascore/stage-standings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["competitor", "team"], "in": "query", "name": "type", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-substages": {"id": "sofascore-stage-substages", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a season or an event", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214253"}], "path": "/sofascore/stage-substages", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-standings": {"id": "sofascore-standings", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"description": "Standings variant", "enum": ["total", "home", "away"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "total"}], "path": "/sofascore/standings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["total", "home", "away"], "in": "query", "name": "type", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team": {"id": "sofascore-team", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}], "path": "/sofascore/team", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-achievements": {"id": "sofascore-team-achievements", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-achievements", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-events": {"id": "sofascore-team-events", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}, {"description": "Fixture direction", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "next"}, {"description": "Zero-based page number", "in": "query", "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/team-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-team-goal-distributions": {"id": "sofascore-team-goal-distributions", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/team-goal-distributions", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-near-events": {"id": "sofascore-team-near-events", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-near-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-of-the-week": {"id": "sofascore-team-of-the-week", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Numeric period id from sofascore-team-of-the-week-periods", "in": "query", "name": "period", "required": true, "type": "string", "x-example": "29321"}], "path": "/sofascore/team-of-the-week", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"in": "query", "name": "period", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-of-the-week-periods": {"id": "sofascore-team-of-the-week-periods", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/team-of-the-week-periods", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-performance": {"id": "sofascore-team-performance", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-performance", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-player-statistics": {"id": "sofascore-team-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/team-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-player-statistics-seasons": {"id": "sofascore-team-player-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-player-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-players": {"id": "sofascore-team-players", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}], "path": "/sofascore/team-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-rankings": {"id": "sofascore-team-rankings", "method": "GET", "params": [{"description": "Numeric SofaScore team id (a tennis player id for tennis)", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "112783"}], "path": "/sofascore/team-rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-season-statistics": {"id": "sofascore-team-season-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/team-season-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-statistics-seasons": {"id": "sofascore-team-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-top-players": {"id": "sofascore-team-top-players", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics scope", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/team-top-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-team-tournaments": {"id": "sofascore-team-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"default": false, "description": "false returns current competitions, true returns every recorded competition", "in": "query", "name": "all", "type": "boolean"}], "path": "/sofascore/team-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "all", "type": "boolean"}], "security": ["ApiKeyAuth"]}, "sofascore-team-transfers": {"id": "sofascore-team-transfers", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-transfers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tennis-player-grand-slam-results": {"id": "sofascore-tennis-player-grand-slam-results", "method": "GET", "params": [{"description": "Numeric SofaScore team id of a tennis player", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14882"}], "path": "/sofascore/tennis-player-grand-slam-results", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-cuptree": {"id": "sofascore-tournament-cuptree", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a cup or playoff competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "7"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76953"}], "path": "/sofascore/tournament-cuptree", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-info": {"id": "sofascore-tournament-info", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id. Omit for competition metadata only", "in": "query", "name": "season", "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-info", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-player-of-the-season": {"id": "sofascore-tournament-player-of-the-season", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id of a finished season", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/tournament-player-of-the-season", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-player-statistics": {"id": "sofascore-tournament-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistic to sort by. Defaults to rating", "enum": ["rating", "goals", "expectedGoals", "assists", "successfulDribbles", "tackles", "accuratePassesPercentage", "bigChancesMissed", "totalShots", "goalConversionPercentage", "interceptions", "clearances", "errorLeadToGoal", "outfielderBlocks", "bigChancesCreated", "accuratePasses", "keyPasses", "saves", "cleanSheet", "penaltySave", "savedShotsFromInsideTheBox", "runsOut"], "in": "query", "name": "order", "type": "string", "x-example": "goals"}, {"description": "Sort direction. Defaults to desc", "enum": ["desc", "asc"], "in": "query", "name": "direction", "type": "string", "x-example": "desc"}, {"description": "How statistics are accumulated. Defaults to total", "enum": ["total", "perGame", "per90"], "in": "query", "name": "accumulation", "type": "string", "x-example": "total"}, {"description": "Statistic columns returned. Defaults to summary", "enum": ["summary", "attack", "defence", "passing", "goalkeeper"], "in": "query", "name": "group", "type": "string", "x-example": "summary"}, {"description": "Rows per page, 1 to 100. Defaults to 20", "in": "query", "maximum": 100, "minimum": 1, "name": "limit", "type": "integer", "x-example": 20}, {"description": "Rows to skip. Defaults to 0", "in": "query", "minimum": 0, "name": "offset", "type": "integer", "x-example": 0}, {"collectionFormat": "csv", "description": "Team ids to keep, comma separated, up to 20 (ids from tournament-statistics-info or tournament-teams)", "in": "query", "items": {"type": "string"}, "name": "team", "type": "array", "x-example": "42"}, {"collectionFormat": "csv", "description": "Nationality codes to keep, comma separated, up to 20 (codes from tournament-statistics-info)", "in": "query", "items": {"type": "string"}, "name": "nationality", "type": "array", "x-example": "EN"}, {"collectionFormat": "csv", "description": "Position codes to keep, comma separated", "in": "query", "items": {"enum": ["G", "D", "M", "F"], "type": "string"}, "name": "position", "type": "array", "x-example": "F"}, {"description": "Keep players with at least this many appearances, 0 to 1000. Omit for no minimum", "in": "query", "maximum": 1000, "minimum": 0, "name": "min_appearances", "type": "integer", "x-example": 10}, {"description": "Keep players with at least this many minutes played, 0 to 100000. Omit for no minimum", "in": "query", "maximum": 100000, "minimum": 0, "name": "min_minutes", "type": "integer", "x-example": 900}], "path": "/sofascore/tournament-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["rating", "goals", "expectedGoals", "assists", "successfulDribbles", "tackles", "accuratePassesPercentage", "bigChancesMissed", "totalShots", "goalConversionPercentage", "interceptions", "clearances", "errorLeadToGoal", "outfielderBlocks", "bigChancesCreated", "accuratePasses", "keyPasses", "saves", "cleanSheet", "penaltySave", "savedShotsFromInsideTheBox", "runsOut"], "in": "query", "name": "order", "type": "string"}, {"enum": ["desc", "asc"], "in": "query", "name": "direction", "type": "string"}, {"enum": ["total", "perGame", "per90"], "in": "query", "name": "accumulation", "type": "string"}, {"enum": ["summary", "attack", "defence", "passing", "goalkeeper"], "in": "query", "name": "group", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}, {"in": "query", "name": "offset", "type": "integer"}, {"collectionFormat": "csv", "in": "query", "name": "team", "type": "array"}, {"collectionFormat": "csv", "in": "query", "name": "nationality", "type": "array"}, {"collectionFormat": "csv", "enum": ["G", "D", "M", "F"], "in": "query", "name": "position", "type": "array"}, {"in": "query", "name": "min_appearances", "type": "integer"}, {"in": "query", "name": "min_minutes", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-rounds": {"id": "sofascore-tournament-rounds", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "7"}, {"description": "Numeric SofaScore season id from tournament-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76953"}], "path": "/sofascore/tournament-rounds", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-seasons": {"id": "sofascore-tournament-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/tournament-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-statistics-info": {"id": "sofascore-tournament-statistics-info", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-statistics-info", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-team-of-the-season": {"id": "sofascore-tournament-team-of-the-season", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id of a finished season", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/tournament-team-of-the-season", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-teams": {"id": "sofascore-tournament-teams", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-teams", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-top-players": {"id": "sofascore-tournament-top-players", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistics scope. Defaults to overall", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string", "x-example": "overall"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/tournament-top-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-top-teams": {"id": "sofascore-tournament-top-teams", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistics scope. Defaults to overall", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string", "x-example": "overall"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/tournament-top-teams", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-venues": {"id": "sofascore-tournament-venues", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-venues", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-winners": {"id": "sofascore-tournament-winners", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/tournament-winners", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournaments-with-feature": {"id": "sofascore-tournaments-with-feature", "method": "GET", "params": [{"description": "Competition feature", "enum": ["cuptree", "standings", "totw", "power_rankings"], "in": "query", "name": "feature", "required": true, "type": "string", "x-example": "cuptree"}, {"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "minifootball", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/tournaments-with-feature", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["cuptree", "standings", "totw", "power_rankings"], "in": "query", "name": "feature", "required": true, "type": "string"}, {"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "minifootball", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-trending-events": {"id": "sofascore-trending-events", "method": "GET", "params": [{"description": "Two-letter ISO 3166-1 alpha-2 country code", "in": "query", "name": "country", "required": true, "type": "string", "x-example": "GB"}], "path": "/sofascore/trending-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "country", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-trending-players": {"id": "sofascore-trending-players", "method": "GET", "params": [{"description": "Sport key", "enum": ["football", "basketball"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/trending-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["football", "basketball"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-venue": {"id": "sofascore-venue", "method": "GET", "params": [{"description": "Numeric SofaScore venue id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "624"}], "path": "/sofascore/venue", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-venue-events": {"id": "sofascore-venue-events", "method": "GET", "params": [{"description": "Numeric SofaScore venue id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "624"}, {"description": "Upcoming matches or finished matches", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "last"}, {"description": "Sport filter for the venue-wide list. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}, {"description": "Numeric unique-tournament id; with season, lists that competition season's matches at the venue", "in": "query", "name": "tournament", "type": "string", "x-example": "17"}, {"description": "Numeric season id; with tournament, lists that competition season's matches at the venue", "in": "query", "name": "season", "type": "string", "x-example": "96668"}], "path": "/sofascore/venue-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}, {"in": "query", "name": "page", "type": "integer"}, {"in": "query", "name": "tournament", "type": "string"}, {"in": "query", "name": "season", "type": "string"}], "security": ["ApiKeyAuth"]}} + {"sofascore-categories": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-categories", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/categories", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-category-tournaments": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-category-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore category id from the categories endpoint", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "1"}], "path": "/sofascore/category-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-draft": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-draft", "method": "GET", "params": [{"description": "League whose draft to return", "enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string", "x-example": "nba"}, {"description": "Numeric SofaScore season id of the league", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "80229"}], "path": "/sofascore/draft", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-draft-picks": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-draft-picks", "method": "GET", "params": [{"description": "League whose draft to return", "enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string", "x-example": "nba"}, {"description": "Four-digit draft year", "in": "query", "name": "year", "required": true, "type": "string", "x-example": "2025"}, {"description": "Draft round: 1 to 2 for nba, 1 to 7 for nfl", "in": "query", "maximum": 7, "minimum": 1, "name": "round", "required": true, "type": "integer", "x-example": 1}], "path": "/sofascore/draft-picks", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["nba", "nfl"], "in": "query", "name": "league", "required": true, "type": "string"}, {"in": "query", "name": "year", "required": true, "type": "string"}, {"in": "query", "name": "round", "required": true, "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-esports-game": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-esports-game", "method": "GET", "params": [{"description": "Numeric SofaScore esports game id from sofascore-event-esports-games", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "588883"}, {"description": "Which resource of the game to return", "enum": ["statistics", "lineups", "bans", "rounds"], "in": "query", "name": "part", "required": true, "type": "string", "x-example": "lineups"}], "path": "/sofascore/esports-game", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["statistics", "lineups", "bans", "rounds"], "in": "query", "name": "part", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-at-bat-pitches": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-at-bat-pitches", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}, {"description": "Numeric at-bat id from sofascore-event-at-bats for the same event", "in": "query", "name": "at_bat_id", "required": true, "type": "string", "x-example": "2595879"}], "path": "/sofascore/event-at-bat-pitches", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "at_bat_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-at-bats": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-at-bats", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}], "path": "/sofascore/event-at-bats", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-average-positions": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-average-positions", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-average-positions", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-baseball-top-performers": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-baseball-top-performers", "method": "GET", "params": [{"description": "Numeric SofaScore baseball event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17199139"}], "path": "/sofascore/event-baseball-top-performers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-best-players": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-best-players", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-best-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-comments": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-comments", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-comments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-esports-games": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-esports-games", "method": "GET", "params": [{"description": "Numeric SofaScore esports event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17260338"}], "path": "/sofascore/event-esports-games", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-graph": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-graph", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-graph", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-h2h": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-h2h", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-h2h", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-highlights": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-highlights", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-highlights", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-incidents": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-incidents", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-incidents", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-innings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-innings", "method": "GET", "params": [{"description": "Numeric SofaScore cricket event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16253632"}], "path": "/sofascore/event-innings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-lineups": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-lineups", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-lineups", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-managers": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-managers", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-managers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-odds": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-odds", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-odds", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-player-heatmap": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-player-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore player id that played in the match", "in": "query", "name": "player_id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/event-player-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "player_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-player-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore player id that took part in the match", "in": "query", "name": "player_id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/event-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "player_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-point-by-point": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-point-by-point", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17257382"}], "path": "/sofascore/event-point-by-point", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-pregame-form": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-pregame-form", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-pregame-form", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-shotmap": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-shotmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-shotmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14025013"}], "path": "/sofascore/event-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-team-heatmap": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-team-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Numeric SofaScore team id of the home or away side", "in": "query", "name": "team_id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/event-team-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "team_id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-team-streaks": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-team-streaks", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-team-streaks", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-tennis-power": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-tennis-power", "method": "GET", "params": [{"description": "Numeric SofaScore tennis event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17257382"}], "path": "/sofascore/event-tennis-power", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-tv-channels": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-tv-channels", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}, {"description": "Two-letter ISO 3166-1 alpha-2 country code. Omit to list the broadcasting countries only", "in": "query", "name": "country", "type": "string", "x-example": "GB"}], "path": "/sofascore/event-tv-channels", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "country", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-event-votes": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-event-votes", "method": "GET", "params": [{"description": "Numeric SofaScore event (match) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "16363867"}], "path": "/sofascore/event-votes", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-live-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-live-events", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/live-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-manager": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-manager", "method": "GET", "params": [{"description": "Numeric SofaScore manager id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "794873"}], "path": "/sofascore/manager", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-manager-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-manager-events", "method": "GET", "params": [{"description": "Numeric SofaScore manager id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "794873"}, {"description": "Zero-based page number", "in": "query", "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/manager-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-mma-card": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-mma-card", "method": "GET", "params": [{"description": "Numeric SofaScore MMA organisation id", "in": "query", "name": "org_id", "required": true, "type": "string", "x-example": "19906"}, {"description": "Numeric card id (card_id) from sofascore-mma-schedule", "in": "query", "name": "card_id", "required": true, "type": "string", "x-example": "197311"}, {"description": "Which segment of the card to return", "enum": ["all", "maincard", "prelims", "earlyprelims"], "in": "query", "name": "part", "required": true, "type": "string", "x-example": "all"}], "path": "/sofascore/mma-card", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "org_id", "required": true, "type": "string"}, {"in": "query", "name": "card_id", "required": true, "type": "string"}, {"enum": ["all", "maincard", "prelims", "earlyprelims"], "in": "query", "name": "part", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-mma-schedule": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-mma-schedule", "method": "GET", "params": [{"description": "Numeric SofaScore MMA organisation id", "in": "query", "name": "org_id", "required": true, "type": "string", "x-example": "19906"}, {"description": "Calendar month as YYYY-MM", "in": "query", "name": "month", "required": true, "type": "string", "x-example": "2026-10"}], "path": "/sofascore/mma-schedule", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "org_id", "required": true, "type": "string"}, {"in": "query", "name": "month", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-odds-dropping": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-odds-dropping", "method": "GET", "params": [{"description": "Sport key, or all for every sport. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/odds-dropping", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-odds-winning": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-odds-winning", "method": "GET", "params": [{"description": "Sport key, or all for every sport. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/odds-winning", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "855833"}], "path": "/sofascore/player", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-attributes": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-attributes", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-attributes", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-events", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/player-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-player-last-year-summary": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-last-year-summary", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-last-year-summary", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-national-team-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-national-team-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-national-team-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-penalty-history": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-penalty-history", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-penalty-history", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-ratings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-ratings", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-ratings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-season-heatmap": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-season-heatmap", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/player-season-heatmap", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-season-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-season-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-season-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-statistical-rankings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-statistical-rankings", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}, {"description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/player-statistical-rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-statistics-seasons": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-tournaments": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-player-transfers": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-player-transfers", "method": "GET", "params": [{"description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "839956"}], "path": "/sofascore/player-transfers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-ranking-types": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-ranking-types", "method": "GET", "params": [], "path": "/sofascore/ranking-types", "pathParams": [], "produces": ["application/json"], "queryParams": [], "security": ["ApiKeyAuth"]}, "sofascore-rankings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-rankings", "method": "GET", "params": [{"description": "Ranking id from sofascore-ranking-types", "enum": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45, 46], "in": "query", "name": "type", "required": true, "type": "integer", "x-example": 5}, {"description": "Return only the first N rows, 1 to 500. Omit to return every row", "in": "query", "maximum": 500, "minimum": 1, "name": "limit", "type": "integer", "x-example": 10}], "path": "/sofascore/rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "34", "35", "36", "37", "40", "41", "42", "43", "44", "45", "46"], "in": "query", "name": "type", "required": true, "type": "integer"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-referee": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-referee", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}], "path": "/sofascore/referee", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-referee-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-referee-events", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/referee-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-referee-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-referee-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "74264"}], "path": "/sofascore/referee-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-round-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-round-events", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"description": "Round number", "in": "query", "name": "round", "required": true, "type": "integer", "x-example": 1}, {"description": "Round slug from tournament-rounds, for example round-of-16; required for knockout and named cup rounds", "in": "query", "name": "slug", "type": "string", "x-example": "round-of-16"}, {"description": "Round prefix from tournament-rounds, for example Qualification; only valid together with slug", "in": "query", "name": "prefix", "type": "string", "x-example": "Qualification"}], "path": "/sofascore/round-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"in": "query", "name": "round", "required": true, "type": "integer"}, {"in": "query", "name": "slug", "type": "string"}, {"in": "query", "name": "prefix", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-scheduled-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-scheduled-events", "method": "GET", "params": [{"description": "Numeric SofaScore category id from the categories endpoint", "in": "query", "name": "category_id", "required": true, "type": "string", "x-example": "13"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-08"}], "path": "/sofascore/scheduled-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "category_id", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-scheduled-tournaments": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-scheduled-tournaments", "method": "GET", "params": [{"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-08"}, {"description": "One-based page number; defaults to 1", "in": "query", "maximum": 100, "minimum": 1, "name": "page", "type": "integer", "x-example": 1}], "path": "/sofascore/scheduled-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-search": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-search", "method": "GET", "params": [{"description": "Free-text search query", "in": "query", "name": "q", "required": true, "type": "string", "x-example": "barcelona"}], "path": "/sofascore/search", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "q", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-search-typed": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-search-typed", "method": "GET", "params": [{"description": "Entity type to search", "enum": ["events", "teams", "players", "managers", "referees", "venues", "unique_tournaments"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "teams"}, {"description": "Search text, up to 128 characters", "in": "query", "name": "q", "required": true, "type": "string", "x-example": "arsenal"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}, {"description": "Restrict teams, players, managers or unique_tournaments to one sport", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}], "path": "/sofascore/search-typed", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["events", "teams", "players", "managers", "referees", "venues", "unique_tournaments"], "in": "query", "name": "type", "required": true, "type": "string"}, {"in": "query", "name": "q", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}, {"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-season-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-season-events", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Upcoming fixtures or finished results", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "last"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/season-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-sports": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-sports", "method": "GET", "params": [], "path": "/sofascore/sports", "pathParams": [], "produces": ["application/json"], "queryParams": [], "security": ["ApiKeyAuth"]}, "sofascore-stage": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage", "method": "GET", "params": [{"description": "Numeric SofaScore stage id from stage-schedule, stage-seasons or stage-substages", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}], "path": "/sofascore/stage", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-categories": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-categories", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}], "path": "/sofascore/stage-categories", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-driver-performance": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-driver-performance", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a finished race, sprint or rally", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}], "path": "/sofascore/stage-driver-performance", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-featured": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-featured", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}], "path": "/sofascore/stage-featured", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-schedule": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-schedule", "method": "GET", "params": [{"description": "Stage sport key", "enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "motorsport"}, {"description": "UTC calendar date, YYYY-MM-DD", "in": "query", "name": "date", "required": true, "type": "string", "x-example": "2026-10-04"}], "path": "/sofascore/stage-schedule", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["motorsport", "cycling"], "in": "query", "name": "sport", "required": true, "type": "string"}, {"in": "query", "name": "date", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-seasons": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore competition id from stage-categories", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "40"}], "path": "/sofascore/stage-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-standings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-standings", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a season, event, session or cycling stage", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214258"}, {"description": "Classification kind", "enum": ["competitor", "team"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "competitor"}], "path": "/sofascore/stage-standings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["competitor", "team"], "in": "query", "name": "type", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-stage-substages": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-stage-substages", "method": "GET", "params": [{"description": "Numeric SofaScore stage id of a season or an event", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "214253"}], "path": "/sofascore/stage-substages", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-standings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-standings", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}, {"description": "Standings variant", "enum": ["total", "home", "away"], "in": "query", "name": "type", "required": true, "type": "string", "x-example": "total"}], "path": "/sofascore/standings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["total", "home", "away"], "in": "query", "name": "type", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}], "path": "/sofascore/team", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-achievements": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-achievements", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-achievements", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-events", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}, {"description": "Fixture direction", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "next"}, {"description": "Zero-based page number", "in": "query", "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/team-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-team-goal-distributions": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-goal-distributions", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/team-goal-distributions", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-near-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-near-events", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-near-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-of-the-week": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-of-the-week", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Numeric period id from sofascore-team-of-the-week-periods", "in": "query", "name": "period", "required": true, "type": "string", "x-example": "29321"}], "path": "/sofascore/team-of-the-week", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"in": "query", "name": "period", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-of-the-week-periods": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-of-the-week-periods", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/team-of-the-week-periods", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-performance": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-performance", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-performance", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-player-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/team-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-player-statistics-seasons": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-player-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-player-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-players": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-players", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "2817"}], "path": "/sofascore/team-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-rankings": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-rankings", "method": "GET", "params": [{"description": "Numeric SofaScore team id (a tennis player id for tennis)", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "112783"}], "path": "/sofascore/team-rankings", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-season-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-season-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics view", "enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "path": "/sofascore/team-season-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "home", "away", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-statistics-seasons": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-statistics-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-statistics-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-team-top-players": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-top-players", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", "in": "query", "name": "tournament_id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id from team-player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"default": "overall", "description": "Statistics scope", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/team-top-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "tournament_id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-team-tournaments": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-tournaments", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"default": false, "description": "false returns current competitions, true returns every recorded competition", "in": "query", "name": "all", "type": "boolean"}], "path": "/sofascore/team-tournaments", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "all", "type": "boolean"}], "security": ["ApiKeyAuth"]}, "sofascore-team-transfers": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-team-transfers", "method": "GET", "params": [{"description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/team-transfers", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tennis-player-grand-slam-results": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tennis-player-grand-slam-results", "method": "GET", "params": [{"description": "Numeric SofaScore team id of a tennis player", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "14882"}], "path": "/sofascore/tennis-player-grand-slam-results", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-cuptree": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-cuptree", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a cup or playoff competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "7"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76953"}], "path": "/sofascore/tournament-cuptree", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-info": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-info", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id. Omit for competition metadata only", "in": "query", "name": "season", "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-info", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-player-of-the-season": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-player-of-the-season", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id of a finished season", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/tournament-player-of-the-season", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-player-statistics": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-player-statistics", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistic to sort by. Defaults to rating", "enum": ["rating", "goals", "expectedGoals", "assists", "successfulDribbles", "tackles", "accuratePassesPercentage", "bigChancesMissed", "totalShots", "goalConversionPercentage", "interceptions", "clearances", "errorLeadToGoal", "outfielderBlocks", "bigChancesCreated", "accuratePasses", "keyPasses", "saves", "cleanSheet", "penaltySave", "savedShotsFromInsideTheBox", "runsOut"], "in": "query", "name": "order", "type": "string", "x-example": "goals"}, {"description": "Sort direction. Defaults to desc", "enum": ["desc", "asc"], "in": "query", "name": "direction", "type": "string", "x-example": "desc"}, {"description": "How statistics are accumulated. Defaults to total", "enum": ["total", "perGame", "per90"], "in": "query", "name": "accumulation", "type": "string", "x-example": "total"}, {"description": "Statistic columns returned. Defaults to summary", "enum": ["summary", "attack", "defence", "passing", "goalkeeper"], "in": "query", "name": "group", "type": "string", "x-example": "summary"}, {"description": "Rows per page, 1 to 100. Defaults to 20", "in": "query", "maximum": 100, "minimum": 1, "name": "limit", "type": "integer", "x-example": 20}, {"description": "Rows to skip. Defaults to 0", "in": "query", "minimum": 0, "name": "offset", "type": "integer", "x-example": 0}, {"collectionFormat": "csv", "description": "Team ids to keep, comma separated, up to 20 (ids from tournament-statistics-info or tournament-teams)", "in": "query", "items": {"type": "string"}, "name": "team", "type": "array", "x-example": "42"}, {"collectionFormat": "csv", "description": "Nationality codes to keep, comma separated, up to 20 (codes from tournament-statistics-info)", "in": "query", "items": {"type": "string"}, "name": "nationality", "type": "array", "x-example": "EN"}, {"collectionFormat": "csv", "description": "Position codes to keep, comma separated", "in": "query", "items": {"enum": ["G", "D", "M", "F"], "type": "string"}, "name": "position", "type": "array", "x-example": "F"}, {"description": "Keep players with at least this many appearances, 0 to 1000. Omit for no minimum", "in": "query", "maximum": 1000, "minimum": 0, "name": "min_appearances", "type": "integer", "x-example": 10}, {"description": "Keep players with at least this many minutes played, 0 to 100000. Omit for no minimum", "in": "query", "maximum": 100000, "minimum": 0, "name": "min_minutes", "type": "integer", "x-example": 900}], "path": "/sofascore/tournament-player-statistics", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["rating", "goals", "expectedGoals", "assists", "successfulDribbles", "tackles", "accuratePassesPercentage", "bigChancesMissed", "totalShots", "goalConversionPercentage", "interceptions", "clearances", "errorLeadToGoal", "outfielderBlocks", "bigChancesCreated", "accuratePasses", "keyPasses", "saves", "cleanSheet", "penaltySave", "savedShotsFromInsideTheBox", "runsOut"], "in": "query", "name": "order", "type": "string"}, {"enum": ["desc", "asc"], "in": "query", "name": "direction", "type": "string"}, {"enum": ["total", "perGame", "per90"], "in": "query", "name": "accumulation", "type": "string"}, {"enum": ["summary", "attack", "defence", "passing", "goalkeeper"], "in": "query", "name": "group", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}, {"in": "query", "name": "offset", "type": "integer"}, {"collectionFormat": "csv", "in": "query", "name": "team", "type": "array"}, {"collectionFormat": "csv", "in": "query", "name": "nationality", "type": "array"}, {"collectionFormat": "csv", "enum": ["G", "D", "M", "F"], "in": "query", "name": "position", "type": "array"}, {"in": "query", "name": "min_appearances", "type": "integer"}, {"in": "query", "name": "min_minutes", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-rounds": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-rounds", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "7"}, {"description": "Numeric SofaScore season id from tournament-seasons", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76953"}], "path": "/sofascore/tournament-rounds", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-seasons": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-seasons", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}], "path": "/sofascore/tournament-seasons", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-statistics-info": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-statistics-info", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-statistics-info", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-team-of-the-season": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-team-of-the-season", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id of a finished season", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "76986"}], "path": "/sofascore/tournament-team-of-the-season", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-teams": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-teams", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-teams", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-top-players": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-top-players", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistics scope. Defaults to overall", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string", "x-example": "overall"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/tournament-top-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-top-teams": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-top-teams", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}, {"description": "Statistics scope. Defaults to overall", "enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string", "x-example": "overall"}, {"description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", "maximum": 50, "minimum": 1, "name": "limit", "type": "integer", "x-example": 5}], "path": "/sofascore/tournament-top-teams", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}, {"enum": ["overall", "regular_season", "playoffs"], "in": "query", "name": "type", "type": "string"}, {"in": "query", "name": "limit", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-venues": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-venues", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", "x-example": "96668"}], "path": "/sofascore/tournament-venues", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "season", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-tournament-winners": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournament-winners", "method": "GET", "params": [{"description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "17"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}], "path": "/sofascore/tournament-winners", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"in": "query", "name": "page", "type": "integer"}], "security": ["ApiKeyAuth"]}, "sofascore-tournaments-with-feature": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-tournaments-with-feature", "method": "GET", "params": [{"description": "Competition feature", "enum": ["cuptree", "standings", "totw", "power_rankings"], "in": "query", "name": "feature", "required": true, "type": "string", "x-example": "cuptree"}, {"description": "Sport key", "enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "minifootball", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/tournaments-with-feature", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["cuptree", "standings", "totw", "power_rankings"], "in": "query", "name": "feature", "required": true, "type": "string"}, {"enum": ["american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "minifootball", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-trending-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-trending-events", "method": "GET", "params": [{"description": "Two-letter ISO 3166-1 alpha-2 country code", "in": "query", "name": "country", "required": true, "type": "string", "x-example": "GB"}], "path": "/sofascore/trending-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "country", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-trending-players": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-trending-players", "method": "GET", "params": [{"description": "Sport key", "enum": ["football", "basketball"], "in": "query", "name": "sport", "required": true, "type": "string", "x-example": "football"}], "path": "/sofascore/trending-players", "pathParams": [], "produces": ["application/json"], "queryParams": [{"enum": ["football", "basketball"], "in": "query", "name": "sport", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-venue": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-venue", "method": "GET", "params": [{"description": "Numeric SofaScore venue id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "624"}], "path": "/sofascore/venue", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}], "security": ["ApiKeyAuth"]}, "sofascore-venue-events": {"bodyParam": null, "bodyRequired": false, "id": "sofascore-venue-events", "method": "GET", "params": [{"description": "Numeric SofaScore venue id", "in": "query", "name": "id", "required": true, "type": "string", "x-example": "624"}, {"description": "Upcoming matches or finished matches", "enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string", "x-example": "last"}, {"description": "Sport filter for the venue-wide list. Defaults to all", "enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string", "x-example": "football"}, {"description": "Zero-based page number. Defaults to 0", "in": "query", "minimum": 0, "name": "page", "type": "integer", "x-example": 0}, {"description": "Numeric unique-tournament id; with season, lists that competition season's matches at the venue", "in": "query", "name": "tournament", "type": "string", "x-example": "17"}, {"description": "Numeric season id; with tournament, lists that competition season's matches at the venue", "in": "query", "name": "season", "type": "string", "x-example": "96668"}], "path": "/sofascore/venue-events", "pathParams": [], "produces": ["application/json"], "queryParams": [{"in": "query", "name": "id", "required": true, "type": "string"}, {"enum": ["next", "last"], "in": "query", "name": "direction", "required": true, "type": "string"}, {"enum": ["all", "american-football", "aussie-rules", "badminton", "bandy", "baseball", "basketball", "beach-volley", "cricket", "darts", "esports", "floorball", "football", "futsal", "handball", "ice-hockey", "mma", "minifootball", "padel", "rugby", "snooker", "table-tennis", "tennis", "volleyball", "waterpolo"], "in": "query", "name": "sport", "type": "string"}, {"in": "query", "name": "page", "type": "integer"}, {"in": "query", "name": "tournament", "type": "string"}, {"in": "query", "name": "season", "type": "string"}], "security": ["ApiKeyAuth"]}} JSON OPERATION_IDS = JSON.parse(<<~'JSON').freeze ["sofascore-categories", "sofascore-category-tournaments", "sofascore-draft", "sofascore-draft-picks", "sofascore-esports-game", "sofascore-event", "sofascore-event-at-bat-pitches", "sofascore-event-at-bats", "sofascore-event-average-positions", "sofascore-event-baseball-top-performers", "sofascore-event-best-players", "sofascore-event-comments", "sofascore-event-esports-games", "sofascore-event-graph", "sofascore-event-h2h", "sofascore-event-highlights", "sofascore-event-incidents", "sofascore-event-innings", "sofascore-event-lineups", "sofascore-event-managers", "sofascore-event-odds", "sofascore-event-player-heatmap", "sofascore-event-player-statistics", "sofascore-event-point-by-point", "sofascore-event-pregame-form", "sofascore-event-shotmap", "sofascore-event-statistics", "sofascore-event-team-heatmap", "sofascore-event-team-streaks", "sofascore-event-tennis-power", "sofascore-event-tv-channels", "sofascore-event-votes", "sofascore-live-events", "sofascore-manager", "sofascore-manager-events", "sofascore-mma-card", "sofascore-mma-schedule", "sofascore-odds-dropping", "sofascore-odds-winning", "sofascore-player", "sofascore-player-attributes", "sofascore-player-events", "sofascore-player-last-year-summary", "sofascore-player-national-team-statistics", "sofascore-player-penalty-history", "sofascore-player-ratings", "sofascore-player-season-heatmap", "sofascore-player-season-statistics", "sofascore-player-statistical-rankings", "sofascore-player-statistics-seasons", "sofascore-player-tournaments", "sofascore-player-transfers", "sofascore-ranking-types", "sofascore-rankings", "sofascore-referee", "sofascore-referee-events", "sofascore-referee-statistics", "sofascore-round-events", "sofascore-scheduled-events", "sofascore-scheduled-tournaments", "sofascore-search", "sofascore-search-typed", "sofascore-season-events", "sofascore-sports", "sofascore-stage", "sofascore-stage-categories", "sofascore-stage-driver-performance", "sofascore-stage-featured", "sofascore-stage-schedule", "sofascore-stage-seasons", "sofascore-stage-standings", "sofascore-stage-substages", "sofascore-standings", "sofascore-team", "sofascore-team-achievements", "sofascore-team-events", "sofascore-team-goal-distributions", "sofascore-team-near-events", "sofascore-team-of-the-week", "sofascore-team-of-the-week-periods", "sofascore-team-performance", "sofascore-team-player-statistics", "sofascore-team-player-statistics-seasons", "sofascore-team-players", "sofascore-team-rankings", "sofascore-team-season-statistics", "sofascore-team-statistics-seasons", "sofascore-team-top-players", "sofascore-team-tournaments", "sofascore-team-transfers", "sofascore-tennis-player-grand-slam-results", "sofascore-tournament-cuptree", "sofascore-tournament-info", "sofascore-tournament-player-of-the-season", "sofascore-tournament-player-statistics", "sofascore-tournament-rounds", "sofascore-tournament-seasons", "sofascore-tournament-statistics-info", "sofascore-tournament-team-of-the-season", "sofascore-tournament-teams", "sofascore-tournament-top-players", "sofascore-tournament-top-teams", "sofascore-tournament-venues", "sofascore-tournament-winners", "sofascore-tournaments-with-feature", "sofascore-trending-events", "sofascore-trending-players", "sofascore-venue", "sofascore-venue-events"] @@ -29,7 +29,7 @@ class NetworkError < Error; end class Client attr_reader :base_url - def initialize(api_key: ENV["CRAWLORA_API_KEY"], base_url: "https://api.crawlora.net/api/v1", timeout: 30, user_agent: "crawlora-sofascore-ruby/0.3.4", transport: nil) + def initialize(api_key: ENV["CRAWLORA_API_KEY"], base_url: "https://api.crawlora.net/api/v1", timeout: 30, user_agent: "crawlora-sofascore-ruby/0.3.5", transport: nil) @api_key = api_key @base_url = base_url.to_s.sub(%r{/+$}, "") @timeout = Float(timeout) @@ -45,15 +45,24 @@ def request(operation_id, params = {}, response_type: :auto) raise Errors::ClientError.new("unknown operation: #{operation_id}", operation_id: operation_id) unless operation raise Errors::ClientError.new("Crawlora API key is required", operation_id: operation_id) if @api_key.nil? || @api_key.to_s.empty? normalized = params.each_with_object({}) { |(key, value), out| out[key.to_s] = value } + payload = request_body(operation, normalized) url = build_url(operation, normalized) uri = URI.parse(url) - request = Net::HTTP::Get.new(uri) + request = operation["method"] == "POST" ? Net::HTTP::Post.new(uri) : Net::HTTP::Get.new(uri) + unless payload.nil? + request.body = payload + request["Content-Type"] = "application/json" + end request["x-api-key"] = @api_key request["User-Agent"] = @user_agent request["Accept"] = operation["produces"].include?("text/plain") ? "application/json, text/plain" : "application/json" begin if @transport - response = @transport.call(url, request.to_hash, @timeout) + response = if operation["method"] == "POST" + @transport.call(url, request.to_hash, @timeout, "POST", payload) + else + @transport.call(url, request.to_hash, @timeout) + end status = Integer(response.fetch(:status) { response.fetch("status") }) body = response.fetch(:body) { response.fetch("body", "") } headers = response.fetch(:headers) { response.fetch("headers", {}) } @@ -544,8 +553,21 @@ def self.operations private + # POST operations take their JSON body under the body parameter name or "body". + def request_body(operation, params) + name = operation["bodyParam"] + return nil if name.nil? + value = params.key?(name) ? params[name] : params["body"] + if value.nil? + raise Errors::ClientError.new("missing request body: #{name}", operation_id: operation["id"]) if operation["bodyRequired"] + return nil + end + value.is_a?(String) ? value : JSON.generate(value) + end + def build_url(operation, params) known = operation["params"].map { |param| param["name"] } + known << "body" if operation["bodyParam"] unknown = params.keys - known raise Errors::ClientError.new("unknown parameters: #{unknown.join(', ')}", operation_id: operation["id"]) unless unknown.empty? path = operation["path"].dup diff --git a/ruby/lib/crawlora/sofascore/operations.json b/ruby/lib/crawlora/sofascore/operations.json index 2cc3a31..a43c857 100644 --- a/ruby/lib/crawlora/sofascore/operations.json +++ b/ruby/lib/crawlora/sofascore/operations.json @@ -263,6 +263,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key", @@ -319,6 +321,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore category id from the categories endpoint", @@ -359,6 +363,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "League whose draft to return", @@ -417,6 +423,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "League whose draft to return", @@ -481,6 +489,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore esports game id from sofascore-event-esports-games", @@ -525,6 +535,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -561,6 +573,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore baseball event (match) id", @@ -599,6 +613,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore baseball event (match) id", @@ -629,6 +645,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -659,6 +677,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore baseball event (match) id", @@ -689,6 +709,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -719,6 +741,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -749,6 +773,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore esports event (match) id", @@ -779,6 +805,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -809,6 +837,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -839,6 +869,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -869,6 +901,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -899,6 +933,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore cricket event (match) id", @@ -929,6 +965,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -959,6 +997,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -989,6 +1029,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1025,6 +1067,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1069,6 +1113,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1107,6 +1153,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1137,6 +1185,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1167,6 +1217,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1197,6 +1249,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1233,6 +1287,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1271,6 +1327,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1301,6 +1359,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore tennis event (match) id", @@ -1336,6 +1396,8 @@ "type": "string" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1373,6 +1435,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore event (match) id", @@ -1429,6 +1493,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key", @@ -1485,6 +1551,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore manager id", @@ -1520,6 +1588,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore manager id", @@ -1575,6 +1645,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore MMA organisation id", @@ -1633,6 +1705,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore MMA organisation id", @@ -1697,6 +1771,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key, or all for every sport. Defaults to all", @@ -1779,6 +1855,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key, or all for every sport. Defaults to all", @@ -1835,6 +1913,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -1865,6 +1945,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -1900,6 +1982,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -1938,6 +2022,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -1968,6 +2054,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -1998,6 +2086,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2052,6 +2142,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2124,6 +2216,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2194,6 +2288,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2268,6 +2364,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2316,6 +2414,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2346,6 +2446,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2376,6 +2478,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore player id", @@ -2399,6 +2503,8 @@ "path": "/sofascore/ranking-types", "pathParams": [], "queryParams": [], + "bodyParam": null, + "bodyRequired": false, "params": [], "produces": [ "application/json" @@ -2459,6 +2565,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Ranking id from sofascore-ranking-types", @@ -2532,6 +2640,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore referee id", @@ -2567,6 +2677,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore referee id", @@ -2605,6 +2717,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore referee id", @@ -2657,6 +2771,8 @@ "type": "string" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -2723,6 +2839,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore category id from the categories endpoint", @@ -2798,6 +2916,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key", @@ -2871,6 +2991,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Free-text search query", @@ -2952,6 +3074,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Entity type to search", @@ -3061,6 +3185,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -3112,6 +3238,8 @@ "path": "/sofascore/sports", "pathParams": [], "queryParams": [], + "bodyParam": null, + "bodyRequired": false, "params": [], "produces": [ "application/json" @@ -3133,6 +3261,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore stage id from stage-schedule, stage-seasons or stage-substages", @@ -3167,6 +3297,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Stage sport key", @@ -3201,6 +3333,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore stage id of a finished race, sprint or rally", @@ -3235,6 +3369,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Stage sport key", @@ -3279,6 +3415,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Stage sport key", @@ -3321,6 +3459,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore competition id from stage-categories", @@ -3361,6 +3501,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore stage id of a season, event, session or cycling stage", @@ -3403,6 +3545,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore stage id of a season or an event", @@ -3450,6 +3594,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -3501,6 +3647,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3531,6 +3679,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3576,6 +3726,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3637,6 +3789,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3683,6 +3837,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3725,6 +3881,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -3777,6 +3935,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -3815,6 +3975,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3869,6 +4031,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3929,6 +4093,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3959,6 +4125,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -3989,6 +4157,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id (a tennis player id for tennis)", @@ -4043,6 +4213,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -4103,6 +4275,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -4160,6 +4334,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -4232,6 +4408,8 @@ "type": "boolean" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -4269,6 +4447,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id", @@ -4299,6 +4479,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore team id of a tennis player", @@ -4335,6 +4517,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id of a cup or playoff competition", @@ -4378,6 +4562,8 @@ "type": "string" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4421,6 +4607,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4569,6 +4757,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id of a football competition", @@ -4755,6 +4945,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4793,6 +4985,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4829,6 +5023,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id of a football competition", @@ -4873,6 +5069,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4917,6 +5115,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -4976,6 +5176,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -5056,6 +5258,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -5121,6 +5325,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -5164,6 +5370,8 @@ "type": "integer" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -5238,6 +5446,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Competition feature", @@ -5306,6 +5516,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Two-letter ISO 3166-1 alpha-2 country code", @@ -5340,6 +5552,8 @@ ] } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Sport key", @@ -5374,6 +5588,8 @@ "required": true } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore venue id", @@ -5461,6 +5677,8 @@ "type": "string" } ], + "bodyParam": null, + "bodyRequired": false, "params": [ { "description": "Numeric SofaScore venue id", diff --git a/ruby/lib/crawlora/sofascore/version.rb b/ruby/lib/crawlora/sofascore/version.rb index 848114d..62ba4fb 100644 --- a/ruby/lib/crawlora/sofascore/version.rb +++ b/ruby/lib/crawlora/sofascore/version.rb @@ -1,5 +1,5 @@ module Crawlora module Sofascore - VERSION = "0.3.4" + VERSION = "0.3.5" end end diff --git a/scripts/_platformsdk/documentation.py b/scripts/_platformsdk/documentation.py index e78fe17..d506adf 100644 --- a/scripts/_platformsdk/documentation.py +++ b/scripts/_platformsdk/documentation.py @@ -115,6 +115,90 @@ def _operation_catalog(operations: list[dict[str, Any]]) -> str: return "\n".join(rows) +def public_api_summary(config: dict[str, Any]) -> str: + """Return the curated endpoint-area phrase used by package landing pages.""" + description = str(config.get("java_description") or "") + marker = " API, with " + if marker in description: + summary = description.split(marker, 1)[1] + summary = summary.split(". Requires a Crawlora API key.", 1)[0] + # Older descriptions read "with [direct] methods for "; keep only + # the areas so sentences built around the summary stay grammatical. + summary = re.sub(r"^(?:direct )?methods for ", "", summary.strip()) + if summary.strip(): + return summary.strip().rstrip(".") + display = str(config.get("display_name") or config.get("platform") or "platform") + return f"the supported {display} API endpoints" + + +def seo_keywords(config: dict[str, Any]) -> list[str]: + """Build registry search keywords from the platform name and curated coverage. + + Registry search matches keywords literally, so every coverage area is + qualified with the platform ("tiktok-comments", not "comments") and the + platform also gets the "-api", "-scraper" and "-data" forms people type. + """ + platform = str(config.get("platform") or "platform").lower() + display = str(config.get("display_name") or platform).lower() + display_keyword = re.sub(r"[^a-z0-9]+", "-", display).strip("-") + names = [platform] + if display_keyword and display_keyword != platform: + names.append(display_keyword) + + keywords = ["crawlora", "api-client", "sdk", "web-scraping", "scraping-api", *names] + for suffix in ("api", "scraper", "data"): + keywords.extend(f"{name}-{suffix}" for name in names) + + ignored = { + "and", "for", "from", "the", "with", "of", "to", "by", "a", "an", "api", "direct", "methods", "method", + } + summary = public_api_summary(config) + for area in re.split(r"[,;]|\bplus\b", summary.lower()): + words = [word for word in re.findall(r"[a-z0-9]+", area) if word not in ignored] + if not words or len(words) > 3: + continue + if platform not in words: + words.insert(0, platform) + keyword = "-".join(words) + if keyword not in keywords: + keywords.append(keyword) + return list(dict.fromkeys(keywords))[:20] + + +def _endpoint_table(operations: list[dict[str, Any]]) -> str: + rows = ["| Method | Endpoint | API operation | Description |", "| --- | --- | --- | --- |"] + for operation in sorted(operations, key=lambda op: (str(op["path"]).casefold(), str(op["verb"]))): + summary = str(operation.get("summary") or operation.get("id") or "").split("\n", 1)[0] + summary = summary.replace("|", "\\|").replace("`", "\\`").replace("\r", " ") + rows.append( + f"| `{operation['verb']}` | `{operation['path']}` | `{operation['id']}` | {summary} |" + ) + return "\n".join(rows) + + +def endpoint_table_from_spec(spec: dict[str, Any], platform: str) -> str: + """Render the complete, parameter-free endpoint list for package READMEs.""" + operations: list[dict[str, str]] = [] + for path, path_item in (spec.get("paths") or {}).items(): + if not isinstance(path_item, dict): + continue + for verb, operation in path_item.items(): + if verb.lower() not in _METHODS or not isinstance(operation, dict): + continue + operation_id = str(operation.get("operationId") or "") + tags = [str(tag).strip().lower() for tag in operation.get("tags", [])] + belongs = platform.lower() in tags or operation_id.lower().startswith(platform.lower() + "-") + if not operation_id or not belongs: + continue + operations.append({ + "verb": verb.upper(), + "path": str(path), + "id": operation_id, + "summary": str(operation.get("summary") or operation.get("description") or operation_id), + }) + return _endpoint_table(operations) + + def _example_values(platform: str, operations: list[dict[str, Any]]) -> list[tuple[dict[str, Any], dict[str, Any]]]: """Choose useful calls using only methods and parameter names in this spec.""" by_id = {op["id"].lower(): op for op in operations} @@ -156,6 +240,34 @@ def add(operation_id: str, values: dict[str, Any]) -> None: elif platform == "imdb": add("imdb-search", {"query": "Inception"}) add("imdb-charts", {}) + elif platform == "google": + add("google-news", {"q": "artificial intelligence"}) + add("google-map-search", {"mapSearchOption": {"keyword": "coffee shops in Seattle", "country": "us", "language": "en"}}) + add("google-trends-trending", {"geo": "US"}) + elif platform == "bing": + add("bing-search", {"q": "open source web crawler"}) + add("bing-news", {"q": "technology"}) + elif platform == "brave": + add("brave-search", {"q": "open source web crawler"}) + add("brave-suggest", {"q": "open source"}) + elif platform == "duckduckgo": + add("duckduckgo-search", {"q": "open source web crawler"}) + add("duckduckgo-news", {"q": "technology"}) + elif platform == "ebay": + add("ebay-seller", {"seller": "musicmagpie"}) + add("ebay-search", {"option": {"keyword": "vintage camera"}}) + elif platform == "googleplay": + add("googleplay-search", {"term": "podcast player"}) + add("googleplay-app", {"app_id": "com.spotify.music"}) + elif platform == "appstore": + add("appstore-search", {"term": "podcast player"}) + add("appstore-app", {"id": "324684580"}) + elif platform == "airbnb": + add("airbnb-search", {"location": "Lisbon, Portugal"}) + add("airbnb-room", {"id": "7743405"}) + elif platform == "spotify": + add("spotify-search", {"q": "daft punk"}) + add("spotify-track", {"id": "4cOdK2wGLETKBW3PvgPWqT"}) return selected @@ -344,6 +456,15 @@ def _values(config: dict[str, Any], operations: list[dict[str, Any]]) -> dict[st "tiktok": "17 4 * * *", "amazon": "27 4 * * *", "imdb": "37 4 * * *", + "google": "47 4 * * *", + "bing": "57 4 * * *", + "brave": "07 5 * * *", + "duckduckgo": "17 5 * * *", + "ebay": "27 5 * * *", + "googleplay": "37 5 * * *", + "appstore": "47 5 * * *", + "airbnb": "57 5 * * *", + "spotify": "07 6 * * *", } try: sync_cron = sync_schedules[platform] @@ -371,6 +492,9 @@ def _values(config: dict[str, Any], operations: list[dict[str, Any]]) -> dict[st "VERSION": version, "CONTRACT_REVISION": str(config.get("contract_revision") or version), "OPERATION_COUNT": str(len(operations)), + "SEO_SUMMARY": public_api_summary(config), + "SEO_KEYWORDS_JSON": json.dumps(seo_keywords(config), ensure_ascii=False), + "ENDPOINT_TABLE": _endpoint_table(operations), "OPERATION_CATALOG": catalog, "JS_EXAMPLE": js_example.rstrip(), "PYTHON_EXAMPLE": py_example.rstrip(), diff --git a/scripts/_platformsdk/golang.py b/scripts/_platformsdk/golang.py index fa275a3..0e1ff91 100644 --- a/scripts/_platformsdk/golang.py +++ b/scripts/_platformsdk/golang.py @@ -111,9 +111,22 @@ def _operation_literal(operation: dict[str, Any]) -> str: f"Produces: {_go_string_slice([str(value) for value in operation.get('produces', [])])}", f"Security: {_go_string_slice([str(value) for value in operation.get('security', [])])}", ] + if operation.get("bodyParam"): + literals.append(f"BodyParam: {_go_string(str(operation['bodyParam']))}") + if operation.get("bodyRequired"): + literals.append("BodyRequired: true") return "operationDefinition{" + ", ".join(literals) + "}" +def _check_supported(operation_id: str, definition: dict[str, Any]) -> None: + """Platform clients send GET requests and POST requests with a JSON body.""" + method = definition["method"] + if method == "GET": + return + if method != "POST" or not definition.get("bodyParam") or definition.get("formParams"): + raise ValueError(f"Go platform clients support GET and JSON-body POST only: {operation_id}") + + def _module_name(config: dict[str, Any]) -> str: platform = str(config["platform"]) if not re.fullmatch(r"[a-z0-9]+(?:-[a-z0-9]+)*", platform): @@ -136,6 +149,15 @@ def emit(root: Path, config: dict, spec: dict, assets: Path) -> None: raise ValueError(f"invalid Go package name for platform: {package_name!r}") module_path = _module_name(config) version = str(config.get("golang_version", config.get("version", "0.1.4"))) + # Generated tests and README samples exercise GET operations. + get_meta = { + operation_id: meta for operation_id, meta in model.meta.items() + if model.operations[operation_id]["method"] == "GET" + } + if not get_meta: + raise ValueError("the sliced specification contains no GET operations") + from .documentation import public_api_summary + values = { "platform": platform, "package_name": package_name, @@ -145,19 +167,19 @@ def emit(root: Path, config: dict, spec: dict, assets: Path) -> None: "repository": str(config.get("repository", f"https://github.com/Crawlora-org/crawlora-{platform}")), "docs_url": crawlora_url(source="pkg.go.dev", platform=platform, surface="go", destination="api-docs", path="/docs"), "operation_count": str(model.operation_count), + "seo_summary": public_api_summary(config), "user_agent": f"crawlora-{platform}-go/{version}", "version_json": _go_string(version), "user_agent_json": _go_string(f"crawlora-{platform}-go/{version}"), - "sample_operation": next(iter(model.meta)), - "sample_params": _sample_params(model.meta[next(iter(model.meta))]["params"]), + "sample_operation": next(iter(get_meta)), + "sample_params": _sample_params(get_meta[next(iter(get_meta))]["params"]), } operations = [] methods = [] reserved = {"Call", "Close", "OperationIDs", "OperationCount", "NewClient"} for operation_id, definition in model.operations.items(): - if definition["method"] != "GET": - raise ValueError(f"Go platform clients currently support GET only: {operation_id}") + _check_supported(operation_id, definition) operations.append(f"\t{_go_string(operation_id)}: {_operation_literal(definition)},") method = next((name for group in model.groups.values() for name, op_id in group.items() if op_id == operation_id), None) if method and method not in reserved: @@ -172,19 +194,19 @@ def emit(root: Path, config: dict, spec: dict, assets: Path) -> None: values["operation_entries"] = "\n".join(operations) values["method_declarations"] = "\n\n".join(methods) test_operation_id = next( - (operation_id for operation_id in model.meta if operation_id.endswith("-search")), - next(iter(model.meta)), + (operation_id for operation_id in get_meta if operation_id.endswith("-search")), + next(iter(get_meta)), ) - if not any(param.get("in") == "path" for param in model.meta[test_operation_id]["params"]) or not any( - param.get("in") == "query" for param in model.meta[test_operation_id]["params"] + if not any(param.get("in") == "path" for param in get_meta[test_operation_id]["params"]) or not any( + param.get("in") == "query" for param in get_meta[test_operation_id]["params"] ): test_operation_id = next( - (operation_id for operation_id, meta in model.meta.items() + (operation_id for operation_id, meta in get_meta.items() if any(param.get("in") == "path" for param in meta["params"]) and any(param.get("in") == "query" for param in meta["params"])), test_operation_id, ) - test_meta = model.meta[test_operation_id] + test_meta = get_meta[test_operation_id] test_params = [] invalid_enum_params = [] path_values = {} diff --git a/scripts/_platformsdk/java.py b/scripts/_platformsdk/java.py index a6f39d4..5795631 100644 --- a/scripts/_platformsdk/java.py +++ b/scripts/_platformsdk/java.py @@ -18,6 +18,15 @@ "tiktok": ("tiktok-search", {"keyword": "science"}), "amazon": ("amazon-search", {"k": "wireless headphones"}), "imdb": ("imdb-search", {"query": "Inception"}), + "google": ("google-news", {"q": "artificial intelligence"}), + "bing": ("bing-search", {"q": "open source web crawler"}), + "brave": ("brave-search", {"q": "open source web crawler"}), + "duckduckgo": ("duckduckgo-search", {"q": "open source web crawler"}), + "ebay": ("ebay-seller", {"seller": "musicmagpie"}), + "googleplay": ("googleplay-search", {"term": "podcast player"}), + "appstore": ("appstore-search", {"term": "podcast player"}), + "airbnb": ("airbnb-search", {"location": "Lisbon, Portugal"}), + "spotify": ("spotify-search", {"q": "daft punk"}), } @@ -90,7 +99,9 @@ def _operation_source(operation_id: str, operation: dict[str, Any], source_param return ( f" operations.put({_quote(operation_id)}, new Operation({_quote(operation_id)}, " f"{_quote(operation['method'].upper())}, {_quote(operation['path'])}, " - f"{param_map}, List.of({produces})));" + f"{param_map}, List.of({produces})" + + (f", {_quote(str(operation['bodyParam']))}" if operation.get("bodyParam") else "") + + "));" ) @@ -114,18 +125,25 @@ def emit(root: Path, config: dict, spec: dict, assets: Path) -> None: if not model.meta: raise ValueError("the sliced specification contains no operations") for op_id, operation in model.operations.items(): - if operation["method"] != "GET": - raise ValueError(f"platform Java client supports GET only: {op_id}") + if operation["method"] != "GET" and ( + operation["method"] != "POST" or not operation.get("bodyParam") or operation.get("formParams") + ): + raise ValueError(f"platform Java client supports GET and JSON-body POST only: {op_id}") + + from .documentation import endpoint_table_from_spec, public_api_summary platform = config["platform"] + base_description = config.get("java_description") or ( + f"Java client for Crawlora's hosted {config['display_name']} API, with direct methods for supported operations. " + "Requires a Crawlora API key." + ) package_name = f"net.crawlora.{platform}" values = { "platform": platform, "display_name": config["display_name"], - "java_description": config.get("java_description") or ( - f"Java client for Crawlora's hosted {config['display_name']} API, with direct methods for supported operations. " - "Requires a Crawlora API key." - ), + "java_description": base_description, + "seo_summary": public_api_summary(config), + "endpoint_table": endpoint_table_from_spec(spec, platform), "package_name": package_name, "version": config["version"], "repository": config["repository"], @@ -205,7 +223,7 @@ def emit(root: Path, config: dict, spec: dict, assets: Path) -> None: values["usage_params"] = usage_params text_operation = next( (op_id for op_id, operation in model.operations.items() if "text/plain" in operation.get("produces", [])), - next(iter(model.operations)), + next(op_id for op_id, operation in model.operations.items() if operation["method"] == "GET"), ) values["text_operation_id"] = _quote(text_operation) values["text_params"] = _sample_param_map(model.meta[text_operation]["params"]) @@ -288,6 +306,8 @@ def _test_operation(model: Any) -> tuple[str, str, str]: candidates = [] aliases = {operation_id: method for group in model.groups.values() for method, operation_id in group.items()} for operation_id, meta in model.meta.items(): + if model.operations[operation_id]["method"] != "GET": + continue params = meta["params"] has_query = any(p.get("in") == "query" and p.get("name", "").lower() != "x-api-key" for p in params) has_string_query = any( @@ -301,6 +321,8 @@ def _test_operation(model: Any) -> tuple[str, str, str]: def _enum_assertion(model: Any) -> str: for operation_id, meta in model.meta.items(): + if model.operations[operation_id]["method"] != "GET": + continue params = meta["params"] enum = next((p for p in params if p.get("in") in {"path", "query"} and p.get("enum") and p.get("name", "").lower() != "x-api-key"), None) diff --git a/scripts/_platformsdk/javascript.py b/scripts/_platformsdk/javascript.py index 2c9a655..aa66110 100644 --- a/scripts/_platformsdk/javascript.py +++ b/scripts/_platformsdk/javascript.py @@ -95,6 +95,8 @@ def emit(root: Path, config: dict, spec: dict, assets: Path) -> None: for directory in (src_dir, test_dir, docs_dir): directory.mkdir(parents=True, exist_ok=True) + from .documentation import public_api_summary, seo_keywords + platform = config["platform"] values = { "platform": platform, @@ -102,6 +104,9 @@ def emit(root: Path, config: dict, spec: dict, assets: Path) -> None: "class_name": config["class_name"], "npm_name": config["npm_name"], "version": config["version"], + "operation_count": str(model.operation_count), + "seo_summary": public_api_summary(config), + "seo_keywords_json": json.dumps(seo_keywords(config), ensure_ascii=False), "user_agent": f"crawlora-{platform}-js/{config['version']}", "repository": config["repository"], "homepage": crawlora_url(source="npm", platform=platform, surface="javascript", destination="homepage"), diff --git a/scripts/_platformsdk/php.py b/scripts/_platformsdk/php.py index 2595363..ed64e00 100644 --- a/scripts/_platformsdk/php.py +++ b/scripts/_platformsdk/php.py @@ -52,6 +52,8 @@ def emit(root: Path, config: dict[str, Any], spec: dict[str, Any], assets: Path) package = Path(root) / "php" src = package / "src" / "Crawlora" / class_name src.mkdir(parents=True, exist_ok=True) + from .documentation import endpoint_table_from_spec, public_api_summary, seo_keywords + templates = Path(__file__).resolve().parent / "templates" / "php" values = { "PLATFORM": platform, @@ -67,6 +69,9 @@ def emit(root: Path, config: dict[str, Any], spec: dict[str, Any], assets: Path) "OPERATION_JSON": json.dumps(operations, ensure_ascii=False, sort_keys=True), "OPERATION_IDS_JSON": json.dumps(sorted(operations)), "OPERATION_COUNT": str(len(operations)), + "SEO_SUMMARY": public_api_summary(config), + "SEO_KEYWORDS_JSON": json.dumps(seo_keywords(config), ensure_ascii=False), + "ENDPOINT_TABLE": endpoint_table_from_spec(spec, platform), "OPERATION_IDS_PHP": "[" + ", ".join(json.dumps(item) for item in sorted(operations)) + "]", "DIRECT_METHODS": "\n".join( " public function " + method + "(mixed ...$params): mixed\n {\n" diff --git a/scripts/_platformsdk/python.py b/scripts/_platformsdk/python.py index 711dbe9..19c632b 100644 --- a/scripts/_platformsdk/python.py +++ b/scripts/_platformsdk/python.py @@ -2,6 +2,7 @@ from __future__ import annotations +import json import pprint import shutil import sys @@ -396,9 +397,14 @@ def emit(root: Path, config: dict[str, Any], spec: dict[str, Any], assets: Path) ) (package / "py.typed").write_text("", encoding="utf-8") + from .documentation import public_api_summary, seo_keywords + pyproject = (template_root / "pyproject.toml.tpl").read_text(encoding="utf-8") template_values = { **config, + "SEO_SUMMARY": public_api_summary(config), + "SEO_KEYWORDS_JSON": json.dumps(seo_keywords(config), ensure_ascii=False), + "OPERATION_COUNT": str(model.operation_count), "homepage_url": crawlora_url(source="pypi", platform=config["platform"], surface="python", destination="homepage"), "documentation_url": crawlora_url(source="pypi", platform=config["platform"], surface="python", destination="api-docs", path="/docs"), } diff --git a/scripts/_platformsdk/release_sync.py b/scripts/_platformsdk/release_sync.py index 7402df2..6f622cc 100644 --- a/scripts/_platformsdk/release_sync.py +++ b/scripts/_platformsdk/release_sync.py @@ -122,6 +122,96 @@ "maven_artifact": "crawlora-imdb", "packagist": "crawlora/imdb", }, + "google": { + "repository": "Crawlora-org/crawlora-google", + "npm": "@crawlora-org/google", + "pypi": "crawlora-google", + "go": "github.com/Crawlora-org/crawlora-google", + "ruby": "crawlora-google", + "maven_group": "net.crawlora", + "maven_artifact": "crawlora-google", + "packagist": "crawlora/google", + }, + "bing": { + "repository": "Crawlora-org/crawlora-bing", + "npm": "@crawlora-org/bing", + "pypi": "crawlora-bing", + "go": "github.com/Crawlora-org/crawlora-bing", + "ruby": "crawlora-bing", + "maven_group": "net.crawlora", + "maven_artifact": "crawlora-bing", + "packagist": "crawlora/bing", + }, + "brave": { + "repository": "Crawlora-org/crawlora-brave", + "npm": "@crawlora-org/brave", + "pypi": "crawlora-brave", + "go": "github.com/Crawlora-org/crawlora-brave", + "ruby": "crawlora-brave", + "maven_group": "net.crawlora", + "maven_artifact": "crawlora-brave", + "packagist": "crawlora/brave", + }, + "duckduckgo": { + "repository": "Crawlora-org/crawlora-duckduckgo", + "npm": "@crawlora-org/duckduckgo", + "pypi": "crawlora-duckduckgo", + "go": "github.com/Crawlora-org/crawlora-duckduckgo", + "ruby": "crawlora-duckduckgo", + "maven_group": "net.crawlora", + "maven_artifact": "crawlora-duckduckgo", + "packagist": "crawlora/duckduckgo", + }, + "ebay": { + "repository": "Crawlora-org/crawlora-ebay", + "npm": "@crawlora-org/ebay", + "pypi": "crawlora-ebay", + "go": "github.com/Crawlora-org/crawlora-ebay", + "ruby": "crawlora-ebay", + "maven_group": "net.crawlora", + "maven_artifact": "crawlora-ebay", + "packagist": "crawlora/ebay", + }, + "googleplay": { + "repository": "Crawlora-org/crawlora-googleplay", + "npm": "@crawlora-org/googleplay", + "pypi": "crawlora-googleplay", + "go": "github.com/Crawlora-org/crawlora-googleplay", + "ruby": "crawlora-googleplay", + "maven_group": "net.crawlora", + "maven_artifact": "crawlora-googleplay", + "packagist": "crawlora/googleplay", + }, + "appstore": { + "repository": "Crawlora-org/crawlora-appstore", + "npm": "@crawlora-org/appstore", + "pypi": "crawlora-appstore", + "go": "github.com/Crawlora-org/crawlora-appstore", + "ruby": "crawlora-appstore", + "maven_group": "net.crawlora", + "maven_artifact": "crawlora-appstore", + "packagist": "crawlora/appstore", + }, + "airbnb": { + "repository": "Crawlora-org/crawlora-airbnb", + "npm": "@crawlora-org/airbnb", + "pypi": "crawlora-airbnb", + "go": "github.com/Crawlora-org/crawlora-airbnb", + "ruby": "crawlora-airbnb", + "maven_group": "net.crawlora", + "maven_artifact": "crawlora-airbnb", + "packagist": "crawlora/airbnb", + }, + "spotify": { + "repository": "Crawlora-org/crawlora-spotify", + "npm": "@crawlora-org/spotify", + "pypi": "crawlora-spotify", + "go": "github.com/Crawlora-org/crawlora-spotify", + "ruby": "crawlora-spotify", + "maven_group": "net.crawlora", + "maven_artifact": "crawlora-spotify", + "packagist": "crawlora/spotify", + }, } _VERSION = re.compile( r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)" diff --git a/scripts/_platformsdk/ruby.py b/scripts/_platformsdk/ruby.py index 97ec408..c2c50e0 100644 --- a/scripts/_platformsdk/ruby.py +++ b/scripts/_platformsdk/ruby.py @@ -22,8 +22,16 @@ def _replace(template: str, values: dict[str, str]) -> str: def _example_call(platform: str, model: Any) -> tuple[str, dict[str, Any]]: """Choose a contract-backed searchable operation and representative params.""" - operation_ids = list(model.meta) - operation_id = next((item for item in operation_ids if item.endswith("-search")), operation_ids[0]) + # README and generated-test calls use GET operations. + operation_ids = [item for item in model.meta if model.operations[item]["method"] == "GET"] + if not operation_ids: + raise ValueError("focused client needs at least one GET operation") + # Prefer the platform's own search over a sub-family search that lives under + # another path prefix (spotify-podcasts-search), which the generated tests reject. + operation_id = next( + (item for item in operation_ids if item == platform + "-search"), + next((item for item in operation_ids if item.endswith("-search")), operation_ids[0]), + ) preferred = { "sofascore": "Liverpool", "flashscore": "football", @@ -73,8 +81,10 @@ def _operations(spec: dict[str, Any], model: Any) -> tuple[dict[str, Any], list[ if len(names) != len(set(names)): raise ValueError("platform operation aliases must be unique") for operation_id, parsed in model.operations.items(): - if parsed["method"] != "GET": - raise ValueError(f"focused client supports GET operations only: {operation_id}") + if parsed["method"] != "GET" and ( + parsed["method"] != "POST" or not parsed.get("bodyParam") or parsed.get("formParams") + ): + raise ValueError(f"focused client supports GET and JSON-body POST only: {operation_id}") raw = source[operation_id] params = model.meta[operation_id]["params"] operations[operation_id] = { @@ -83,6 +93,8 @@ def _operations(spec: dict[str, Any], model: Any) -> tuple[dict[str, Any], list[ "path": parsed["path"], "pathParams": parsed.get("pathParams", []), "queryParams": parsed.get("queryParams", []), + "bodyParam": parsed.get("bodyParam") or None, + "bodyRequired": bool(parsed.get("bodyRequired")), "params": params, "produces": raw.get("produces", []), "security": parsed.get("security", []), @@ -120,6 +132,8 @@ def emit(root: Path, config: dict[str, Any], spec: dict[str, Any], assets: Path) package = Path(root) / "ruby" lib = package / "lib" / "crawlora" / platform lib.mkdir(parents=True, exist_ok=True) + from .documentation import endpoint_table_from_spec, public_api_summary + template_root = Path(__file__).resolve().parent / "templates" / "ruby" values = { "PLATFORM": platform, @@ -134,6 +148,8 @@ def emit(root: Path, config: dict[str, Any], spec: dict[str, Any], assets: Path) "OPERATION_JSON": json.dumps(operations, ensure_ascii=False, sort_keys=True), "OPERATION_IDS_JSON": json.dumps(sorted(operations)), "OPERATION_COUNT": str(len(operations)), + "SEO_SUMMARY": public_api_summary(config), + "ENDPOINT_TABLE": endpoint_table_from_spec(spec, platform), "DEPENDENCIES": dependency_lines, "DIRECT_METHODS": "\n".join( f" define_method({method!r}) do |**params|\n" diff --git a/scripts/_platformsdk/spec.py b/scripts/_platformsdk/spec.py index 3f51f95..f77984c 100644 --- a/scripts/_platformsdk/spec.py +++ b/scripts/_platformsdk/spec.py @@ -16,15 +16,38 @@ "tiktok": ("TikTok", "TikTokClient"), "amazon": ("Amazon", "AmazonClient"), "imdb": ("IMDb", "IMDbClient"), + "google": ("Google", "GoogleClient"), + "bing": ("Bing", "BingClient"), + "brave": ("Brave Search", "BraveClient"), + "duckduckgo": ("DuckDuckGo", "DuckDuckGoClient"), + "ebay": ("eBay", "EbayClient"), + "googleplay": ("Google Play", "GooglePlayClient"), + "appstore": ("App Store", "AppStoreClient"), + "airbnb": ("Airbnb", "AirbnbClient"), + "spotify": ("Spotify", "SpotifyClient"), } # TikTok's public API uses product-area tags for several operation groups. Keep # those in the TikTok package while excluding neighboring products that share # an operation-ID prefix (for example Amazon Jobs). PLATFORM_TAG_ALIASES = { "tiktok": frozenset({"tiktok", "tiktok creative center", "tiktok popular trend", "tiktok top ads"}), + "duckduckgo": frozenset({"duckduckgo", "duckduckgo search"}), + "spotify": frozenset({"spotify", "spotifypodcasts"}), } PLATFORM_EXCLUDED_TAGS = { "amazon": frozenset({"amazon jobs"}), + "google": frozenset({"google jobs"}), +} +# Spotify Podcasts is served from a sibling path family and belongs in the +# Spotify package. Other platforms own exactly "//". +PLATFORM_PATH_PREFIXES = { + "spotify": ("/spotify/", "/spotify-podcasts/"), +} +# Operations kept out of a package even if the public contract lists them +# again later. Google web search has no dependable upstream path, so the +# Google package must never pick it up through the daily contract sync. +PLATFORM_EXCLUDED_OPERATIONS = { + "google": frozenset({"google-search"}), } JAVA_DESCRIPTIONS = { "sofascore": ( @@ -63,6 +86,42 @@ "Java client for Crawlora's hosted IMDb API, with title and name search, charts, ratings, credits, awards, " "episodes, reviews, images, and title metadata. Requires a Crawlora API key." ), + "google": ( + "Java client for Crawlora's hosted Google API, with Maps search, places, reviews and photos; News; Trends; " + "Finance quotes and markets; suggestions; videos; and jobs. Requires a Crawlora API key." + ), + "bing": ( + "Java client for Crawlora's hosted Bing API, with web, news, image, and video search plus query suggestions. " + "Requires a Crawlora API key." + ), + "brave": ( + "Java client for Crawlora's hosted Brave Search API, with web, news, image, and video search plus query " + "suggestions. Requires a Crawlora API key." + ), + "duckduckgo": ( + "Java client for Crawlora's hosted DuckDuckGo API, with web, news, image, video, and shopping search plus " + "query suggestions. Requires a Crawlora API key." + ), + "ebay": ( + "Java client for Crawlora's hosted eBay API, with listing search, item details, seller profiles, feedback and " + "shops, and eBay Live streams. Requires a Crawlora API key." + ), + "googleplay": ( + "Java client for Crawlora's hosted Google Play API, with app search, details, reviews, ratings, permissions, " + "data safety, charts, similar apps, and developers. Requires a Crawlora API key." + ), + "appstore": ( + "Java client for Crawlora's hosted App Store API, with app search, details, reviews, ratings, privacy labels, " + "version history, charts, editorial collections, and developers. Requires a Crawlora API key." + ), + "airbnb": ( + "Java client for Crawlora's hosted Airbnb API, with listing search, room details, calendars and reviews, and " + "host profiles, listings and reviews. Requires a Crawlora API key." + ), + "spotify": ( + "Java client for Crawlora's hosted Spotify API, with search, tracks, albums, artists, playlists, profiles, " + "audiobooks, charts, and podcast shows and episodes. Requires a Crawlora API key." + ), } HTTP_METHODS = frozenset({"get", "put", "post", "delete", "options", "head", "patch"}) @@ -138,7 +197,10 @@ def select(spec: dict, platform: str) -> dict: allowed_tags = PLATFORM_TAG_ALIASES.get(platform, frozenset({platform})) if tags.intersection(PLATFORM_EXCLUDED_TAGS.get(platform, frozenset())): continue - path_matches = path.startswith("/" + platform + "/") + if identifier in PLATFORM_EXCLUDED_OPERATIONS.get(platform, frozenset()): + continue + prefixes = PLATFORM_PATH_PREFIXES.get(platform, ("/" + platform + "/",)) + path_matches = path.startswith(prefixes) tag_matches = bool(tags.intersection(allowed_tags)) if not isinstance(identifier, str) or not identifier.startswith(platform + "-"): if path_matches or tag_matches: @@ -146,7 +208,7 @@ def select(spec: dict, platform: str) -> dict: f"unexpected operation ID for {platform} operation at {path}: {identifier!r}" ) continue - if not path.startswith("/" + platform + "/"): + if not path_matches: raise ValueError(f"unexpected path for {identifier}: {path}") if tags and tags.isdisjoint(allowed_tags): raise ValueError(f"unexpected tag for {identifier}: {sorted(tags)}") diff --git a/scripts/_platformsdk/templates/documentation/README.md.tmpl b/scripts/_platformsdk/templates/documentation/README.md.tmpl index 6d2e4c4..852a531 100644 --- a/scripts/_platformsdk/templates/documentation/README.md.tmpl +++ b/scripts/_platformsdk/templates/documentation/README.md.tmpl @@ -1,6 +1,6 @@ # {{DISPLAY_NAME}} clients for Crawlora -Official Crawlora client packages for the hosted {{DISPLAY_NAME}} API. These clients call Crawlora's hosted API; they do not scrape {{DISPLAY_NAME}} locally. Requests use your Crawlora account and `CRAWLORA_API_KEY`; service usage follows your account billing plan. Crawlora is independent from and not affiliated with or endorsed by {{DISPLAY_NAME}} or its owners. +Official Crawlora client packages for the hosted {{DISPLAY_NAME}} API. Access {{OPERATION_COUNT}} API endpoints covering {{SEO_SUMMARY}} from JavaScript/TypeScript, Python, Go, Ruby, Java, and PHP. These clients call Crawlora's hosted API; they do not scrape {{DISPLAY_NAME}} locally. Requests use your Crawlora account and `CRAWLORA_API_KEY`; service usage follows your account billing plan. Crawlora is independent from and not affiliated with or endorsed by {{DISPLAY_NAME}} or its owners. ## Language packages @@ -15,9 +15,11 @@ For installation and runnable examples, use the README for your language. See th Create an account at [crawlora.net](https://crawlora.net/signup?utm_source=github&utm_medium=referral&utm_campaign=platform-clients&utm_content={{PLATFORM}}-repository-signup), open the [Crawlora console](https://crawlora.net/app?utm_source=github&utm_medium=referral&utm_campaign=platform-clients&utm_content={{PLATFORM}}-repository-console) to get an API key, or read the [API documentation](https://crawlora.net/docs?utm_source=github&utm_medium=referral&utm_campaign=platform-clients&utm_content={{PLATFORM}}-repository-api-docs). Keep `CRAWLORA_API_KEY` out of source control. -## API coverage +## API coverage and supported endpoints -The six clients provide access to {{OPERATION_COUNT}} public API operations. See the [API reference](docs/usage.md) for supported operations, parameters, and response details. +The six language clients provide access to all {{OPERATION_COUNT}} selected public {{DISPLAY_NAME}} API operations. Search or browse by endpoint path and operation ID below; the [complete API reference](docs/usage.md) adds parameters, enums, and response details. + +{{ENDPOINT_TABLE}} ## License diff --git a/scripts/_platformsdk/templates/documentation/javascript-README.md.tmpl b/scripts/_platformsdk/templates/documentation/javascript-README.md.tmpl index 290b8dc..0cb56e0 100644 --- a/scripts/_platformsdk/templates/documentation/javascript-README.md.tmpl +++ b/scripts/_platformsdk/templates/documentation/javascript-README.md.tmpl @@ -1,7 +1,7 @@ -# {{NPM_NAME}} +# {{NPM_NAME}} — {{DISPLAY_NAME}} API client for JavaScript and TypeScript JavaScript and TypeScript client for Crawlora's hosted {{DISPLAY_NAME}} API. -It calls [Crawlora](https://crawlora.net/?utm_source=npm&utm_medium=referral&utm_campaign=platform-clients&utm_content={{PLATFORM}}-javascript-homepage); it does not run a browser or scrape {{DISPLAY_NAME}} locally. A Crawlora account and `CRAWLORA_API_KEY` are required, and API use is billed under your Crawlora account. Crawlora is independent from and not endorsed by {{DISPLAY_NAME}} or its owners. +It exposes {{OPERATION_COUNT}} API endpoints for {{SEO_SUMMARY}} through [Crawlora](https://crawlora.net/?utm_source=npm&utm_medium=referral&utm_campaign=platform-clients&utm_content={{PLATFORM}}-javascript-homepage). It does not run a browser or scrape {{DISPLAY_NAME}} locally. A Crawlora account and `CRAWLORA_API_KEY` are required, and API use is billed under your Crawlora account. Crawlora is independent from and not endorsed by {{DISPLAY_NAME}} or its owners. ## Install @@ -37,6 +37,11 @@ group. See the full method and parameter list in the [online reference]({{DOCS_U Methods return promises and can be awaited. See the [runnable example]({{JS_EXAMPLE_URL}}) for a complete usage example. +## Supported {{DISPLAY_NAME}} API endpoints + +This package exposes each route below as a direct method and through the `{{PLATFORM}}` group. See the [endpoint and parameter reference]({{DOCS_URL}}) for complete input details. + +{{ENDPOINT_TABLE}} ## Configuration diff --git a/scripts/_platformsdk/templates/documentation/python-README.md.tmpl b/scripts/_platformsdk/templates/documentation/python-README.md.tmpl index f12f662..07eafa1 100644 --- a/scripts/_platformsdk/templates/documentation/python-README.md.tmpl +++ b/scripts/_platformsdk/templates/documentation/python-README.md.tmpl @@ -1,7 +1,6 @@ -# {{PYTHON_NAME}} +# {{PYTHON_NAME}} — {{DISPLAY_NAME}} API client for Python -Python client for Crawlora's hosted {{DISPLAY_NAME}} API. It calls Crawlora's -service at [Crawlora](https://crawlora.net/?utm_source=pypi&utm_medium=referral&utm_campaign=platform-clients&utm_content={{PLATFORM}}-python-homepage); it does not run a browser or scrape +Python client for Crawlora's hosted {{DISPLAY_NAME}} API. It exposes {{OPERATION_COUNT}} API endpoints covering {{SEO_SUMMARY}}. Requests go to [Crawlora](https://crawlora.net/?utm_source=pypi&utm_medium=referral&utm_campaign=platform-clients&utm_content={{PLATFORM}}-python-homepage); the package does not run a browser or scrape {{DISPLAY_NAME}} locally. A Crawlora account and `CRAWLORA_API_KEY` are required, and API use is billed under your Crawlora account. Crawlora is independent from and not endorsed by {{DISPLAY_NAME}} or its owners. @@ -64,6 +63,12 @@ asyncio.run(main()) See the [runnable example]({{PYTHON_EXAMPLE_URL}}) for a complete usage example. +## Supported {{DISPLAY_NAME}} API endpoints + +This package exposes every route below through direct snake_case methods and the `{{PLATFORM}}` group. See the [endpoint and parameter reference]({{DOCS_URL}}) for complete input details. + +{{ENDPOINT_TABLE}} + ## Configuration Pass your key through `api_key` or read `CRAWLORA_API_KEY` from the environment. diff --git a/scripts/_platformsdk/templates/documentation/usage.md.tmpl b/scripts/_platformsdk/templates/documentation/usage.md.tmpl index 700d3cc..7a21d6f 100644 --- a/scripts/_platformsdk/templates/documentation/usage.md.tmpl +++ b/scripts/_platformsdk/templates/documentation/usage.md.tmpl @@ -1,6 +1,6 @@ -# {{DISPLAY_NAME}} client usage +# {{DISPLAY_NAME}} API endpoint reference and client usage -The `{{NPM_NAME}}` and `{{PYTHON_NAME}}` packages call Crawlora's hosted API. Set `CRAWLORA_API_KEY` to a key for your Crawlora account before making requests. Service usage is billed under that account. These clients do not run a browser or scrape {{DISPLAY_NAME}} locally; Crawlora is independent from and not endorsed by {{DISPLAY_NAME}} or its owners. +This reference lists all {{OPERATION_COUNT}} public {{DISPLAY_NAME}} API endpoints exposed by the `{{NPM_NAME}}` and `{{PYTHON_NAME}}` packages, covering {{SEO_SUMMARY}}. The clients call Crawlora's hosted API. Set `CRAWLORA_API_KEY` to a key for your Crawlora account before making requests. Service usage is billed under that account. These clients do not run a browser or scrape {{DISPLAY_NAME}} locally; Crawlora is independent from and not endorsed by {{DISPLAY_NAME}} or its owners. The package tracks the public API contract revision `{{CONTRACT_REVISION}}` bundled with release `{{VERSION}}`. Maintainers can preview daily contract updates with the repository's `Sync live API contract` workflow; unchanged contracts do not produce package releases. diff --git a/scripts/_platformsdk/templates/golang/client.go.tmpl b/scripts/_platformsdk/templates/golang/client.go.tmpl index eed4650..26d8a89 100644 --- a/scripts/_platformsdk/templates/golang/client.go.tmpl +++ b/scripts/_platformsdk/templates/golang/client.go.tmpl @@ -1,8 +1,9 @@ -// Package {{package_name}} is a focused Go client for Crawlora's {{display_name}} endpoints. +// Package {{package_name}} is Crawlora's {{display_name}} API client for {{operation_count}} endpoints, covering {{seo_summary}}. // API documentation: {{docs_url}} package {{package_name}} import ( + "bytes" "context" "encoding/json" "fmt" @@ -63,12 +64,31 @@ func (c *Client) Call(ctx context.Context, operationID string, params Params) (a if !ok { return nil, fmt.Errorf("unknown {{display_name}} operation: %s", operationID) } - if operation.Method != http.MethodGet { + if operation.Method != http.MethodGet && operation.Method != http.MethodPost { return nil, fmt.Errorf("unsupported HTTP method %s for %s", operation.Method, operationID) } if params == nil { params = Params{} } + var payload io.Reader + if operation.BodyParam != "" { + // The JSON body is passed under the operation's body parameter name or "body". + value, ok := params[operation.BodyParam] + if !ok || value == nil { + value, ok = params["body"] + } + if !ok || value == nil { + if operation.BodyRequired { + return nil, fmt.Errorf("missing required request body: %s", operation.BodyParam) + } + } else { + encoded, err := json.Marshal(value) + if err != nil { + return nil, fmt.Errorf("encode request body: %w", err) + } + payload = bytes.NewReader(encoded) + } + } requestURL, err := buildURL(c.BaseURL, operation, params) if err != nil { return nil, err @@ -78,10 +98,13 @@ func (c *Client) Call(ctx context.Context, operationID string, params Params) (a ctx, cancel = context.WithTimeout(ctx, c.Timeout) defer cancel() } - request, err := http.NewRequestWithContext(ctx, http.MethodGet, requestURL, nil) + request, err := http.NewRequestWithContext(ctx, operation.Method, requestURL, payload) if err != nil { return nil, err } + if payload != nil { + request.Header.Set("Content-Type", "application/json") + } request.Header.Set("User-Agent", {{user_agent_json}}) for _, security := range operation.Security { if security == "ApiKeyAuth" && c.APIKey != "" { diff --git a/scripts/_platformsdk/templates/golang/operations.go.tmpl b/scripts/_platformsdk/templates/golang/operations.go.tmpl index c689bea..873d2cd 100644 --- a/scripts/_platformsdk/templates/golang/operations.go.tmpl +++ b/scripts/_platformsdk/templates/golang/operations.go.tmpl @@ -23,6 +23,9 @@ type operationDefinition struct { QueryParams []parameterDefinition Produces []string Security []string + // BodyParam names the JSON request body parameter of a POST operation. + BodyParam string + BodyRequired bool } var operations = map[string]operationDefinition{ diff --git a/scripts/_platformsdk/templates/java/Client.java.tmpl b/scripts/_platformsdk/templates/java/Client.java.tmpl index 569528b..a21d429 100644 --- a/scripts/_platformsdk/templates/java/Client.java.tmpl +++ b/scripts/_platformsdk/templates/java/Client.java.tmpl @@ -68,8 +68,14 @@ public final class Client implements AutoCloseable { Operation operation = OPERATIONS.get(operationId); if (operation == null) throw new IllegalArgumentException("unknown {{display_name}} operation: " + operationId); Map values = params == null ? Map.of() : params; + boolean post = operation.method().equals("POST"); Set unknown = new TreeSet<>(values.keySet()); unknown.removeAll(operation.params().keySet()); + // POST operations take their JSON body under the body parameter name or "body". + if (post) { + unknown.remove("body"); + unknown.remove(operation.bodyParam()); + } if (!unknown.isEmpty()) throw new IllegalArgumentException("unknown parameters for " + operationId + ": " + unknown); String path = operation.path(); @@ -93,11 +99,21 @@ public final class Client implements AutoCloseable { url.append(i == 0 ? '?' : '&').append(queryEncode(query.get(i).getKey())) .append('=').append(queryEncode(query.get(i).getValue())); } - HttpRequest request = HttpRequest.newBuilder(URI.create(url.toString())) + HttpRequest.Builder builder = HttpRequest.newBuilder(URI.create(url.toString())) .timeout(timeout) .header("x-api-key", apiKey) - .header("Accept", acceptHeader(operation)) - .GET().build(); + .header("Accept", acceptHeader(operation)); + if (post) { + Object body = values.get(operation.bodyParam()); + if (body == null) body = values.get("body"); + if (body == null) throw new IllegalArgumentException("missing request body for " + operationId); + String payload = body instanceof String text ? text : Json.write(body); + builder.header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(payload, StandardCharsets.UTF_8)); + } else { + builder.GET(); + } + HttpRequest request = builder.build(); try { HttpResponse response = http.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); String body = response.body(); diff --git a/scripts/_platformsdk/templates/java/Operation.java.tmpl b/scripts/_platformsdk/templates/java/Operation.java.tmpl index 0a1e2a9..7dc688b 100644 --- a/scripts/_platformsdk/templates/java/Operation.java.tmpl +++ b/scripts/_platformsdk/templates/java/Operation.java.tmpl @@ -4,4 +4,9 @@ import java.util.List; import java.util.Map; /** Immutable metadata for one operation in this platform client. */ -public record Operation(String id, String method, String path, Map params, List produces) {} +public record Operation(String id, String method, String path, Map params, List produces, String bodyParam) { + /** Operation without a request body. */ + public Operation(String id, String method, String path, Map params, List produces) { + this(id, method, path, params, produces, ""); + } +} diff --git a/scripts/_platformsdk/templates/java/README.md.tmpl b/scripts/_platformsdk/templates/java/README.md.tmpl index 774d5a0..25541b4 100644 --- a/scripts/_platformsdk/templates/java/README.md.tmpl +++ b/scripts/_platformsdk/templates/java/README.md.tmpl @@ -1,6 +1,6 @@ -# Crawlora {{display_name}} Java Client +# Crawlora {{display_name}} API client for Java -The official Java client for Crawlora's hosted {{display_name}} API. It calls Crawlora's hosted API with your `x-api-key`; it does not connect to the upstream site directly. +The official Java client for Crawlora's hosted {{display_name}} API. It exposes {{operation_count}} endpoints covering {{seo_summary}}. Requests use your `x-api-key`; the client does not connect to the upstream site directly. ## Install @@ -31,6 +31,12 @@ Each operation has a direct method that accepts the parameters documented for th For custom hosted API routing and timeouts, use `new Client(apiKey, baseUrl, Duration.ofSeconds(20))`. Text responses are returned as `String`; JSON responses are parsed into Java maps, lists, and scalar values. +## Supported {{display_name}} API endpoints + +Browse every route included in this Java package. The [endpoint reference]({{repository}}/blob/main/docs/usage.md) also lists parameters and response details. + +{{endpoint_table}} + ## Links - [Crawlora](https://crawlora.net/?utm_source=maven-central&utm_medium=referral&utm_campaign=platform-clients&utm_content={{platform}}-java-homepage) diff --git a/scripts/_platformsdk/templates/javascript/package.json b/scripts/_platformsdk/templates/javascript/package.json index 0c66e6e..4705d80 100644 --- a/scripts/_platformsdk/templates/javascript/package.json +++ b/scripts/_platformsdk/templates/javascript/package.json @@ -1,10 +1,10 @@ { "name": "{{npm_name}}", "version": "{{version}}", - "description": "Typed JavaScript client for the Crawlora {{display_name}} API", + "description": "Crawlora {{display_name}} API client with {{operation_count}} endpoints for {{seo_summary}}", "homepage": "{{homepage}}", "bugs": { "url": "{{bugs_url}}" }, - "keywords": ["crawlora", "api-client", "web-scraping", "{{platform}}", "typescript"], + "keywords": {{seo_keywords_json}}, "type": "module", "main": "./src/index.js", "types": "./src/index.d.ts", diff --git a/scripts/_platformsdk/templates/php/Client.php.tpl b/scripts/_platformsdk/templates/php/Client.php.tpl index c407ba9..b904ed9 100644 --- a/scripts/_platformsdk/templates/php/Client.php.tpl +++ b/scripts/_platformsdk/templates/php/Client.php.tpl @@ -53,14 +53,18 @@ JSON, true, 512, JSON_THROW_ON_ERROR); if ($this->apiKey === '') { throw new ClientException('Crawlora API key is required', null, $operationId); } + $payload = $this->requestBody($operation, $params); $url = $this->buildUrl($operation, $params); $headers = [ 'x-api-key: ' . $this->apiKey, 'User-Agent: crawlora-{{PLATFORM}}-php/{{VERSION}}', 'Accept: ' . (in_array('text/plain', $operation['produces'], true) ? 'application/json, text/plain' : 'application/json'), ]; + if ($payload !== null) { + $headers[] = 'Content-Type: application/json'; + } try { - [$status, $contentType, $body] = $this->send($url, $headers, $operationId); + [$status, $contentType, $body] = $this->send($url, $headers, $operationId, $operation['method'], $payload); } catch (CrawloraException $exception) { throw $exception; } catch (\Throwable $exception) { @@ -100,9 +104,29 @@ JSON, true, 512, JSON_THROW_ON_ERROR); {{DIRECT_METHODS}} + /** POST operations take their JSON body under the body parameter name or "body". */ + private function requestBody(array $operation, array $params): ?string + { + $name = $operation['bodyParam'] ?? null; + if ($name === null) { + return null; + } + $value = $params[$name] ?? ($params['body'] ?? null); + if ($value === null) { + if ($operation['bodyRequired'] ?? false) { + throw new ClientException('Missing request body: ' . $name, null, $operation['id']); + } + return null; + } + return is_string($value) ? $value : json_encode($value, JSON_THROW_ON_ERROR); + } + private function buildUrl(array $operation, array $params): string { $known = array_column($operation['params'], 'name'); + if (($operation['bodyParam'] ?? null) !== null) { + $known[] = 'body'; + } $unknown = array_diff(array_keys($params), $known, ['response_type', '_response_type']); if ($unknown !== []) { throw new ClientException('Unknown parameters: ' . implode(', ', $unknown), null, $operation['id']); @@ -169,17 +193,26 @@ JSON, true, 512, JSON_THROW_ON_ERROR); return (string) $value; } - private function send(string $url, array $headers, string $operationId): array + private function send(string $url, array $headers, string $operationId, string $method = 'GET', ?string $payload = null): array { if ($this->transport !== null) { - $result = ($this->transport)($url, $headers, $this->timeout); + $result = $method === 'POST' + ? ($this->transport)($url, $headers, $this->timeout, $method, $payload) + : ($this->transport)($url, $headers, $this->timeout); return [(int) $result['status'], (string) ($result['content_type'] ?? ''), (string) ($result['body'] ?? '')]; } $handle = curl_init($url); if ($handle === false) { throw new NetworkException('Could not initialize cURL', null, $operationId); } - curl_setopt_array($handle, [ + curl_setopt_array($handle, $method === 'POST' ? [ + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => $payload ?? '', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => $headers, + CURLOPT_TIMEOUT_MS => (int) ($this->timeout * 1000), + CURLOPT_CONNECTTIMEOUT_MS => (int) ($this->timeout * 1000), + ] : [ CURLOPT_HTTPGET => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => $headers, diff --git a/scripts/_platformsdk/templates/php/README.md.tpl b/scripts/_platformsdk/templates/php/README.md.tpl index 99692eb..0d52b69 100644 --- a/scripts/_platformsdk/templates/php/README.md.tpl +++ b/scripts/_platformsdk/templates/php/README.md.tpl @@ -1,6 +1,6 @@ -# Crawlora {{DISPLAY_NAME}} PHP client +# Crawlora {{DISPLAY_NAME}} API client for PHP (`{{PACKAGE_NAME}}`) -This package calls the Crawlora hosted API at `https://api.crawlora.net/api/v1`. It does not call or scrape {{DISPLAY_NAME}} directly. Requests require a Crawlora API key and use your Crawlora account's service plan. +This PHP package calls Crawlora's hosted {{DISPLAY_NAME}} API at `https://api.crawlora.net/api/v1`. It exposes {{OPERATION_COUNT}} endpoints covering {{SEO_SUMMARY}}. It does not call or scrape {{DISPLAY_NAME}} directly. Requests require a Crawlora API key and use your Crawlora account's service plan. ## Install @@ -22,4 +22,10 @@ $client->close(); The client uses PHP cURL and JSON. Constructor options are `apiKey`, `baseUrl`, and `timeout`. Call the operation-specific method for direct access to each supported operation, or `request($operationId, $params, $responseType)` to dispatch by operation ID. Set `$responseType` to `text` for raw text output such as transcript formats. The package includes {{OPERATION_COUNT}} API operations. +## Supported {{DISPLAY_NAME}} API endpoints + +Browse every route included in this Composer package. The [endpoint reference]({{REPOSITORY}}/blob/main/docs/usage.md) includes parameter and response details. + +{{ENDPOINT_TABLE}} + See [Crawlora](https://crawlora.net/?utm_source=packagist&utm_medium=referral&utm_campaign=platform-clients&utm_content={{PLATFORM}}-php-homepage), the [API documentation](https://crawlora.net/docs?utm_source=packagist&utm_medium=referral&utm_campaign=platform-clients&utm_content={{PLATFORM}}-php-api-docs), and the [PHP client source]({{REPOSITORY}}). The complete operation and parameter reference is in the [platform repository]({{REPOSITORY}}/blob/main/docs/usage.md). diff --git a/scripts/_platformsdk/templates/php/composer.json.tpl b/scripts/_platformsdk/templates/php/composer.json.tpl index 77c3ca4..b446c06 100644 --- a/scripts/_platformsdk/templates/php/composer.json.tpl +++ b/scripts/_platformsdk/templates/php/composer.json.tpl @@ -1,6 +1,7 @@ { "name": "{{PACKAGE_NAME}}", - "description": "{{DISPLAY_NAME}} client for the Crawlora hosted API", + "description": "Crawlora {{DISPLAY_NAME}} API client with {{OPERATION_COUNT}} endpoints for {{SEO_SUMMARY}}", + "keywords": {{SEO_KEYWORDS_JSON}}, "type": "library", "license": "MIT", "require": { diff --git a/scripts/_platformsdk/templates/python/pyproject.toml.tpl b/scripts/_platformsdk/templates/python/pyproject.toml.tpl index 3816bfa..ba3d1e7 100644 --- a/scripts/_platformsdk/templates/python/pyproject.toml.tpl +++ b/scripts/_platformsdk/templates/python/pyproject.toml.tpl @@ -5,8 +5,9 @@ build-backend = "setuptools.build_meta" [project] name = "{{PYTHON_NAME}}" version = "{{VERSION}}" -description = "Typed {{DISPLAY_NAME}} client for the Crawlora hosted API" +description = "Crawlora {{DISPLAY_NAME}} API client with {{OPERATION_COUNT}} endpoints for {{SEO_SUMMARY}}" readme = "README.md" +keywords = {{SEO_KEYWORDS_JSON}} requires-python = ">=3.10" license = "MIT" license-files = ["LICENSE"] diff --git a/scripts/_platformsdk/templates/ruby/README.md.tpl b/scripts/_platformsdk/templates/ruby/README.md.tpl index a14ce77..81e3bf5 100644 --- a/scripts/_platformsdk/templates/ruby/README.md.tpl +++ b/scripts/_platformsdk/templates/ruby/README.md.tpl @@ -1,6 +1,6 @@ -# Crawlora {{DISPLAY_NAME}} Ruby client +# Crawlora {{DISPLAY_NAME}} API client for Ruby (`{{GEM_NAME}}`) -This gem calls the Crawlora hosted API at `https://api.crawlora.net/api/v1`. It does not call or scrape {{DISPLAY_NAME}} directly. Requests require your Crawlora API key and use your account's service plan. +This Ruby gem calls Crawlora's hosted {{DISPLAY_NAME}} API at `https://api.crawlora.net/api/v1`. It exposes {{OPERATION_COUNT}} endpoints covering {{SEO_SUMMARY}}; it does not call or scrape {{DISPLAY_NAME}} directly. Requests require your Crawlora API key and use your account's service plan. ## Install @@ -30,4 +30,10 @@ client.close Client options include `api_key`, `base_url`, and `timeout`. Ruby stdlib provides the HTTP and JSON support. +## Supported {{DISPLAY_NAME}} API endpoints + +Browse every route included in this gem. The [endpoint reference]({{REPOSITORY}}/blob/main/docs/usage.md) includes parameter and response details. + +{{ENDPOINT_TABLE}} + See [Crawlora](https://crawlora.net/?utm_source=rubygems&utm_medium=referral&utm_campaign=platform-clients&utm_content={{PLATFORM}}-ruby-homepage), the [API documentation](https://crawlora.net/docs?utm_source=rubygems&utm_medium=referral&utm_campaign=platform-clients&utm_content={{PLATFORM}}-ruby-api-docs), and [the package repository]({{REPOSITORY}}) for account setup, the API operation reference, and release history. diff --git a/scripts/_platformsdk/templates/ruby/client.rb.tpl b/scripts/_platformsdk/templates/ruby/client.rb.tpl index d3be466..ca6bf95 100644 --- a/scripts/_platformsdk/templates/ruby/client.rb.tpl +++ b/scripts/_platformsdk/templates/ruby/client.rb.tpl @@ -45,15 +45,24 @@ module Crawlora raise Errors::ClientError.new("unknown operation: #{operation_id}", operation_id: operation_id) unless operation raise Errors::ClientError.new("Crawlora API key is required", operation_id: operation_id) if @api_key.nil? || @api_key.to_s.empty? normalized = params.each_with_object({}) { |(key, value), out| out[key.to_s] = value } + payload = request_body(operation, normalized) url = build_url(operation, normalized) uri = URI.parse(url) - request = Net::HTTP::Get.new(uri) + request = operation["method"] == "POST" ? Net::HTTP::Post.new(uri) : Net::HTTP::Get.new(uri) + unless payload.nil? + request.body = payload + request["Content-Type"] = "application/json" + end request["x-api-key"] = @api_key request["User-Agent"] = @user_agent request["Accept"] = operation["produces"].include?("text/plain") ? "application/json, text/plain" : "application/json" begin if @transport - response = @transport.call(url, request.to_hash, @timeout) + response = if operation["method"] == "POST" + @transport.call(url, request.to_hash, @timeout, "POST", payload) + else + @transport.call(url, request.to_hash, @timeout) + end status = Integer(response.fetch(:status) { response.fetch("status") }) body = response.fetch(:body) { response.fetch("body", "") } headers = response.fetch(:headers) { response.fetch("headers", {}) } @@ -109,8 +118,21 @@ module Crawlora private + # POST operations take their JSON body under the body parameter name or "body". + def request_body(operation, params) + name = operation["bodyParam"] + return nil if name.nil? + value = params.key?(name) ? params[name] : params["body"] + if value.nil? + raise Errors::ClientError.new("missing request body: #{name}", operation_id: operation["id"]) if operation["bodyRequired"] + return nil + end + value.is_a?(String) ? value : JSON.generate(value) + end + def build_url(operation, params) known = operation["params"].map { |param| param["name"] } + known << "body" if operation["bodyParam"] unknown = params.keys - known raise Errors::ClientError.new("unknown parameters: #{unknown.join(', ')}", operation_id: operation["id"]) unless unknown.empty? path = operation["path"].dup diff --git a/scripts/_platformsdk/templates/ruby/gem.gemspec.tpl b/scripts/_platformsdk/templates/ruby/gem.gemspec.tpl index 7ae3a93..5177cc0 100644 --- a/scripts/_platformsdk/templates/ruby/gem.gemspec.tpl +++ b/scripts/_platformsdk/templates/ruby/gem.gemspec.tpl @@ -3,8 +3,8 @@ require_relative "lib/crawlora/{{PLATFORM}}/version" Gem::Specification.new do |spec| spec.name = "{{GEM_NAME}}" spec.version = Crawlora::{{CLASS_NAME}}::VERSION - spec.summary = "{{DISPLAY_NAME}} client for the Crawlora hosted API" - spec.description = "Credential-free {{DISPLAY_NAME}} API access through Crawlora's hosted service." + spec.summary = "{{DISPLAY_NAME}} API client for Crawlora ({{OPERATION_COUNT}} endpoints)" + spec.description = "Ruby client for Crawlora's hosted {{DISPLAY_NAME}} API. Covers {{SEO_SUMMARY}} across {{OPERATION_COUNT}} endpoints." spec.authors = ["Crawlora"] spec.license = "MIT" spec.required_ruby_version = ">= 2.6" diff --git a/scripts/_platformsdk/test_sync.py b/scripts/_platformsdk/test_sync.py index 55fcfe0..ad98ea9 100644 --- a/scripts/_platformsdk/test_sync.py +++ b/scripts/_platformsdk/test_sync.py @@ -55,12 +55,30 @@ def _raw_spec(platform: str, *, extra: bool = False) -> dict: "tiktok": [("search", "search"), ("trending", "trending")], "amazon": [("search", "search"), ("product", "product")], "imdb": [("search", "search"), ("charts", "charts")], + "google": [("news", "news"), ("suggest", "suggest")], + "bing": [("search", "search"), ("news", "news")], + "brave": [("search", "search"), ("suggest", "suggest")], + "duckduckgo": [("search", "search"), ("news", "news")], + "ebay": [("seller", "seller"), ("live-streams", "live/streams")], + "googleplay": [("search", "search"), ("app", "app")], + "appstore": [("search", "search"), ("app", "app")], + "airbnb": [("search", "search"), ("room", "room")], + "spotify": [("search", "search"), ("track", "track")], }[platform] paths = {} for suffix, path_suffix in operation_ids: operation = _operation(platform, suffix) + if (platform, suffix) == ("ebay", "seller"): + operation["parameters"][0]["name"] = "seller" + if (platform, suffix) in {("google", "news"), ("ebay", "seller")}: + # These packages have no "-search" operation; their first + # operation carries the raw header parameter instead. + operation["parameters"].append({"name": "X-API-Key", "in": "header", "type": "string"}) if suffix == "search": - query_name = {"tiktok": "keyword", "amazon": "k", "imdb": "query"}.get(platform) + query_name = { + "tiktok": "keyword", "amazon": "k", "imdb": "query", + "googleplay": "term", "appstore": "term", "airbnb": "location", + }.get(platform) if query_name: operation["parameters"][0]["name"] = query_name operation["parameters"].append({"name": "X-API-Key", "in": "header", "type": "string"}) @@ -218,14 +236,17 @@ def test_raw_header_normalization_matches_selected_public_contract(self) -> None normalized = sync.normalize_public_spec(source, platform) prepared = copy.deepcopy(source) prepared["securityDefinitions"] = copy.deepcopy(sync._AUTH_DEFINITIONS) - search = next(op["get"] for path, op in prepared["paths"].items() if op["get"]["operationId"] == f"{platform}-search") + search = next( + op["get"] for path, op in prepared["paths"].items() + if any(p.get("in") == "header" for p in op["get"]["parameters"]) + ) search["parameters"] = [p for p in search["parameters"] if p.get("in") != "header"] search["security"] = [{"ApiKeyAuth": []}] expected = select(prepared, platform) self.assertEqual(normalized, expected) self.assertEqual(set(normalized["definitions"]), {"Envelope", "Item"}) - def test_discovers_and_generates_new_operation_for_all_nine_clients(self) -> None: + def test_discovers_and_generates_new_operation_for_all_clients(self) -> None: for platform in PLATFORMS: with self.subTest(platform=platform), tempfile.TemporaryDirectory(prefix="platform-sync-") as temp: root = Path(temp)