Zum Inhalt springen

API-Dokumentation

Die gesamte Dokumentation wird direkt aus den Definitionen generiert, die die Engine ausführt.

OpenAPI-Spezifikation für automatische Integration: /api/v1/openapi.json

Authentifizierung

Senden Sie Ihren API-Schlüssel in einem der beiden akzeptierten Header. Beide sind absolut gleichwertig.

Authorization: Bearer nmd_live_xxxxxxxxxxxxxxxx
X-API-Key: nmd_live_xxxxxxxxxxxxxxxx

Schlüssel werden in Ihrem Dashboard generiert. Jeder Schlüssel wird nur ein einziges Mal angezeigt und als Hash gespeichert.

POST /api/v1/analyze

Liest jedes Metadatenfeld in der Datei aus und gibt ein normalisiertes Modell zurück.

curl -X POST https://your-domain/api/v1/analyze \
  -H "Authorization: Bearer $NMD_KEY" \
  -F "file=@photo.jpg"

Die Antwort gruppiert Felder nach Kategorien und bewahrt die ursprünglichen Rohwerte unter raw:

{
  "file": { "name": "photo.jpg", "format": "jpeg", "size": 4821904 },
  "counts": { "total": 31, "removable": 26, "sensitive": 16 },
  "blocks": { "exif": { "present": true, "count": 29 }, "gps": { "present": true } },
  "metadata": {
    "camera": {
      "camera.make": { "label": "Make", "value": "Apple", "sensitive": true, "removable": true }
    }
  }
}

POST /api/v1/clean

Entfernt Metadaten und untersucht die erzeugten Bytes erneut, um das Resultat zu verifizieren. Gibt die bereinigte Datei oder den Prüfbericht als JSON mit <code>response=json</code> zurück.

ParameterWerteStandard
modequick, fullquick
keepCopyright0, 10
keepColorProfile0, 1quick: 1, full: 0
keepOrientation0, 1quick: 1, full: 0
removeC2pa0, 10
responsefile, jsonfile
curl -X POST https://your-domain/api/v1/clean \
  -H "Authorization: Bearer $NMD_KEY" \
  -F "file=@video.mp4" -F "mode=full" -OJ

removeC2pa ist standardmäßig deaktiviert. Eine normale Metadatenbereinigung entfernt C2PA-Credentials niemals ohne ausdrückliche Anforderung.

Beim Dateidownload reist im Header X-NoMoreData-Result eine URL-codierte Zusammenfassung des Verifizierungsberichts: die Skalarwerte wörtlich — verified ist nur true, wenn die erneute Analyse nichts Unerwartetes gefunden hat — und jede Liste als Anzahl, removedCount, residualCount und so weiter. Sie lässt sich immer decodieren und parsen. Für die Listen selbst response=json anfordern.

POST /api/v1/edit

Wendet Änderungen auf bestimmte Felder an. Das Senden von <code>value: null</code> löscht das ausgewählte Feld.

ParameterWerteStandard
editsJSON array of {key, value}required
replaceAll0, 10
removeC2pa0, 10
responsefile, jsonfile

replaceAll entfernt bestehende Metadatenblöcke, berührt jedoch keine C2PA-Content-Credentials, es sei denn, dies wird ausdrücklich angefordert.

curl -X POST https://your-domain/api/v1/edit \
  -H "Authorization: Bearer $NMD_KEY" \
  -F "file=@photo.jpg" \
  -F 'edits=[{"key":"camera.make","value":"Canon"},{"key":"location.latitude","value":null}]' \
  -F "response=json"

POST /api/v1/apply-profile

Wendet einen konsistenten Satz typischer Gerätemetadaten eines bestimmten Modells an.

curl -X POST https://your-domain/api/v1/apply-profile \
  -H "Authorization: Bearer $NMD_KEY" \
  -F "file=@photo.jpg" -F "profile=canon-eos-r5" -F "iso=400"

Das Anwenden eines Profils schreibt gerätetypische Metadaten, stellt jedoch keinen Rechtsbeweis dar, dass die Datei von diesem Gerät aufgenommen wurde.

Code-Beispiele in anderen Sprachen

JavaScript

const body = new FormData();
body.append('file', file);           // a File or Blob
body.append('mode', 'full');
body.append('response', 'json');

const res = await fetch('https://your-domain/api/v1/clean', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.NMD_KEY}` },
  body,
});

const report = await res.json();
console.log(report.verified, report.removed.length);

Python

import os, requests

with open("photo.jpg", "rb") as fh:
    response = requests.post(
        "https://your-domain/api/v1/clean",
        headers={"Authorization": f"Bearer {os.environ['NMD_KEY']}"},
        files={"file": fh},
        data={"mode": "full", "response": "json"},
    )

report = response.json()
print(report["verified"], len(report["removed"]))

Fehlerbehandlung

Alle Fehler teilen eine einheitliche und vorhersehbare Struktur.

{ "error": { "code": "unsupported_format", "message": "GIF is not supported.", "hint": "..." } }
CodeHTTP-StatusBedeutung
missing_api_key401Es wurde kein API-Schlüssel angegeben.
invalid_api_key401Der Schlüssel ist unbekannt, wurde widerrufen oder ist ungültig.
plan_required403Ihr aktueller Tarif beinhaltet keinen API-Zugriff.
missing_file400In der Multipart-Anfrage wurde keine Datei übermittelt.
invalid_request400Parameter fehlt oder weist ein ungültiges Format auf.
file_too_large413Die Datei überschreitet das maximal zulässige Größenlimit Ihres Tarifs.
unsupported_format415Das Dateiformat wird nicht unterstützt.
corrupt_file422Die Datei konnte nicht verarbeitet werden: beschädigte oder unlesbare Daten.
unsupported_operation422Gültige Datei, aber die Operation ist für dieses Format nicht verfügbar.
rate_limited429Zu viele Anfragen in kurzer Zeit.
quota_exceeded429Das monatliche Aufruf-Kontingent Ihres Tarifs ist aufgebraucht.

Ratenbegrenzungen und Kontingente

Es gelten zwei Kontrollen: ein IP-basiertes Ratenlimit zum Schutz des Dienstes und das monatliche vertragliche Kontingent Ihres Abonnements.

X-RateLimit-Limit: 2000
X-RateLimit-Remaining: 1834
X-RateLimit-Reset: 1767225600

Das Überschreiten des Kontingents liefert HTTP 429 mit dem Code quota_exceeded und einem Retry-After-Header zurück.

Unterstützte Formate

FormatAnalysierenBereinigenBearbeiten
JPEGjajaja
PNGjajaja
WebPjajaja
HEIC/HEIFjajaja
AVIFjajaja
MP4jajaja
QuickTime MOVjajaja
WebMjajanein
PDFjajaja
MP3jajaja
WAVjajaja
M4Ajajaja

Das Anfordern einer nicht unterstützten Aktion liefert 422 unsupported_operation zurück.

Bearbeitbare Felder (28)

Von /api/v1/edit akzeptierte Schlüssel.

SchlüsselFeld
camera.makeMake
camera.modelModel
camera.lensMakeLens make
camera.lensModelLens model
camera.serialNumberBody serial number
camera.lensSerialNumberLens serial number
capture.isoISO
capture.exposureTimeExposure time
capture.fNumberAperture (f-number)
capture.focalLengthFocal length
capture.focalLength35mmFocal length (35 mm equiv.)
capture.exposureBiasExposure compensation
capture.exposureProgramExposure program
capture.meteringModeMetering mode
capture.whiteBalanceWhite balance
capture.flashFlash
capture.colorSpaceColour space
capture.orientationOrientation
date.originalDate taken
date.digitizedDate digitised
date.modifiedFile change date
general.softwareSoftware
general.artistArtist
general.copyrightCopyright
general.descriptionImage description
location.latitudeLatitude
location.longitudeLongitude
location.altitudeAltitude

Dateibehandlung in der API

An die API übermittelte Dateien werden während der Anfrage ausschließlich im flüchtigen Arbeitsspeicher verarbeitet und nach Auslieferung der Antwort unverzüglich verworfen.

Für maximale Vertraulichkeit bleibt die direkte Verarbeitung im Webbrowser der empfohlene Weg.