API-Schnittstelle
Überblick
Zusätzlich kann die REST-API als API-Export verwendet werden diese gibt Ihnen die Möglichkeit, Ihre Prüfmitteldaten jederzeit aus memida abzurufen. Sie entscheiden, wann, wie oft und welche Daten Sie exportieren, einzelne Prüfmittel, ganze Listen oder gezielt Dokumente wie Kalibrierscheine und Prüfprotokolle.
Während der JSON-Export und der VDI-2623-Export den gesamten Datenbestand als ZIP-Archiv bereitstellen, bietet die API selektiven Zugriff in Echtzeit, ohne tägliche Limits.
Voraussetzungen
Für den einen Export über dei API müssen Sie die APi in Ihrem Paket freigeschaltet haben. Nutzen Sie für eine ausführliche Vorbereitung wie man die REST API verwendet unsere API-Referenz.
Praxisbeispiele
Die folgenden Beispiele zeigen typische Export-Szenarien. Klappen Sie ein Beispiel auf, um den vollständigen Code zu sehen.
Alle Prüfmittel exportieren (Bash / cURL)
Dieses Skript liest alle Prüfmittel seitenweise aus der API und speichert sie in einer JSON-Datei.
#!/bin/bash
# Alle Prüfmittel über die API exportieren
API_KEY="live XXXXXXXXXXXXXXXXXXXXXXX"
BASE_URL="https://api.memida.de"
OUTPUT_FILE="apparatuses_export.json"
PAGE=1
LIMIT=100
ALL_DATA="[]"
while true; do
RESPONSE=$(curl -s \
-H "Auth: $API_KEY" \
-H "Accept: application/json" \
"$BASE_URL/api/v1/apparatuses?limit=$LIMIT&page=$PAGE")
# Daten aus der Antwort extrahieren
DATA=$(echo "$RESPONSE" | jq '.data')
PAGE_COUNT=$(echo "$RESPONSE" | jq '.paginator.pageCount')
# Daten zusammenführen
ALL_DATA=$(echo "$ALL_DATA $DATA" | jq -s '.[0] + .[1]')
echo "Seite $PAGE von $PAGE_COUNT exportiert"
# Prüfen, ob letzte Seite erreicht
if [ "$PAGE" -ge "$PAGE_COUNT" ]; then
break
fi
PAGE=$((PAGE + 1))
done
echo "$ALL_DATA" | jq '.' > "$OUTPUT_FILE"
echo "Export abgeschlossen: $(echo "$ALL_DATA" | jq 'length') Prüfmittel in $OUTPUT_FILE"
Einzelnes Prüfmittel mit Prüfhistorie abrufen (Python)
Ruft ein Prüfmittel über seine Identifikationsnummer ab – inklusive Prüfungen, Prüfpläne und Kommentare.
import requests
API_KEY = "live XXXXXXXXXXXXXXXXXXXXXXX"
BASE_URL = "https://api.memida.de"
IDENTNO = "PM-2024-001"
headers = {
"Auth": API_KEY,
"Accept": "application/json"
}
response = requests.get(
f"{BASE_URL}/api/v1/apparatuses/identno/{IDENTNO}",
headers=headers
)
if response.status_code == 200:
apparatus = response.json()["data"]
print(f"Prüfmittel: {apparatus['apparatus_fullname']}")
print(f"Status: {apparatus['status']}")
print(f"Identnr: {apparatus['identno']}")
print(f"Seriennr: {apparatus.get('serial_number', '–')}")
print(f"Nächste Prüfung: {apparatus.get('next_check_at', '–')}")
for inspection in apparatus.get("inspections", []):
result = inspection["inspection_result"]["name"]
checked = inspection["checked_at"]
insp_type = inspection.get("inspection_type", {})
type_name = insp_type.get("name", "–") if insp_type else "–"
print(f" Prüfung: {type_name} am {checked} → {result}")
elif response.status_code == 404:
print(f"Prüfmittel mit Identnr '{IDENTNO}' nicht gefunden.")
else:
print(f"Fehler: {response.status_code}")
Beispielausgabe:
Prüfmittel: Druck DPI 620 Multifunktions-Druckkalibrator
Status: operational
Identnr: PM-2024-001
Seriennr: SN-123456
Nächste Prüfung: 2026-06-15
Prüfung: DAkkS-Kalibrierung am 2025-06-14T09:00:00+02:00 → operational
Fällige Prüfmittel ermitteln (Python)
Identifiziert alle Prüfmittel, deren nächster Prüftermin innerhalb der nächsten 30 Tage liegt – z. B. zur Audit-Vorbereitung.
import requests
from datetime import datetime, timedelta
API_KEY = "live XXXXXXXXXXXXXXXXXXXXXXX"
BASE_URL = "https://api.memida.de"
DAYS_AHEAD = 30
headers = {
"Auth": API_KEY,
"Accept": "application/json"
}
today = datetime.now().date()
deadline = today + timedelta(days=DAYS_AHEAD)
page = 1
due_items = []
while True:
response = requests.get(
f"{BASE_URL}/api/v1/apparatuses",
headers=headers,
params={"limit": 100, "page": page}
)
data = response.json()
for apparatus in data["data"]:
next_check = apparatus.get("next_check_at")
if next_check and apparatus.get("checkup"):
check_date = datetime.strptime(next_check, "%Y-%m-%d").date()
if today <= check_date <= deadline:
due_items.append({
"identno": apparatus["identno"],
"name": apparatus["apparatus_fullname"],
"next_check_at": next_check,
"days_remaining": (check_date - today).days
})
paginator = data["paginator"]
if page >= paginator["pageCount"]:
break
page += 1
due_items.sort(key=lambda x: x["days_remaining"])
print(f"\n{len(due_items)} Prüfmittel fällig in den nächsten {DAYS_AHEAD} Tagen\n")
for item in due_items:
print(f" [{item['days_remaining']:3d} Tage] {item['identno']:<15} {item['name']}")
Beispielausgabe:
======================================================================
3 Prüfmittel fällig in den nächsten 30 Tagen
======================================================================
[ 5 Tage] PM-2024-017 Fluke 8588A Digitalmultimeter
[ 12 Tage] PM-2024-003 Endress+Hauser Promag P300 Durchflussmessgerät
[ 28 Tage] PM-2024-042 Mettler Toledo XPR205 Analysenwaage
Kalibrierscheine herunterladen (Python)
Lädt alle Prüfdokumente (Kalibrierscheine, Protokolle) eines bestimmten Prüfmittels herunter.
import os
import requests
API_KEY = "live XXXXXXXXXXXXXXXXXXXXXXX"
BASE_URL = "https://api.memida.de"
APPARATUS_ID = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
DOWNLOAD_DIR = "./kalibrierscheine"
headers = {
"Auth": API_KEY,
"Accept": "application/json"
}
response = requests.get(
f"{BASE_URL}/api/v1/apparatuses/{APPARATUS_ID}",
headers=headers
)
apparatus = response.json()["data"]
os.makedirs(DOWNLOAD_DIR, exist_ok=True)
print(f"Lade Dokumente für: {apparatus['apparatus_fullname']}")
# Geräte-Dateien herunterladen
if apparatus.get("files"):
files = apparatus["files"] if isinstance(apparatus["files"], list) else [apparatus["files"]]
for file_info in files:
file_response = requests.get(
f"{BASE_URL}/api/v1/files/{file_info['id']}",
headers={"Auth": API_KEY}
)
if file_response.status_code == 200:
filepath = os.path.join(DOWNLOAD_DIR, file_info["name"])
with open(filepath, "wb") as f:
f.write(file_response.content)
print(f" ✓ {file_info['name']}")
# Prüfungs-Dateien herunterladen (Kalibrierscheine etc.)
for inspection in apparatus.get("inspections", []):
for file_info in inspection.get("files", []):
file_response = requests.get(
f"{BASE_URL}/api/v1/files/{file_info['id']}",
headers={"Auth": API_KEY}
)
if file_response.status_code == 200:
filepath = os.path.join(DOWNLOAD_DIR, file_info["name"])
with open(filepath, "wb") as f:
f.write(file_response.content)
print(f" ✓ {file_info['name']}")
print(f"\nAlle Dokumente in '{DOWNLOAD_DIR}' gespeichert.")
CSV-Export für Excel (Python)
Exportiert alle Prüfmittel als CSV-Datei, die direkt in Excel geöffnet werden kann.
import csv
import requests
API_KEY = "live XXXXXXXXXXXXXXXXXXXXXXX"
BASE_URL = "https://api.memida.de"
OUTPUT_FILE = "pruefmittel_export.csv"
headers = {
"Auth": API_KEY,
"Accept": "application/json"
}
CSV_COLUMNS = [
"identno", "apparatus_fullname", "serial_number",
"manufacturer_name", "status", "costcenter_name",
"next_check_at", "latest_checked",
"check_interval", "interval_unit", "apparatus_type_names",
]
page = 1
all_rows = []
while True:
response = requests.get(
f"{BASE_URL}/api/v1/apparatuses",
headers=headers,
params={"limit": 100, "page": page, "sort": "identno", "direction": "asc"}
)
data = response.json()
for apparatus in data["data"]:
row = {col: apparatus.get(col, "") for col in CSV_COLUMNS}
all_rows.append(row)
paginator = data["paginator"]
if page >= paginator["pageCount"]:
break
page += 1
with open(OUTPUT_FILE, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=CSV_COLUMNS, delimiter=";")
writer.writeheader()
writer.writerows(all_rows)
print(f"CSV-Export abgeschlossen: {len(all_rows)} Prüfmittel in '{OUTPUT_FILE}'")
Tipp: Das Encoding
utf-8-sigund das Semikolon als Trennzeichen sorgen dafür, dass die Datei in Microsoft Excel korrekt mit Umlauten und Spalten geöffnet wird.
Prüfmittelstatus-Zusammenfassung (JavaScript / Node.js)
const API_KEY = "live XXXXXXXXXXXXXXXXXXXXXXX";
const BASE_URL = "https://api.memida.de";
async function fetchStatusSummary() {
const statusCount = {};
let page = 1;
let totalPages = 1;
while (page <= totalPages) {
const response = await fetch(
`${BASE_URL}/api/v1/apparatuses?limit=100&page=${page}`,
{
headers: {
"Auth": API_KEY,
"Accept": "application/json"
}
}
);
const json = await response.json();
totalPages = json.paginator.pageCount;
for (const apparatus of json.data) {
const status = apparatus.status;
statusCount[status] = (statusCount[status] || 0) + 1;
}
page++;
}
console.log("\nPrüfmittelstatus-Übersicht:");
console.log("─".repeat(40));
const total = Object.values(statusCount).reduce((a, b) => a + b, 0);
for (const [status, count] of Object.entries(statusCount).sort((a, b) => b[1] - a[1])) {
const pct = ((count / total) * 100).toFixed(1);
console.log(` ${status.padEnd(22)} ${String(count).padStart(5)} (${pct}%)`);
}
console.log("─".repeat(40));
console.log(` ${"Gesamt".padEnd(22)} ${String(total).padStart(5)}`);
}
fetchStatusSummary();
Beispielausgabe:
Prüfmittelstatus-Übersicht:
────────────────────────────────────────
operational 285 (82.1%)
not_operational 23 (6.6%)
locked 18 (5.2%)
out_of_house 12 (3.5%)
decommissioned 9 (2.6%)
────────────────────────────────────────
Gesamt 347
Hinweise
- Ihre Daten, Ihr Zugriff: Die API steht Ihnen ohne tägliche Exportlimits zur Verfügung. Sie können Ihre Daten so oft und in dem Umfang abrufen, wie Sie es benötigen.
- Datumsformate: Alle Zeitstempel folgen ISO 8601 (z. B.
2026-02-11T14:30:00+01:00). Reine Datumsfelder verwendenYYYY-MM-DD. - Encoding: Alle Antworten sind UTF-8-kodiert.
- Dokumente: Kalibrierscheine, Prüfprotokolle und andere Dateien werden über
/api/v1/files/{file_id}als Binärdaten mit dem passenden Content-Type ausgeliefert. - Vollständige Referenz: Die detaillierte Beschreibung aller Felder, Statuswerte und Prüfergebnisse finden Sie in der API-Referenz.