Scan. Apply. Move in. β An AI-powered Python bot that monitors WG-Gesucht and ImmobilienScout24, automatically applies to new rental listings, and personalises each application using an LLM β either fully local, or via a hosted API (Google Gemini, OpenAI).
Finding an apartment in Germany β especially in cities like Munich, Berlin, or Hamburg β is brutally competitive. Listings disappear within minutes. MietRadar monitors WG-Gesucht and ImmobilienScout24 around the clock, instantly applies to new listings matching your search filters, and optionally uses an LLM to write a personalised paragraph for each application. Choose the backend that fits you: a local Gemma 3 4B-IT model (no API costs, runs on your machine), or a hosted API β Google Gemini (Developer API key or Vertex AI) or OpenAI (e.g. GPT-5 nano).
Keywords: Wohnung Bot, WG Bot, apartment bot Germany, Wohnungssuche automatisieren, WG-Gesucht Bot, ImmobilienScout24 Bot, rental application automation, Mietwohnung Bot, automated apartment search Germany, Bewerbung automatisch senden
Disclaimer: Use at your own risk. Respect the platforms' terms of service. This tool is provided "as is" without warranty.
| Feature | Description |
|---|---|
| π Dual Platform | Supports both WG-Gesucht and ImmobilienScout24 |
| π Zero-Touch Loop | Scans search results every N minutes, applies to new listings automatically |
| π₯· Stealth Automation | Chrome with anti-detection patches, human-like typing & clicking |
| π« Smart Blacklisting | Auto-blocks sent listings, skips sponsored/agency ads, manual override lists |
| π§ AI Personalisation | Multi-provider LLM (local Gemma 3 4B-IT, Google Gemini, or OpenAI) generates a unique paragraph per listing (optional) |
| π Reply Tracking | CSV reports with π’/π‘/π΄ status for each application |
| β‘ Shared Pipeline | Single message template, LLM persona, and helper functions for both platforms |
miet-radar/
βββ config/ # User-editable configurations
β βββ .env # Secrets (credentials, URLs, HF token)
β βββ .env.example # Template for .env
β βββ llm_persona.txt # LLM prompt/identity (editable)
β βββ message.txt # Shared message template (both bots)
β βββ message.txt.example # Template for message.txt
β βββ wg_blacklist.txt # Manual blacklist for WG-Gesucht
β βββ wg_blacklist.txt.example # Template
β βββ immo_blacklist.txt # Manual blacklist for ImmoScout24
β βββ immo_blacklist.txt.example # Template
βββ data/ # Runtime data (auto-generated, DO NOT EDIT)
β βββ wg_diff.dat # Processed WG IDs
β βββ wg_sent_request.dat # WG audit log with timestamps
β βββ wg_replies_report.csv # WG reply tracker
β βββ wg_offer.json # WG scan snapshot
β βββ wgbot_profile/ # WG browser session cache
β βββ immo_diff.dat # Processed ImmoScout IDs
β βββ immo_sent_request.dat # ImmoScout audit log
β βββ immo_replies_report.csv # ImmoScout reply tracker
β βββ immo_offer.json # ImmoScout scan snapshot
β βββ immobot_profile/ # ImmoScout browser session cache
βββ src/ # Core Python application logic
β βββ wg-gesucht.py # Main loop β WG-Gesucht
β βββ submit_wg.py # WG browser automation & form submission
β βββ check_replies.py # WG reply tracker
β βββ immoscout.py # Main loop β ImmobilienScout24
β βββ submit_immo.py # IS24 browser automation & form submission
β βββ check_replies_immo.py # IS24 reply tracker
β βββ llm_personalizer.py # Shared LLM inference (Gemma 3 4B-IT, Gemini, OpenAI)
βββ tests/ # Tests (no live sends)
β βββ test_llm_personalizer.py # WG end-to-end test
β βββ test_immo.py # IS24 end-to-end test
β βββ test_stealth.py # Browser stealth validation
β βββ test_llm_only.py # Isolated LLM test
βββ scripts/
β βββ setup.sh # One-command setup script
βββ README.md
βββ requirements.txt
- Python 3.10+
- Google Chrome installed
git clone https://github.com/unik-w/MietRadar
cd miet-radar
bash scripts/setup.shThe setup script creates a virtual environment, installs all dependencies, and scaffolds config files from templates.
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp config/.env.example config/.env
cp config/message.txt.example config/message.txt-
Credentials β Edit
config/.env:- WG-Gesucht:
WG_EMAIL,WG_PASSWORD,WG_SEARCH_URLS - ImmoScout24:
IMMO_EMAIL,IMMO_PASSWORD,IMMO_SEARCH_URLSand personal details (IMMO_FIRST_NAME,IMMO_LAST_NAME, etc.) for the IS24 contact form. - (Optional)
HF_TOKENfor LLM Personalisation.
- WG-Gesucht:
-
Message Template β Edit
config/message.txt:- Use
{name}for the landlord's name (auto-filled) - Use
{LLM_TEXT}for the AI-generated paragraph (auto-filled when LLM is enabled)
- Use
-
LLM Persona (Optional) β Edit
config/llm_persona.txt: SetUSE_LLM_PERSONALIZATION=truein.envto enable. The persona auto-adapts to WG vs. apartment listings.Choose the LLM backend via
LLM_PROVIDERin.env:LLM_PROVIDERBackend Required .envvarsgemma_local(default)Local Gemma 3 4B-IT (HuggingFace + PyTorch, runs on your machine) HF_TOKENgeminiGoogle Gemini API β Developer API key or Vertex AI GEMINI_MODEL+ eitherGEMINI_API_KEYor (GOOGLE_GENAI_USE_VERTEXAI=true,GOOGLE_CLOUD_PROJECT,GOOGLE_CLOUD_LOCATION, andgcloud auth application-default login)openaiOpenAI API (e.g. GPT-5 nano) OPENAI_MODEL,OPENAI_API_KEYInstall the extra SDKs only for the backend(s) you use:
pip install google-genai(Gemini) and/orpip install openai(OpenAI).πΈ Free credits tip: new Google Cloud accounts get $300 in free credit (valid ~90 days), usable against Vertex AI usage β not just Gemini. Vertex AI's Model Garden also hosts third-party models (e.g. Anthropic Claude) and open-source models (Llama, Mistral, and others), so the same credit can be used to experiment with those too, not only Google's own models. To use Vertex AI instead of a plain Gemini API key:
- Install the gcloud CLI:
brew install --cask google-cloud-sdk(macOS) gcloud auth application-default login(one-time browser login)gcloud services enable aiplatform.googleapis.com --project=<your-project-id>- Set
GOOGLE_GENAI_USE_VERTEXAI=true,GOOGLE_CLOUD_PROJECT, andGOOGLE_CLOUD_LOCATIONin.env
Note: model availability varies by project/region on Vertex AI β if a model 404s, check the Model Garden for exact IDs enabled for your project, or try
location=globalfor newer preview models. - Install the gcloud CLI:
-
Blacklists:
config/wg_blacklist.txtβ paste WG-Gesucht URLs to ignoreconfig/immo_blacklist.txtβ paste ImmoScout expose IDs to ignore
On first run, the platform will likely show a CAPTCHA. The bot detects this and pauses β solve it manually in the browser window. Subsequent runs use saved session cookies from data/wgbot_profile/ or data/immobot_profile/.
source venv/bin/activate
python src/wg-gesucht.pysource venv/bin/activate
python src/immoscout.pyBoth bots run independently as continuous loops. They scan multiple search result pages, apply to new listings, update blacklists, and sleep for CHECK_INTERVAL_SECONDS (configurable in .env).
Generate a report of all sent applications and their reply status:
| Command | Report File |
|---|---|
python src/check_replies.py |
data/wg_replies_report.csv |
python src/check_replies_immo.py |
data/immo_replies_report.csv |
Status indicators:
- π’ Replied β host has responded
- π‘ Pending β no reply yet, sent < 3 days ago
- π΄ No Reply β no response after 3+ days
Test the full pipeline without sending any messages:
# WG-Gesucht β scrape + LLM personalisation
python tests/test_llm_personalizer.py --listings 3
# ImmobilienScout24 β scrape + LLM personalisation
python tests/test_immo.py --listings 3
# ImmoScout24 β template only, no LLM (fast scraping test)
python tests/test_immo.py --no-llm --listings 3
# Browser stealth validation
python tests/test_stealth.pyβββββββββββββββ ββββββββββββββββ βββββββββββββββββ ββββββββββββββββ
β Scan search βββββΆβ Filter: skip βββββΆβ Extract desc βββββΆβ Generate msg β
β result pagesβ β sponsored & β β + contact nameβ β (template + β
β (paginated) β β blacklisted β β from expose β β LLM paragraphβ
βββββββββββββββ ββββββββββββββββ βββββββββββββββββ ββββββββ¬ββββββββ
β
βΌ
ββββββββββββββββ
β Fill form & β
β send message β
β (stealth) β
ββββββββββββββββ
This project is an advanced evolution of the original immo repository by nickirk.
While MietRadar has been completely restructured and modernized with Python 3 support, dual-platform automation, Selenium stealth techniques, and LLM-based personalization, the original git history has been merged and preserved to ensure proper attribution to the foundational work of the original contributors.