Multi-provider student accommodation finder and monitor. Discover properties, scan for availability, and get instant alerts when rooms matching your criteria appear.
Built for students hunting semester accommodation โ especially when options appear unpredictably and sell out fast.
| You're wonderingโฆ | Command | What it does |
|---|---|---|
| "What properties are available in Dublin?" | student-rooms discover --provider all |
Lists all residences from every provider in your target city |
| "Are there Semester 1 rooms in Dublin under โฌ300/week?" | student-rooms scan --provider all |
One-shot scan filtered by semester & your config criteria |
| "Show me everything, not just Semester 1" | student-rooms scan --all-options --json |
Returns all tenancy options (full year, semester 2, etc.) as JSON |
| "Alert me the moment something opens up" | student-rooms watch --provider all |
Continuous loop โ sends a notification only when new options appear |
| "Can I actually book this room right now?" | student-rooms probe-booking --residence "Binary Hub" |
Deep-probes the booking flow and returns direct booking links |
| "Is my notification setup working?" | student-rooms notify --message "Test ๐ " |
Sends a test message through your configured notification backend |
| "Does this tenancy option count as Semester 1?" | student-rooms test-match --from-year 2026 --to-year 2027 |
Tests the semester-matching logic against sample data |
Website: yugo.com ยท Method: REST API (undocumented JSON endpoints) ยท Coverage: 11 countries, 70+ cities
Full country & city list
| Country | Cities |
|---|---|
| ๐บ๐ธ USA | Auburn, Fayetteville, Flagstaff, Tempe, Tucson, Fort Collins, Gainesville, Tallahassee, Atlanta, Kennesaw, Champaign, Urbana, West Lafayette, Lexington, Louisville, Minneapolis, Starkville, Charlotte, Greenville, Raleigh, Charleston, Cincinnati, Corvallis, Eugene, State College, Austin, College Station, Salt Lake City, Charlottesville, Pullman, Seattle, Madison |
| ๐ฌ๐ง UK | Birmingham, Bournemouth, Bristol, Cambridge, Cardiff, Edinburgh, Lancaster, Lincoln, Liverpool, London, Manchester, Newcastle, Norwich, Nottingham, Plymouth, Portsmouth, Sheffield, Southampton |
| ๐ฎ๐ช Ireland | Cork, Dublin |
| ๐ช๐ธ Spain | Alcalรก de Henares, Barcelona, Madrid, Salamanca, Sevilla, Valencia |
| ๐ฉ๐ช Germany | Darmstadt, Frankfurt, Hamburg, Leipzig, Mรผnster |
| ๐ซ๐ท France | Bordeaux, Lille, Lyon, Marseille, Paris |
| ๐ต๐น Portugal | Porto |
| ๐ฎ๐น Italy | Bologna, Florence, Padova, Turin |
| ๐ฆ๐น Austria | Vienna |
| ๐ฆ๐บ Australia | Adelaide, Melbourne, Perth |
| ๐ฆ๐ช UAE | Dubai |
Website: apartostudent.com ยท Method: StarRez portal probing + site scraping ยท Coverage: 5 countries, 14 cities (discovered dynamically)
| Country | Cities |
|---|---|
| ๐ฎ๐ช Ireland | Dublin |
| ๐ช๐ธ Spain | Barcelona |
| ๐ฎ๐น Italy | Milan, Florence |
| ๐ฌ๐ง UK | Aberdeen, Brighton, Bristol, Cambridge, Glasgow, Kingston, Lancaster, Oxford, Reading |
| ๐ซ๐ท France | Paris (discover only โ no StarRez portal) |
# Install directly from GitHub
pip install "git+https://github.com/gonzalopezgil/student-rooms-cli.git"
# Or clone for development
git clone https://github.com/gonzalopezgil/student-rooms-cli.git
cd student-rooms-cli
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"# Copy and edit the sample config
cp config.sample.yaml config.yaml
# List all properties in Dublin
python -m student_rooms discover --provider all
# Scan for Semester 1 availability
python -m student_rooms scan --provider all
# Scan ALL options (including full-year, unfiltered)
python -m student_rooms scan --provider all --all-options --json
# Continuous monitoring with alerts
python -m student_rooms watch --provider all
# Deep-probe a specific option's booking flow
python -m student_rooms probe-booking --provider yugo --residence "Dominick Place"
# Send a test notification
python -m student_rooms notify --message "Test alert ๐ "If installed via pip install -e ., you can also use:
student-rooms discover --provider all
student-rooms scan --provider all| Command | Description |
|---|---|
discover |
List all properties available from providers in your target city |
scan |
One-shot scan for rooms matching your semester/price/privacy criteria |
watch |
Continuous monitoring loop โ alerts on new availability |
probe-booking |
Deep-probe the booking flow for a matched option (generates direct booking links) |
notify |
Send a test notification to verify your notification setup |
test-match |
Test the semester matching logic against sample data |
Copy config.sample.yaml to config.yaml and edit:
# Target city
target:
country: "Ireland"
city: "Dublin"
# Provider settings
providers:
aparto:
term_id_start: 1200
term_id_end: 1600
# Academic year & semester detection
academic_year:
start_year: 2026
end_year: 2027
semester1:
name_keywords: ["semester 1", "sem 1", "first semester"]
require_keyword: true
start_months: [8, 9, 10]
end_months: [12, 1, 2]
# Filters
filters:
private_bathroom: null # true | false | null (any)
private_kitchen: null # true | false | null (any)
max_weekly_price: 350.0
max_monthly_price: null
# Monitoring interval
polling:
interval_seconds: 3600
jitter_seconds: 300
# Notifications (see below)
notifications:
type: "stdout"Filters apply to both scan and watch. If a room lacks the required metadata (e.g. private bathroom/kitchen), it will be excluded when that filter is set.
Choose one notification backend via notifications.type:
Just prints to console. No configuration needed.
Generic HTTP POST โ works with Discord webhooks, Slack, ntfy.sh, and more.
notifications:
type: "webhook"
webhook:
url: "https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN"
method: "POST"
headers: {}
body_template: '{"content": "{message}"}'Direct Telegram Bot API โ provide your own bot token and chat ID.
notifications:
type: "telegram"
telegram:
bot_token: "YOUR_BOT_TOKEN"
chat_id: "YOUR_CHAT_ID"
parse_mode: nullOpenClaw CLI integration. Requires OpenClaw installed and configured. Supports message mode, agent mode, and automatic reservation job creation.
notifications:
type: "openclaw"
openclaw:
mode: "message"
channel: "telegram"
target: "YOUR_CHAT_ID"
create_job_on_match: false- Resolves country โ city โ residences via Yugo's JSON API
- For each residence, fetches room types and tenancy options
- Filters by academic year and semester using config-driven name keywords + date rules
- Supports full booking-flow probing (available beds, flat selection, portal redirect)
- Dynamically discovers properties for the target city by scraping apartostudent.com
- Establishes session via the EU StarRez portal (auto-selects the correct country)
- Probes a range of termIDs via direct room search URLs on the appropriate regional portal
- Filters terms by matching property names against the target city's properties (supports abbreviations like PAโPallars, CdMโCristobal de Moura)
- Detects Semester 1 using the same config-driven name keywords + date rules as Yugo
- Enriches results with pricing data scraped from property pages
Portal topology:
- Ireland, Spain, Italy โ shared IE portal (
apartostudent.starrezhousing.com) - UK โ separate UK portal (
apartostudentuk.starrezhousing.com) - France โ no StarRez portal (discover-only, no term scanning)
- Scans all enabled providers at configurable intervals
- Deduplicates: only alerts on new options not previously seen
- Persists seen options in
~/.local/share/student-rooms-cli/seen_options.json(or$XDG_DATA_HOME) - Adds random jitter to avoid request patterns
This tool is designed to work well with AI agents and automation:
# JSON output for programmatic consumption
python -m student_rooms scan --provider all --json
python -m student_rooms discover --provider all --json
# Scan + notify in one command
python -m student_rooms scan --provider all --notify
# Watch mode as a background process
python -m student_rooms watch --provider all &The --json flag outputs structured data suitable for parsing by AI agents, scripts, or pipeline tools.
student_rooms/
โโโ __init__.py
โโโ __main__.py # python -m student_rooms entry point
โโโ cli.py # CLI argument parsing + command handlers
โโโ matching.py # Semester matching logic
โโโ models/
โ โโโ config.py # Configuration dataclasses + YAML loader
โโโ providers/
โ โโโ base.py # BaseProvider ABC + RoomOption dataclass
โ โโโ yugo.py # Yugo REST API provider
โ โโโ aparto.py # Aparto StarRez portal provider
โโโ notifiers/
โโโ base.py # BaseNotifier ABC + factory
โโโ webhook.py # Generic HTTP webhook
โโโ telegram.py # Direct Telegram Bot API
โโโ openclaw.py # OpenClaw CLI integration (optional)
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
python -m pytest tests/ -v
# Run a specific test file
python -m pytest tests/test_notifiers.py -v- Fork the repository
- Create a feature branch (
git checkout -b feature/new-provider) - Add tests for new functionality
- Ensure all tests pass (
python -m pytest tests/ -v) - Submit a pull request
- Create
student_rooms/providers/your_provider.py - Implement
BaseProvider(seebase.pyfor the interface) - Register it in
cli.py'smake_providers()function - Add tests in
tests/test_your_provider.py
- Create
student_rooms/notifiers/your_notifier.py - Implement
BaseNotifier(seebase.py) - Add config dataclass in
models/config.py - Register in
notifiers/base.py'screate_notifier()factory - Add tests in
tests/test_notifiers.py
- More providers (Collegiate, Host, Unite Students)
- GitHub Actions CI
- PyPI package
Actively developed โ contributions welcome!
MIT โ see LICENSE.