Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Dutch volleyball data (Eredivisie, Topdivisie, Superdivisie, and the full Dutch pyramid) via the Nevobo API. Standings, schedules, results, clubs, tournaments, and news. Zero config, no API keys. Use when: user asks about Dutch volleyball, Eredivisie volleyball, Nevobo, volleyball standings, volleyball match results, volleyball schedules, or Dutch volleyball clubs. Don't use when: user asks about other sports — use football-data (soccer), nfl-data (NFL), nba-data (NBA), wnba-data (WNBA), nhl-da
.claude/skills/machina-sports-volleyball-data/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-18 | ✓→✗ | ▼ Worse | 144% | 0% |
| case-21 | ✓→✗ | ▼ Worse | 279% | 0% |
| case-22 | ✓→✗ | ▼ Worse | 49% | 0% |
| case-09 | ✓→✓ | = Same ✓ | 87% | 0% |
Before writing queries, consult references/api-reference.md for endpoints, ID conventions, and data shapes.
Before first use, check if the CLI is available:
bashwhich sports-skills || pip install sports-skills
If pip install fails (package not found or Python version error), install from GitHub:
bashpip install git+https://github.com/machina-sports/sports-skills.git
The package requires Python 3.10+. If your default Python is older, use a specific version:
bashpython3 --version # check version # If < 3.10, try: python3.12 -m pip install sports-skills # On macOS with Homebrew: /opt/homebrew/bin/python3.12 -m pip install sports-skills
No API keys required. All data comes from the Nevobo (Nederlandse Volleybalbond) open API.
Prefer the CLI — it avoids Python import path issues:
bashsports-skills volleyball get_competitions sports-skills volleyball get_standings --competition_id=nevobo-eredivisie-heren sports-skills volleyball get_results --competition_id=nevobo-eredivisie-dames sports-skills volleyball get_schedule --competition_id=nevobo-topdivisie-heren-a
Python SDK (alternative):
pythonfrom sports_skills import volleyball standings = volleyball.get_standings(competition_id="nevobo-eredivisie-heren") results = volleyball.get_results(competition_id="nevobo-eredivisie-dames")
CRITICAL: Before calling any data endpoint, verify:
competition_id uses a valid value from references/competition-ids.md — never guess.club_id (use get_clubs to find one — the organisatiecode field).get_competitions or get_clubs to discover them.competition_id Parameter8 leagues across the top 3 tiers of Dutch volleyball are pre-configured. The competition_id follows the pattern nevobo-<league>-<gender>[-<pool>]:
nevobo-eredivisie-heren, nevobo-eredivisie-damesnevobo-topdivisie-heren-a, nevobo-topdivisie-heren-b, nevobo-topdivisie-dames-a, nevobo-topdivisie-dames-bnevobo-superdivisie-heren, nevobo-superdivisie-damesFor lower divisions (1e/2e/3e Divisie, regional, youth, beach — 6,400+ poules), use get_poules to discover them.
See references/competition-ids.md for the full reference with team counts and the Dutch volleyball pyramid.
| Command | Description | |---|---| | get_competitions | List all available competitions and leagues | | get_standings | League table (rank, team, matches, points) | | get_schedule | Upcoming matches (teams, venue, date) | | get_results | Match results (score, set-by-set scores) | | get_clubs | List volleyball clubs (name, city, province) | | get_club_schedule | Club's upcoming matches across all teams | | get_club_results | Club's results across all teams | | get_poules | Browse Nevobo poules (for lower divisions discovery) | | get_tournaments | Tournament calendar | | get_news | Federation news |
See references/api-reference.md for full parameter lists and return shapes.
Example 1: Eredivisie standings User says: "What are the current Dutch volleyball standings?" Actions:
get_standings(competition_id="nevobo-eredivisie-heren") for menget_standings(competition_id="nevobo-eredivisie-dames") for womenResult: League tables with rank, team name, matches played, and points
Example 2: Recent match results User says: "Show me recent Eredivisie volleyball results" Actions:
get_results(competition_id="nevobo-eredivisie-heren")Result: Match results with home/away teams, match score (e.g. "3-1"), and set scores (e.g. "25-21", "25-18", "21-25", "25-20"])
Example 3: Club schedule User says: "What matches does LSV have coming up?" Actions:
get_clubs(limit=10) and find LSV's organisatiecode (CKL5C67)get_club_schedule(club_id="CKL5C67")Result: Upcoming matches for all of LSV's teams with venues and dates
Example 4: Second tier standings User says: "Show me the Topdivisie standings" Actions:
get_standings(competition_id="nevobo-topdivisie-heren-a") for men pool Aget_standings(competition_id="nevobo-topdivisie-heren-b") for men pool BResult: Two pool tables with 10 teams each
Example 5: Discover lower divisions User says: "What divisions are available in Dutch volleyball?" Actions:
get_poules(regio="nationale-competitie", limit=20)Result: List of national-level poules including 1e/2e/3e Divisie with their abbreviations and descriptions
get_scoreboard~~ — does not exist. Use get_results for recent match results.get_rankings~~ — does not exist. Volleyball uses get_standings for league tables.get_team_roster~~ — does not exist. Use get_clubs for club information.get_player_info~~ — does not exist. Player-level data is not available via this API.If a command is not listed in the Commands table above, it does not exist.
When a command fails, do not surface raw errors to the user. Instead:
get_clubs to find the organisatiecode firstget_competitions to verify available leaguesError: sports-skills command not found Cause: Package not installed Solution: Run pip install sports-skills. If not on PyPI, install from GitHub: pip install git+https://github.com/machina-sports/sports-skills.git
Error: Standings returns empty list Cause: The competition's regular season phase may have ended, or the season hasn't started yet Solution: Use get_results to check recent results, or get_poules to discover current active poule paths
Error: Schedule returns 0 matches Cause: The competition phase has completed and no more matches are scheduled for that poule Solution: This is expected between season phases. Check other leagues (Topdivisie/Superdivisie may still be active)
Error: Club schedule/results returns error Cause: The club_id may be incorrect Solution: Use get_clubs to find valid club IDs (the organisatiecode field, e.g. "CKL5C67")
Error: Connection errors or timeouts Cause: The Nevobo API may be temporarily unavailable Solution: Wait a moment and retry. The API is public and unauthenticated but may have brief outages
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 7,453 | 3,499 | -53% | 1 | 1 | 0% | 1,038 | 2,143 | +106% | 0 | 0 | — |
case-02 | fail→fail | 10,347 | 25,516 | +147% | 1 | 1 | 0% | 2,209 | 2,180 | -1% | 0 | 0 | — |
case-03 | fail→fail | 12,984 | 5,114 | -61% | 1 | 1 | 0% | 2,659 | 2,238 | -16% | 0 | 0 | — |
case-04 | fail→fail | 8,743 | 9,340 | +7% | 1 | 1 | 0% | 1,384 | 2,232 | +61% | 0 | 0 | — |
case-05 | fail→pass | 8,387 | 4,488 | -46% | 1 | 1 | 0% | 1,788 | 2,845 | +59% | 0 | 0 | — |
case-06 | fail→fail | 2,817 | 5,116 | +82% | 1 | 1 | 0% | 418 | 2,219 | +431% | 0 | 0 | — |
case-07 | fail→fail | 5,787 | 4,042 | -30% | 1 | 1 | 0% | 953 | 2,195 | +130% | 0 | 0 | — |
case-13 | fail→fail | 15,603 | 25,162 | +61% | 1 | 1 | 0% | 2,167 | 2,175 | +0% | 0 | 0 | — |
case-08 | fail→fail | 8,700 | 4,875 | -44% | 1 | 1 | 0% | 1,301 | 2,205 | +69% | 0 | 0 | — |
case-09 | pass→pass | 7,848 | 4,331 | -45% | 1 | 1 | 0% | 1,374 | 2,573 | +87% | 0 | 0 | — |
case-10 | fail→fail | 5,354 | 7,370 | +38% | 1 | 1 | 0% | 834 | 2,526 | +203% | 0 | 0 | — |
case-11 | fail→fail | 8,397 | 14,080 | +68% | 1 | 1 | 0% | 1,540 | 2,204 | +43% | 0 | 0 | — |
case-12 | fail→fail | 5,695 | 6,093 | +7% | 1 | 1 | 0% | 951 | 2,413 | +154% | 0 | 0 | — |
case-14 | fail→fail | 7,225 | 5,194 | -28% | 1 | 1 | 0% | 1,234 | 2,181 | +77% | 0 | 0 | — |
case-15 | fail→fail | 9,835 | 3,547 | -64% | 1 | 1 | 0% | 1,212 | 2,194 | +81% | 0 | 0 | — |
case-16 | fail→fail | 8,274 | 4,246 | -49% | 1 | 1 | 0% | 1,511 | 2,180 | +44% | 0 | 0 | — |
case-17 | fail→fail | 2,361 | 5,337 | +126% | 1 | 1 | 0% | 312 | 2,216 | +610% | 0 | 0 | — |
case-18 | pass→fail | 5,061 | 27,415 | +442% | 1 | 1 | 0% | 924 | 2,256 | +144% | 0 | 0 | — |
case-19 | fail→fail | 8,481 | 6,504 | -23% | 1 | 1 | 0% | 1,220 | 2,164 | +77% | 0 | 0 | — |
case-20 | fail→fail | 6,123 | 44,423 | +626% | 1 | 1 | 0% | 1,110 | 2,240 | +102% | 0 | 0 | — |
case-21 | pass→fail | 3,651 | 6,690 | +83% | 1 | 1 | 0% | 596 | 2,256 | +279% | 0 | 0 | — |
case-22 | pass→fail | 9,139 | 4,259 | -53% | 1 | 1 | 0% | 1,402 | 2,084 | +49% | 0 | 0 | — |
case-23 | pass→pass | 11,132 | 9,986 | -10% | 1 | 1 | 0% | 2,013 | 3,651 | +81% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 3 counted toward the lift figure. The other 20 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of -9 percentage points is the difference between those two pass rates over the 3 comparable cases. 9 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.