Besucherstatistik
Serverseitig gezählte Seitenaufrufe je Website (ohne Cookies; Verfahren im Handbuch).
GET /stats?root_id={id}&from=JJJJ-MM-TT&to=JJJJ-MM-TT 🔑
Ohne from/to die letzten 30 Tage, ohne root_id die Website zur Domain der Anfrage; root_id=0 bzw. all fasst alle Websites zusammen (pages dann je Website getrennt, mit root_id). Frisch gezählte Aufrufe werden vorher geschrieben.
{
"views": 2475, "visitors": 825, "first_day": "2026-09-07", "last_day": "2026-10-06", "has_data": true,
"days": [{ "day": "2026-10-06", "views": 36, "visitors": 12 }],
"pages": [{ "root_id": 1, "name": "/", "views": 1642, "visitors": 825 }],
"dims": {
"referrer": [{ "name": "google.com", "visitors": 6 }, { "name": "(direkt)", "visitors": 3 }],
"browser": [{ "name": "Chrome", "visitors": 6 }], "os": [{ "name": "Windows", "visitors": 3 }], "device": [{ "name": "Desktop", "visitors": 6 }],
"country": [{ "name": "DE", "visitors": 5 }, { "name": "(unbekannt)", "visitors": 1 }]
},
"downloads": [{ "root_id": 1, "name": "/media/downloads/preisliste.pdf", "views": 28, "visitors": 25 }],
"downloads_total": 44
}
visitors ist die Summe der eindeutigen Besucher je Tag; pages und jede Liste in dims höchstens 50 Einträge – außer country (vollständig, für die Karte). country enthält ISO-3166-Ländercodes (Registrierungsland der IP, siehe Länderdaten), (unbekannt) z. B. für private Adressen; leer, solange keine Länderdaten geladen oder sie abgeschaltet sind.
downloads: Datei-Downloads je Pfad, häufigste zuerst (höchstens 50; views = Downloads, visitors = eindeutige Besucher je Datei und Tag, summiert), downloads_total die Summe aller. Gezählt werden erfolgreiche Abrufe (200, 206, 304) unter /media/… außer Bildern, Schriften, CSS/JS/JSON, eingebetteten Abrufen (Sec-Fetch-Dest image, font, style, script, audio, video, embed, object, iframe …) und Folge-Teilabrufen (Range nicht ab Byte 0); Bots, Prefetch und angemeldete Admins wie bei Seiten. Website = Domain der Anfrage. Downloads zählen nicht zu views/visitors/days.
GET /stats/export?root_id={id}&from=JJJJ-MM-TT&to=JJJJ-MM-TT 🔑
Alle Tageswerte des Zeitraums als CSV (UTF-8 mit BOM, Trennzeichen Semikolon) – Parameter wie bei GET /stats. Spalten Datum;Website;Art;Name;Aufrufe;Besucher, eine Zeile je Tag, Website und
| Art | Name | Aufrufe |
|---|---|---|
Gesamt |
leer | ja |
Seite |
Pfad | ja |
Herkunft, Browser, Betriebssystem, Gerät, Land |
Wert (Land als ISO-Code) | leer – Merkmale zählen nur Besucher |
Download |
Pfad der Datei (/media/…) |
Anzahl Downloads |
Sortiert nach Datum, Website, Art und Aufrufen bzw. Besuchern. Besucher sind eindeutige Besucher des Tages – über mehrere Tage summiert zählt ein wiederkehrender Besucher mehrfach (wie visitors in GET /stats).
DELETE /stats?root_id={id} ✏️
Löscht die Statistik der Website.
Länderdaten
Für die Dimension country ordnet der Server die IP beim Zählen einem Land zu – anhand der Vergabelisten der fünf RIRs (delegated-*-extended-latest von AFRINIC, APNIC, ARIN, LACNIC, RIPE NCC), lokal in der Datenbank, nicht in Bundles oder Backups. Der Nachtlauf gleicht sie wöchentlich ab (ab 3 Uhr, mit ETag/If-Modified-Since; nach einem Fehler in der folgenden Nacht), ohne Daten gleich nach dem Start und dann stündlich. Schlägt eine Liste fehl, bleiben ihre bisherigen Daten.
GET /geo 🔑
{
"enabled": true, "running": false, "ranges": 212243, "updated_at": 1791354517, "checked_at": 1791354548,
"sources": [{ "rir": "ripencc", "ranges": 106330, "updated_at": 1791354517, "checked_at": 1791354548, "error": "" }]
}
ranges = zusammengefasste Adressbereiche im Speicher; updated_at/checked_at (Unix-Sekunden) = Daten zuletzt ersetzt bzw. zuletzt abgefragt.
PUT /geo ✏️
{ "enabled": false } schaltet die Länder ab (kein Erfassen, kein Abgleich; gespeichert), true wieder an. Antwort wie GET /geo.
POST /geo/update ✏️
Startet den Abgleich im Hintergrund – 202 mit dem Stand (running: true), 409, wenn schon einer läuft. Den Fortschritt per GET /geo abfragen.
POST /geo/upload ✏️
Für Server ohne Internetzugang: multipart/form-data mit einem oder mehreren Feldern file (die Vergabelisten, auch gzip-komprimiert). Die Registry steht in der Kopfzeile der Datei. Antwort wie GET /geo, 400 bei einer unbekannten Datei.