API-Referenz

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.