SiberGuvenlik Baskanligi Blocklist API
Exploit / Project Details
An open-source tool that mirrors Turkey's Cybersecurity Directorate (T.C. Siber Güvenlik Başkanlığı) threat-intelligence feeds as firewall-ready blocklists — five address types, time-windowed lists (30/60/90/120 days and full), refreshed hourly by GitHub Actions with no server required. Nearly 483,000 records ready to drop straight into pfSense, OPNsense, MikroTik, Pi-hole, ipset, and Squid.
Detailed Write-up
Project Overview
SiberGüvenlik Başkanlığı — Blocklist API is an open-source tool that pulls five address types (domain, url, ip, ip6, ip6net) from the public API of Turkey's Cybersecurity Directorate (siberguvenlik.gov.tr), stores each record with its original date, and regenerates time-windowed, firewall-ready blocklists on every run.
Note: This is an unofficial, community-maintained mirror of the T.C. Siber Güvenlik Başkanlığı feeds. All data is sourced from the official public API.
No server required. A GitHub Actions workflow runs hourly, commits the refreshed lists to data/, and your firewall consumes them directly from raw GitHub URLs.
Live Record Counts
The table below is regenerated automatically on every bot commit — it shows the real, post-filtering line counts of the published lists for each time window (30/60/90/120 days and full):
| Type | 30d | 60d | 90d | 120d | Full |
|---|---|---|---|---|---|
| 🌐 Domain | 4,571 | 8,761 | 14,325 | 19,520 | 460,771 |
| 🔗 URL | 0 | 0 | 0 | 0 | 6,927 |
| 📡 IPv4 | 294 | 675 | 1,050 | 1,244 | 14,966 |
| 🧭 IPv6 | 0 | 0 | 0 | 0 | 6 |
| 🕸️ IPv6 Net | 0 | 0 | 0 | 0 | 0 |
| Total | 4,865 | 9,436 | 15,375 | 20,764 | 482,670 |
Output Files
Each address type is kept in its own file, per time window (data/ directory):
| Window | Domains | URLs | IPv4 | IPv6 | IPv6 Nets |
|---|---|---|---|---|---|
| All time | full-domains.txt |
full-urls.txt |
full-ips.txt |
full-ip6.txt |
full-ip6net.txt |
| Last 30 days | days-30-domains.txt |
days-30-urls.txt |
days-30-ips.txt |
days-30-ip6.txt |
days-30-ip6net.txt |
| Last 60 days | days-60-domains.txt |
days-60-urls.txt |
days-60-ips.txt |
days-60-ip6.txt |
days-60-ip6net.txt |
| Last 90 days | days-90-domains.txt |
days-90-urls.txt |
days-90-ips.txt |
days-90-ip6.txt |
days-90-ip6net.txt |
| Last 120 days | days-120-domains.txt |
days-120-urls.txt |
days-120-ips.txt |
days-120-ip6.txt |
days-120-ip6net.txt |
One entry per line, no quotes, no surrounding whitespace, LF line endings. Domains sorted alphabetically, IPs sorted numerically. database-*.jsonl (split into 250,000-record shards) and _state.json are internal bookkeeping files; firewalls should ignore them.
Firewall Usage
Consume the lists straight from raw GitHub URLs:
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/full-domains.txt
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/days-30-domains.txt
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/full-ips.txt
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/full-urls.txt
Compatible with pfSense, OPNsense, MikroTik, ipset, Pi-hole, Squid, and similar systems.
How It Works
- First run (no full lists present): a full crawl begins for all types. Each type is fetched with
per-page=1000(~481 pages total). At 5–12 s/page the initial seed completes in ~1–2 hours. - After the full crawl: each hourly run does a fast incremental update — only new pages per type are fetched — then the lists are regenerated.
- Every 7 days: a full re-crawl runs to detect entries removed at the source. Removed records are appended to
data/removed.log.
Ageing logic: Lists are derived from the database + current clock on every run. A record that turns 31 days old drops out of days-30-* but remains in days-60-*, days-90-*, days-120-*, and full-*. No entry is ever lost from the wider windows.
Configuration
| Variable | Default | Description |
|---|---|---|
MIN_DELAY / MAX_DELAY |
5 / 12 |
Seconds between pages during the full crawl |
INC_MIN_DELAY / INC_MAX_DELAY |
2 / 6 |
Seconds between pages during incremental |
TIME_BUDGET_SECONDS |
18000 |
Checkpoint the full crawl after this many seconds |
FULL_RESYNC_DAYS |
7 |
Re-crawl everything this often to detect removals (0 = off) |
INCREMENTAL_MAX_PAGES |
50 |
Safety cap for incremental pages per type per run |
PER_PAGE |
1000 |
Records per API page (max supported by the API) |
DATA_DIR |
data |
Output directory |
USER_AGENT |
Chrome/138 | Request User-Agent |
Installation & Running
Docker (optional) — not needed if you use GitHub Actions. To run on your own server:
docker compose up -d --build
docker compose logs -f
Local run (no Docker):
pip install -r scraper/requirements.txt
DATA_DIR=data python scraper/fetch.py
GitHub Actions: .github/workflows/update-lists.yml runs every hour. First runs perform the resumable full crawl; once complete, each hourly run is a fast incremental update and refreshes the live counts in the README.
API Source
All data is sourced from the official public API:
GET https://siberguvenlik.gov.tr/api/address/index?type={domain|url|ip|ip6|ip6net}&page={n}&per-page=1000
API documentation: https://siberguvenlik.gov.tr/api/openapi.yaml
Tech stack: Python 3.12 · GitHub Actions (hourly) · Docker · JSONL database (250K-record shards) · Licensed under GPLv3
Project Overview
SiberGüvenlik Başkanlığı — Blocklist API is an open-source tool that pulls five address types (domain, url, ip, ip6, ip6net) from the public API of Turkey's Cybersecurity Directorate (siberguvenlik.gov.tr), stores each record with its original date, and regenerates time-windowed, firewall-ready blocklists on every run.
Note: This is an unofficial, community-maintained mirror of the T.C. Siber Güvenlik Başkanlığı feeds. All data is sourced from the official public API.
No server required. A GitHub Actions workflow runs hourly, commits the refreshed lists to data/, and your firewall consumes them directly from raw GitHub URLs.
Live Record Counts
The table below is regenerated automatically on every bot commit — it shows the real, post-filtering line counts of the published lists for each time window (30/60/90/120 days and full):
| Type | 30d | 60d | 90d | 120d | Full |
|---|---|---|---|---|---|
| 🌐 Domain | 4,571 | 8,761 | 14,325 | 19,520 | 460,771 |
| 🔗 URL | 0 | 0 | 0 | 0 | 6,927 |
| 📡 IPv4 | 294 | 675 | 1,050 | 1,244 | 14,966 |
| 🧭 IPv6 | 0 | 0 | 0 | 0 | 6 |
| 🕸️ IPv6 Net | 0 | 0 | 0 | 0 | 0 |
| Total | 4,865 | 9,436 | 15,375 | 20,764 | 482,670 |
Output Files
Each address type is kept in its own file, per time window (data/ directory):
| Window | Domains | URLs | IPv4 | IPv6 | IPv6 Nets |
|---|---|---|---|---|---|
| All time | full-domains.txt |
full-urls.txt |
full-ips.txt |
full-ip6.txt |
full-ip6net.txt |
| Last 30 days | days-30-domains.txt |
days-30-urls.txt |
days-30-ips.txt |
days-30-ip6.txt |
days-30-ip6net.txt |
| Last 60 days | days-60-domains.txt |
days-60-urls.txt |
days-60-ips.txt |
days-60-ip6.txt |
days-60-ip6net.txt |
| Last 90 days | days-90-domains.txt |
days-90-urls.txt |
days-90-ips.txt |
days-90-ip6.txt |
days-90-ip6net.txt |
| Last 120 days | days-120-domains.txt |
days-120-urls.txt |
days-120-ips.txt |
days-120-ip6.txt |
days-120-ip6net.txt |
One entry per line, no quotes, no surrounding whitespace, LF line endings. Domains sorted alphabetically, IPs sorted numerically. database-*.jsonl (split into 250,000-record shards) and _state.json are internal bookkeeping files; firewalls should ignore them.
Firewall Usage
Consume the lists straight from raw GitHub URLs:
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/full-domains.txt
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/days-30-domains.txt
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/full-ips.txt
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/full-urls.txt
Compatible with pfSense, OPNsense, MikroTik, ipset, Pi-hole, Squid, and similar systems.
How It Works
- First run (no full lists present): a full crawl begins for all types. Each type is fetched with
per-page=1000(~481 pages total). At 5–12 s/page the initial seed completes in ~1–2 hours. - After the full crawl: each hourly run does a fast incremental update — only new pages per type are fetched — then the lists are regenerated.
- Every 7 days: a full re-crawl runs to detect entries removed at the source. Removed records are appended to
data/removed.log.
Ageing logic: Lists are derived from the database + current clock on every run. A record that turns 31 days old drops out of days-30-* but remains in days-60-*, days-90-*, days-120-*, and full-*. No entry is ever lost from the wider windows.
Configuration
| Variable | Default | Description |
|---|---|---|
MIN_DELAY / MAX_DELAY |
5 / 12 |
Seconds between pages during the full crawl |
INC_MIN_DELAY / INC_MAX_DELAY |
2 / 6 |
Seconds between pages during incremental |
TIME_BUDGET_SECONDS |
18000 |
Checkpoint the full crawl after this many seconds |
FULL_RESYNC_DAYS |
7 |
Re-crawl everything this often to detect removals (0 = off) |
INCREMENTAL_MAX_PAGES |
50 |
Safety cap for incremental pages per type per run |
PER_PAGE |
1000 |
Records per API page (max supported by the API) |
DATA_DIR |
data |
Output directory |
USER_AGENT |
Chrome/138 | Request User-Agent |
Installation & Running
Docker (optional) — not needed if you use GitHub Actions. To run on your own server:
docker compose up -d --build
docker compose logs -f
Local run (no Docker):
pip install -r scraper/requirements.txt
DATA_DIR=data python scraper/fetch.py
GitHub Actions: .github/workflows/update-lists.yml runs every hour. First runs perform the resumable full crawl; once complete, each hourly run is a fast incremental update and refreshes the live counts in the README.
API Source
All data is sourced from the official public API:
GET https://siberguvenlik.gov.tr/api/address/index?type={domain|url|ip|ip6|ip6net}&page={n}&per-page=1000
API documentation: https://siberguvenlik.gov.tr/api/openapi.yaml
Tech stack: Python 3.12 · GitHub Actions (hourly) · Docker · JSONL database (250K-record shards) · Licensed under GPLv3
Proje Özeti
SiberGüvenlik Başkanlığı — Blocklist API, https://siberguvenlik.gov.tr/api/address/index adresindeki genel API'den beş farklı adres tipini (domain, url, ip, ip6, ip6net) çeken, her kaydı orijinal tarihiyle bir veritabanında saklayan ve her çalışmada zaman penceresine göre güncel, güvenlik duvarına hazır blocklist'ler üreten açık kaynaklı bir araçtır.
Not: Bu, T.C. Siber Güvenlik Başkanlığı'nın resmî olmayan, topluluk tarafından bakımı yapılan bir yansıma (mirror) aracıdır. Tüm veriler resmî genel API'den alınır.
Sunucu gerekmez. GitHub Actions saatlik olarak çalışır, yenilenen listeleri data/ klasörüne commit eder; güvenlik duvarınız listeleri doğrudan ham GitHub URL'sinden çekebilir.
Canlı Kayıt Sayıları
Aşağıdaki tablo her bot commit'inde otomatik güncellenir ve her zaman penceresindeki yayınlanan listelerin gerçek, filtreleme sonrası satır sayılarını gösterir:
| Tip | 30g | 60g | 90g | 120g | Full |
|---|---|---|---|---|---|
| 🌐 Domain | 4.571 | 8.761 | 14.325 | 19.520 | 460.771 |
| 🔗 URL | 0 | 0 | 0 | 0 | 6.927 |
| 📡 IPv4 | 294 | 675 | 1.050 | 1.244 | 14.966 |
| 🧭 IPv6 | 0 | 0 | 0 | 0 | 6 |
| 🕸️ IPv6 Ağ | 0 | 0 | 0 | 0 | 0 |
| Toplam | 4.865 | 9.436 | 15.375 | 20.764 | 482.670 |
Çıktı Dosyaları
Her adres tipi ayrı bir dosyada, her zaman penceresi için ayrı ayrı tutulur (data/ klasörü):
| Pencere | Domainler | URL'ler | IPv4 | IPv6 | IPv6 Ağları |
|---|---|---|---|---|---|
| Tüm zamanlar | full-domains.txt |
full-urls.txt |
full-ips.txt |
full-ip6.txt |
full-ip6net.txt |
| Son 30 gün | days-30-domains.txt |
days-30-urls.txt |
days-30-ips.txt |
days-30-ip6.txt |
days-30-ip6net.txt |
| Son 60 gün | days-60-domains.txt |
days-60-urls.txt |
days-60-ips.txt |
days-60-ip6.txt |
days-60-ip6net.txt |
| Son 90 gün | days-90-domains.txt |
days-90-urls.txt |
days-90-ips.txt |
days-90-ip6.txt |
days-90-ip6net.txt |
| Son 120 gün | days-120-domains.txt |
days-120-urls.txt |
days-120-ips.txt |
days-120-ip6.txt |
days-120-ip6net.txt |
Her dosya: satır başına bir kayıt, tırnak yok, boşluk yok, LF satır sonu. Domain'ler alfabetik, IP'ler sayısal sıralı. database-*.jsonl (250.000 kayıtlık parçalar) ve _state.json dahili kayıt dosyalarıdır; güvenlik duvarları bunları görmezden gelir.
Güvenlik Duvarı Kullanımı
Listeleri doğrudan ham GitHub URL'sinden çekin:
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/full-domains.txt
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/days-30-domains.txt
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/full-ips.txt
https://raw.githubusercontent.com/Tagoletta/SiberGuvenlikBaskanligi-API/main/data/full-urls.txt
pfSense, OPNsense, MikroTik, ipset, Pi-hole, Squid ve benzeri sistemlerle uyumludur.
Nasıl Çalışır?
- İlk çalışma (henüz full liste yok): tüm tipler için tam tarama başlar. Her tip
per-page=1000parametresiyle çekilir (toplam ~481 sayfa). Ortalama 5–12 s/sayfa hızıyla ilk tarama ~1–2 saatte tamamlanır. - Tam tarama sonrası: her saatlik çalışmada yalnızca yeni sayfalar çekilir (incremental) ve listeler yeniden üretilir.
- Her 7 günde bir: kaynaktan silinen kayıtları yakalamak için tam yeniden tarama yapılır. Silinen kayıtlar
data/removed.logdosyasına eklenir.
Yaşlandırma mantığı: Listeler her çalışmada veritabanı + güncel saat üzerinden türetilir. 31 günlük olan bir kayıt days-30-*'dan düşer ama days-60-*, days-90-*, days-120-* ve full-*'da kalmaya devam eder. Hiçbir kayıt geniş pencerelerden kaybolmaz.
Yapılandırma
| Değişken | Varsayılan | Açıklama |
|---|---|---|
MIN_DELAY / MAX_DELAY |
5 / 12 |
Tam tarama sırasında sayfalar arası saniye |
INC_MIN_DELAY / INC_MAX_DELAY |
2 / 6 |
Incremental sırasında sayfalar arası saniye |
TIME_BUDGET_SECONDS |
18000 |
Tam taramayı bu süre sonunda checkpoint'le |
FULL_RESYNC_DAYS |
7 |
Silinenleri yakalamak için tam yeniden tarama periyodu (0 = kapalı) |
INCREMENTAL_MAX_PAGES |
50 |
Çalışma başına tip başına incremental sayfa güvenlik sınırı |
PER_PAGE |
1000 |
API sayfa başına kayıt (API'nin desteklediği maksimum) |
DATA_DIR |
data |
Çıktı klasörü |
USER_AGENT |
Chrome/138 | İstek User-Agent'ı |
Kurulum ve Çalıştırma
Docker (isteğe bağlı): GitHub Actions kullanıyorsanız Docker gerekmez. Kendi sunucunuzda çalıştırmak için:
docker compose up -d --build
docker compose logs -f
Docker'sız yerel çalıştırma:
pip install -r scraper/requirements.txt
DATA_DIR=data python scraper/fetch.py
GitHub Actions: .github/workflows/update-lists.yml her saat çalışır. İlk çalışmalar devam ettirilebilir tam taramayı yapar; tamamlandıktan sonra her saatlik çalışma hızlı bir incremental güncellemedir ve README'deki canlı sayıları tazeler.
Veri Kaynağı
Tüm veriler resmî genel API'den alınır:
GET https://siberguvenlik.gov.tr/api/address/index?type={domain|url|ip|ip6|ip6net}&page={n}&per-page=1000
API dokümantasyonu: https://siberguvenlik.gov.tr/api/openapi.yaml
Teknoloji: Python 3.12 · GitHub Actions (saatlik) · Docker · JSONL veritabanı (250K kayıtlık parçalar) · GPLv3 lisansı