Automatically updated DNS blocklist of fraudulent webshops and merchants Based on the official list published by the Dutch National Police.
The Dutch National Police publishes a public list of webshops and merchants flagged as fraudulent. This project scrapes that list daily via GitHub Actions and converts it into a DNS blocklist ready for use in AdGuard Home, Pi-hole, NextDNS, and other DNS-level filters.
politie.nl → Python scraper → GitHub Actions (06:00 UTC) → GitHub Gist → your DNS filter
Add the following URL as a custom blocklist:
https://gist.githubusercontent.com/Sjeff/b215b0c5e12c6d5ac725f618e2111c32/raw/politie-malafide-blocklist.txt
Steps:
- Open AdGuard Home → Filters → DNS Blocklists
- Click Add Blocklist
- Paste the URL above
- Save and restart if prompted
- Go to Settings → Adlists
- Add the URL
- Click Update Gravity
The list uses the Adblock Plus format (||domain.nl^) and is compatible with all common DNS-level blockers.
| Property | Value |
|---|---|
| Frequency | Every day |
| Time | 06:00 UTC |
| Lag after change on politie.nl | ≤ 24 hours |
| Manual trigger | Available via the Actions tab |
| Change detection | Gist is only updated when new entries are detected |
The GitHub Actions workflow runs on ubuntu-latest with Python 3.10 and automatically installs the required dependencies (requests, beautifulsoup4). Unit tests run before each scrape — if a test fails, the Gist is not updated.
politie-malafide-blocklist/
├── .github/
│ └── workflows/
│ └── update-blocklist.yml # GitHub Actions workflow (daily, 06:00 UTC)
├── update_blocklist.py # Scraper + Gist updater
├── test_update_blocklist.py # Unit tests (domain validation, blocklist format)
└── readme.md
| Secret | Description |
|---|---|
GIST_TOKEN |
GitHub Personal Access Token with gist scope |
GIST_ID |
ID of the target Gist (leave empty on first run — created automatically) |
- Fork this repository
- Create a GitHub Personal Access Token with the
gistscope - Add
GIST_TOKENas a repository secret - Leave
GIST_IDempty on first run — the script will create a new Gist and print its ID - Add the printed
GIST_IDas a repository secret - Subsequent runs will only update the Gist when changes are detected
The generated blocklist follows the Adblock Plus 2.0 format:
[Adblock Plus 2.0]
! Title: Politie.nl Malafide Handelspartijen
! Description: Blokkeerlijst van malafide webshops volgens politie.nl
! Homepage: https://www.politie.nl/...
! Total entries: <count>
!
||fraudulent-shop.nl^
||scammer.com^
...
pip install requests beautifulsoup4 pytest
pytest test_update_blocklist.py -vTests cover domain validation logic and blocklist content formatting. No network calls are made during tests.
All data is sourced from politie.nl. This project is not affiliated with or endorsed by the Dutch National Police.
The list is generated automatically from public government data. Always verify the trustworthiness of a webshop independently before making a purchase.
This project was built in collaboration with Claude by Anthropic. Claude assisted with the scraper design, GitHub Actions workflow, Gist integration, and this documentation.
Data is sourced from a public government source. The code and automation are free to use.