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.
| Parameter | Werte | Standard |
|---|---|---|
| mode | quick, full | quick |
| keepCopyright | 0, 1 | 0 |
| keepColorProfile | 0, 1 | quick: 1, full: 0 |
| keepOrientation | 0, 1 | quick: 1, full: 0 |
| removeC2pa | 0, 1 | 0 |
| response | file, json | file |
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.
| Parameter | Werte | Standard |
|---|---|---|
| edits | JSON array of {key, value} | required |
| replaceAll | 0, 1 | 0 |
| removeC2pa | 0, 1 | 0 |
| response | file, json | file |
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": "..." } }| Code | HTTP-Status | Bedeutung |
|---|---|---|
| missing_api_key | 401 | Es wurde kein API-Schlüssel angegeben. |
| invalid_api_key | 401 | Der Schlüssel ist unbekannt, wurde widerrufen oder ist ungültig. |
| plan_required | 403 | Ihr aktueller Tarif beinhaltet keinen API-Zugriff. |
| missing_file | 400 | In der Multipart-Anfrage wurde keine Datei übermittelt. |
| invalid_request | 400 | Parameter fehlt oder weist ein ungültiges Format auf. |
| file_too_large | 413 | Die Datei überschreitet das maximal zulässige Größenlimit Ihres Tarifs. |
| unsupported_format | 415 | Das Dateiformat wird nicht unterstützt. |
| corrupt_file | 422 | Die Datei konnte nicht verarbeitet werden: beschädigte oder unlesbare Daten. |
| unsupported_operation | 422 | Gültige Datei, aber die Operation ist für dieses Format nicht verfügbar. |
| rate_limited | 429 | Zu viele Anfragen in kurzer Zeit. |
| quota_exceeded | 429 | Das 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
| Format | Analysieren | Bereinigen | Bearbeiten |
|---|---|---|---|
| JPEG | ja | ja | ja |
| PNG | ja | ja | ja |
| WebP | ja | ja | ja |
| HEIC/HEIF | ja | ja | ja |
| AVIF | ja | ja | ja |
| MP4 | ja | ja | ja |
| QuickTime MOV | ja | ja | ja |
| WebM | ja | ja | nein |
| ja | ja | ja | |
| MP3 | ja | ja | ja |
| WAV | ja | ja | ja |
| M4A | ja | ja | ja |
Das Anfordern einer nicht unterstützten Aktion liefert 422 unsupported_operation zurück.
Bearbeitbare Felder (28)
Von /api/v1/edit akzeptierte Schlüssel.
| Schlüssel | Feld |
|---|---|
| camera.make | Make |
| camera.model | Model |
| camera.lensMake | Lens make |
| camera.lensModel | Lens model |
| camera.serialNumber | Body serial number |
| camera.lensSerialNumber | Lens serial number |
| capture.iso | ISO |
| capture.exposureTime | Exposure time |
| capture.fNumber | Aperture (f-number) |
| capture.focalLength | Focal length |
| capture.focalLength35mm | Focal length (35 mm equiv.) |
| capture.exposureBias | Exposure compensation |
| capture.exposureProgram | Exposure program |
| capture.meteringMode | Metering mode |
| capture.whiteBalance | White balance |
| capture.flash | Flash |
| capture.colorSpace | Colour space |
| capture.orientation | Orientation |
| date.original | Date taken |
| date.digitized | Date digitised |
| date.modified | File change date |
| general.software | Software |
| general.artist | Artist |
| general.copyright | Copyright |
| general.description | Image description |
| location.latitude | Latitude |
| location.longitude | Longitude |
| location.altitude | Altitude |
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.