ERT API — Referenz

REST-Schnittstelle des ERT-Systems (Electrical Resistivity Tomography): Authentifizierung, Surveys, Messwerte, Inversions-Tomogramme, Geräte und Konfigurationsprofile. Alle Antworten sind JSON.

Base URLhttps://ert.fabianschieder.com

Authentifizierung

Geschützte Endpunkte erwarten ein Bearer-Token im Authorization-Header. Das Token bekommst du über POST /login und ist 30 Tage gültig.

# 1) Anmelden und Token holen
curl -X POST https://ert.fabianschieder.com/login \
  -H "Accept: application/json" \
  -d '{"username":"dein-benutzer","password":"dein-passwort"}'
#  → {"token":"a1b2c3…"}

# 2) Token bei jeder geschützten Anfrage mitschicken
curl https://ert.fabianschieder.com/surveys \
  -H "Authorization: Bearer a1b2c3…" \
  -H "Accept: application/json"
i
Schick bei API-Aufrufen immer Accept: application/json mit. Anfragen mit Accept: text/html (also ein Browser) liefert der Server bewusst die Web-Oberfläche (ERT Cloud) statt JSON aus.

Konventionen

Einheitliches Format für Erfolg und Fehler.

Fehler-Antwort

{ "error": "invalid token" }

Status-Codes

200 OK 201 Created 400 Bad Request 401 Unauthorized 404 Not Found 409 Conflict 500 Server Error
!
Das Anlegen von Surveys, Messwerten und Inversionen läuft derzeit nicht über die API — diese Daten schreibt der Qt-Client direkt. Die API bietet dafür Lese-, Änderungs- und Lösch-Zugriff.

Auth & Account

POST/loginkein Token

Prüft Benutzername + Passwort und gibt ein 30-Tage-Token zurück.

Request Body

FeldTyp
usernamestringerforderlich
passwordstringerforderlich

Beispiel

curl -X POST …/login \
  -d '{"username":"dein-benutzer",
       "password":"dein-passwort"}'

200 OK

{ "token": "a1b2c3d4…" }
401 login failed
POST/logoutToken

Widerruft das aktuell verwendete Token (Logout).

200 OK

{ "ok": true }
POST/userkein Token

Registriert einen neuen Benutzer.

Request Body

FeldTyp
usernamestringerforderlich
emailstringerforderlich
passwordstringerforderlich

201 Created

{ "id": 5 }

Fehler

409 username or email already taken
GET/userToken

Liefert den eigenen Account (des Token-Inhabers).

200 OK

{
  "id": 3,
  "username": "admin",
  "email": "admin@email.com",
  "created_at": "2026-08-02 18:37:18"
}
PATCH/userToken

Ändert E-Mail und/oder Passwort des eigenen Accounts. Mindestens ein Feld nötig.

Request Body

FeldTyp
emailstringoptional
passwordstringoptional

Beispiel

curl -X PATCH …/user \
  -H "Authorization: Bearer …" \
  -d '{"email":"neu@mail.com"}'

Antwort

{ "ok": true }
400 nothing to update

Daten

GET/statsToken

Kennzahlen des eigenen Accounts – für das Dashboard.

200 OK

{
  "surveys": 2,
  "surveys_running": 1,
  "readings": 515,
  "inversions": 1,
  "config_profiles": 1
}
GET/surveysToken

Liste aller eigenen Surveys, inkl. Gerätebezeichnung sowie Anzahl Messwerte und Inversionen.

200 OK

[
  {
    "id": 1, "name": "Baugrund Nord – Profil 1",
    "site": "Grundstück Nord", "scheme": "wenner",
    "latitude": "48.208170", "longitude": "16.373820",
    "electrode_count": 48, "electrode_spacing_m": 1,
    "status": "finished", "started_at": "2026-08-23 00:06:28",
    "device_label": "Feldgerät A", "device_serial": "ERT-DEMO-001",
    "reading_count": 360, "inversion_count": 1
  }
]
GET/surveys/:idToken

Ein Survey im Detail: Stammdaten, alle Messwerte und die Liste der Inversionen. Nur der Besitzer erhält Zugriff, sonst 404.

200 OK

{
  "survey": { "id": 1, "name": "Baugrund Nord – Profil 1", "notes": "…", … },
  "readings": [ { "sequence_no": 1, "apparent_resistivity_ohmm": 118.4, … } ],
  "inversions": [ { "id": 1, "algorithm": "Gauss-Newton", "rms_error": 3.74, … } ]
}
GET/surveys/:id/readingsToken

Nur die Messwerte eines Surveys (ohne Stammdaten/Inversionen) – nützlich für Diagramme.

200 OK

[
  {
    "sequence_no": 1, "elec_a": 1, "elec_b": 4, "elec_m": 2, "elec_n": 3,
    "injected_current_ma": 50.2, "voltage_mv": 31.9,
    "apparent_resistivity_ohmm": 118.4, "geometric_factor_k": 6.28,
    "x_position_m": 2.5, "pseudo_depth_m": 0.52, "is_valid": 1
  }
]
PATCH/surveys/:idToken

Ändert Felder eines eigenen Surveys. Nur übergebene Felder werden geschrieben.

Änderbare Felder

FeldTyp
namestring
sitestring
notesstring
statusrunning | finished | aborted
latitudedecimal
longitudedecimal

Beispiel

curl -X PATCH …/surveys/1 \
  -H "Authorization: Bearer …" \
  -d '{"status":"finished",
       "notes":"geprüft"}'

Antwort

{ "ok": true }
400 nothing to update404
DELETE/surveys/:idToken

Löscht ein eigenes Survey samt aller Messwerte und Inversionen (Cascade).

200 OK

{ "ok": true }
404 not found / nicht Besitzer
GET/inversions/:idToken

Eine Inversion mit dem kompletten Zellengitter (Tomogramm). Besitz wird über das zugehörige Survey geprüft.

200 OK

{
  "inversion": {
    "id": 1, "survey_id": 1, "algorithm": "Gauss-Newton (smooth)",
    "iterations": 6, "rms_error": 3.74, "palette": "viridis",
    "value_min": 12, "value_max": 520
  },
  "cells": [ { "x_m": 0, "z_m": 0, "resistivity_ohmm": 119.7 }, … ]
}
GET/devicesToken

Alle registrierten Messgeräte (Hardware ist geteilt, nicht benutzergebunden).

200 OK

[
  {
    "id": 1, "serial_number": "ERT-DEMO-001", "label": "Feldgerät A",
    "firmware_version": "2.3.1", "electrode_count": 48
  }
]
GET/config_profilesToken

Eigene Konfigurationsprofile (Messeinstellungen). Einzelnes Profil via /config_profiles/:id.

200 OK

[
  {
    "id": 1, "name": "Standard Wenner 1m", "electrode_spacing_m": 1,
    "acquisition_samples": 512, "settling_time_ms": 120,
    "gain_target": 0.6, "gain_low_threshold": 0.15, …
  }
]
PATCH/config_profiles/:idToken

Ändert ein eigenes Profil. Änderbar sind u. a. name, device_id, electrode_spacing_m, acquisition_samples, preview_samples, settling_time_ms, state_timeout_ms, sämtliche gain_*-Schwellen, warn_duration_ms, warn_frequency_hz, active_electrode_mask.

Beispiel

curl -X PATCH …/config_profiles/1 \
  -H "Authorization: Bearer …" \
  -d '{"gain_target":0.7,
       "acquisition_samples":1024}'

Antwort

{ "ok": true }
400404
DELETE/config_profiles/:idToken

Löscht ein eigenes Konfigurationsprofil.

200 OK

{ "ok": true }
404 not found