cz.basketball Schedule Watcher
Pricing
Pay per usage
cz.basketball Schedule Watcher
Watches a cz.basketball team's fixtures for schedule changes (new/moved/cancelled games, time & venue changes) and optionally syncs them to Google Calendar. Sends email and webhook notifications on every change.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Zdeněk Kunčar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
CBF.cz Schedule Watcher
Watches a team's fixtures on cz.basketball and tells you when the schedule changes: a game gets moved, the venue changes, a game is postponed/cancelled, or a brand-new fixture appears. It also publishes the fixtures as a calendar feed you can subscribe to in Google Calendar, Apple Calendar or Outlook, so your team's games just show up — and stay correct — without anyone re-typing anything or setting up a Google account integration.
Built for BASKET OPAVA 2010 by default, but works for any team in any Czech basketball league:
just change the teamId input.
How it works
cz.basketball doesn't have a stable per-season schedule URL — the competition ID (/soutez/5376)
changes every year when the league restarts. What is stable is the team ID (/tym/13093),
with the season selected via a ?y= query parameter (?y=2026 = the 2026/27 season).
Each run, the Actor:
- Fetches
https://cz.basketball/tym/{teamId}?y={year}to get the list of this season's fixtures. - Fetches each fixture's detail page (
/zapas/{id}) for the authoritative date, time, and venue. - Diffs the result against the snapshot saved from the previous run.
- Reports anything that changed — new games, reschedules, venue changes, postponements/cancellations, and games dropped from the schedule.
- Publishes the fixtures as an iCalendar (
.ics) feed at a fixed URL. - Optionally POSTs the changes to a webhook.
- Saves the new snapshot for next time.
If year is left empty, the Actor auto-detects the current season (it rolls over every August), so
it keeps working next year and the year after without any changes to the input.
Finding your team's ID
- Go to cz.basketball and open your team's page (via your league's standings/competition page, or search).
- The team ID is the number in the URL:
https://cz.basketball/tym/13093→teamId = "13093".
Input
| Field | Required | Default | Description |
|---|---|---|---|
teamId | yes | 13093 (BASKET OPAVA 2010) | The cz.basketball team ID. |
teamName | yes | BASKET OPAVA 2010 | Display name used in calendar events and notifications. |
year | no | auto-detected | Season start year (the ?y= value). Leave empty so the Actor tracks the current season automatically, forever. |
skipPastGames | no | true | Ignore fixtures already in the past. |
webhookUrl | no | — | POST a JSON payload of the changes to your own endpoint, Zapier, Make, a Slack incoming webhook, etc. |
enableCalendarFeed | no | true | Publish the fixtures as a calendar subscription feed (see below). |
notifyOnFirstRun | no | false | On the very first run every fixture looks "new" (no prior snapshot exists). Leave off to seed silently. |
eventDurationMinutes | no | 120 | How long each game event lasts in the calendar feed. |
Calendar subscription feed
Every run writes the fixtures to an iCalendar feed with a fixed URL. The URL is printed in the run
log (Subscribe to: …) and saved as calendarFeedUrl in the run's OUTPUT record. It is the same
for every run and every season, so you only subscribe once.
To add it to Google Calendar: on the web, click + next to Other calendars → From URL, paste the feed URL and click Add calendar. The games appear as a separate calendar you can show, hide or recolour; it syncs to your phone automatically. In Apple Calendar use File → New Calendar Subscription; in Outlook use Add calendar → Subscribe from web.
The feed keeps played games for a year, so the calendar keeps its history. Cancelled games stay in the
calendar with a [ZRUŠENO] prefix and postponed ones with [ODLOŽENO].
Refresh delay: Google Calendar re-reads subscribed feeds on its own schedule, usually every few hours and occasionally up to a day, and there's no way to make it faster. Apple Calendar and Outlook follow the feed's one-hour refresh hint. A webhook notification is sent as soon as a change is detected, so you can still hear about it right away.
Output
Every run that detects changes pushes one dataset row per change, with the change type
(added, removed, rescheduled, venue_changed, opponent_changed, status_changed), a
human-readable summary, the affected match's details, and (for updates) the previous values.
Scheduling
Run this Actor on a schedule (Apify Console → Schedules) — a few times a day is plenty for a weekly amateur league; tighten it up if your league tends to announce changes close to game time.
Deployment
The Apify Actor builds from this repository's main branch. A GitHub webhook triggers a new build
(tagged latest) on every push to main, so merging a pull request is all it takes to deploy.
Don't deploy with apify push: it uploads whatever is in your local folder, and an out-of-date
checkout will silently replace the deployed version.
Local development
npm installapify run # reads storage/key_value_stores/default/INPUT.jsonnpm test # unit tests against saved real HTML fixtures — no network required
Notes on the source site
- cz.basketball is server-rendered HTML with no public API, so this Actor scrapes it directly with Cheerio (no browser needed — fast and light).
- The site blocks IP addresses outside Czechia. On Apify, the
proxyConfigurationinput defaults to Apify Proxy with Czech residential IPs; when running locally from Czechia, set"proxyConfiguration": { "useApifyProxy": false }to connect directly. - The site displays
00:00as a placeholder when a game's kickoff time hasn't been announced yet; the Actor treats that as "time TBD" rather than a literal midnight game, and will correctly report it as a schedule update once a real time is announced. - All crawled HTML is treated as untrusted input and parsed defensively — nothing scraped is ever executed or interpolated into commands.