> ## Documentation Index
> Fetch the complete documentation index at: https://docs.samsa.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Bild oder Video prüfen

> Lade eine Datei hoch und erhalte ein Ergebnis je Technik — mit dem C2PA-Urteil als maßgeblicher Antwort.

```
POST https://detect.samsa.ai/v1/public/detect
```

Lade ein einzelnes Bild oder Video als `multipart/form-data` hoch. Die Antwort enthält
ein `detected`-Gesamturteil sowie eine Aufschlüsselung je Technik. Keine
Authentifizierung, keine Credits. Der Upload wird **im Arbeitsspeicher verarbeitet und
niemals gespeichert**.

## Request

Sende genau **einen** File-Part mit dem Namen `file`. Der Part muss in seinem
`Content-Disposition`-Header einen `filename` tragen — ein einfaches Formularfeld ohne
Dateinamen ist kein File-Part.

|                    |                                          |
| ------------------ | ---------------------------------------- |
| **Content-Type**   | `multipart/form-data`                    |
| **Feld**           | `file` — das zu prüfende Bild oder Video |
| **Maximale Größe** | 50 MB                                    |
| **Bildformate**    | JPEG, PNG, WebP, GIF                     |
| **Videoformate**   | MP4, QuickTime, WebM                     |

<Note>
  JPEG/PNG/WebP/GIF und MP4/QuickTime werden anhand von Magic Bytes erkannt. Ein
  falscher oder generischer `Content-Type` des Parts (zum Beispiel
  `application/octet-stream`) verhindert die Erkennung bei diesen Formaten also nicht.
  **WebM hat keinen Magic-Byte-Zweig** und wird nur akzeptiert, wenn der Part
  `Content-Type: video/webm` deklariert.
</Note>

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://detect.samsa.ai/v1/public/detect \
    -F "file=@photo.jpg"
  ```

  ```python Python theme={null}
  import requests

  with open("photo.jpg", "rb") as fh:
      response = requests.post(
          "https://detect.samsa.ai/v1/public/detect",
          files={"file": ("photo.jpg", fh, "image/jpeg")},
          timeout=120,
      )

  response.raise_for_status()
  result = response.json()
  print(result["detected"])
  ```

  ```typescript TypeScript theme={null}
  import { readFile } from "node:fs/promises";

  const form = new FormData();
  // The third argument sets the part filename — required for it to count as a file part.
  form.append("file", new Blob([await readFile("photo.jpg")]), "photo.jpg");

  const response = await fetch("https://detect.samsa.ai/v1/public/detect", {
    method: "POST",
    body: form,
  });

  if (!response.ok) {
    const { detail } = await response.json();
    throw new Error(`Detection failed (${response.status}): ${detail}`);
  }

  const result = await response.json();
  console.log(result.detected);
  ```
</CodeGroup>

## Response

`200 OK`. Ein Bild oder Video, das ein gültiges, vertrauenswürdiges Samsa-C2PA-Manifest
trägt:

```json Response theme={null}
{
  "request_id": "c1a2b3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
  "detected": "samsa",
  "techniques": [
    {
      "type": "metadata",
      "result": "samsa",
      "confidence": "high",
      "manifest": {
        "claim_generator": "Samsa/1.0",
        "digital_source_type": "http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia",
        "upstream_provider": "fal",
        "upstream_model": "flux-pro",
        "timestamp": "2026-07-02T14:21:07+00:00",
        "assertions": ["c2pa.actions", "c2pa.hash.data"]
      }
    },
    {
      "type": "watermark",
      "result": "not_checked",
      "confidence": null,
      "vendor_id": null
    },
    {
      "type": "watermark",
      "result": "not_checked",
      "confidence": null,
      "vendor_id": null
    }
  ],
  "external_verification": {
    "c2pa": "https://verify.contentauthenticity.org"
  },
  "result_pdf_url": "https://detect.samsa.ai/v1/public/detect/result/c1a2b3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d/pdf",
  "responded_at": "2026-07-02T14:21:09.412093Z"
}
```

| Feld                    | Typ               | Beschreibung                                                                                                                     |
| ----------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `request_id`            | string (UUID)     | Serverseitig erzeugte ID dieser Prüfung. Nutze sie, um die [signierte Ergebnis-PDF](/de/content-verification/results) abzurufen. |
| `detected`              | enum              | Das Gesamturteil: `samsa`, `non_samsa` oder `unknown`.                                                                           |
| `techniques[]`          | array             | Ein Eintrag je angewandter Technik — siehe [unten](#die-techniken-im-detail).                                                    |
| `external_verification` | object            | Links, um das Ergebnis unabhängig von Samsa zu prüfen. Aktuell `c2pa`.                                                           |
| `result_pdf_url`        | string \| null    | Link zur signierten PDF dieses Ergebnisses, oder `null`, wenn die Ergebnis-Persistenz nicht verfügbar ist.                       |
| `responded_at`          | string (ISO 8601) | Wann die Prüfung abgeschlossen wurde, in UTC.                                                                                    |

<Note>
  `result_pdf_url` kann `null` sein. Wenn die URL vorhanden ist, folge ihr **genau so,
  wie sie zurückgegeben wurde**, statt sie selbst zusammenzusetzen — sie und der
  [dokumentierte Ergebnis-Endpoint](/de/content-verification/results) liefern dieselbe
  signierte PDF.
</Note>

### Das `detected`-Urteil

Das Urteil stammt aus der C2PA-Manifest-Prüfung, die maßgeblich ist.
Wasserzeichen-Techniken sind Bestätigung: Sie können eine Zuordnung liefern, wenn kein
Manifest vorhanden ist, überschreiben ein Manifest-Urteil aber nie.

| `detected`  | Wird erreicht, wenn                                                                                                                                                                    |
| ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `samsa`     | Ein gültiges, vertrauenswürdiges, freigegebenes Samsa-Manifest geprüft wurde — oder, wenn kein Manifest vorhanden ist, eine Wasserzeichen-Erkennung einen Samsa-Treffer geliefert hat. |
| `non_samsa` | Ein Manifest ist vorhanden, lässt sich aber nicht Samsa zuordnen (anderer Aussteller, nicht vertrauenswürdig oder manipuliert).                                                        |
| `unknown`   | Kein Manifest vorhanden und kein Wasserzeichen-Treffer.                                                                                                                                |

<Warning>
  `unknown` bedeutet, dass **diese Prüfung keine Belege gefunden hat** — nicht, dass die
  Datei authentisch oder von Menschen erstellt ist. Herkunfts-Metadaten lassen sich
  leicht entfernen, und die gehostete Wasserzeichen-Erkennung ist
  [noch nicht verfügbar](#die-techniken-im-detail).
</Warning>

## Die Techniken im Detail

`techniques[]` beginnt immer mit dem einzelnen `metadata`-Eintrag (der maßgeblichen
C2PA-Ebene), gefolgt von den Wasserzeichen-Techniken, die für die Modalität der Datei
gelten.

### Die `metadata`-Technik

```json theme={null}
{
  "type": "metadata",
  "result": "absent",
  "confidence": "low",
  "manifest": null
}
```

| Feld         | Beschreibung                                                                                                                                                                                                                                                                    |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `result`     | `samsa` (gültiges, vertrauenswürdiges, freigegebenes Samsa-Manifest), `non_samsa` (Manifest eines anderen Ausstellers oder gültig, aber nicht vertrauenswürdig), `tampered` (Manifest besteht die Prüfung nicht) oder `absent` (kein Manifest — meist, weil es entfernt wurde). |
| `confidence` | `high`, `medium` oder `low`. Bei dieser Technik immer vorhanden.                                                                                                                                                                                                                |
| `manifest`   | Eine laienverständliche Zusammenfassung des geprüften Manifests (`claim_generator`, `digital_source_type`, `upstream_provider`, `upstream_model`, `timestamp`, `assertions`), oder `null`, wenn es nichts zusammenzufassen gibt.                                                |

<Info>
  Die C2PA-Manifest-Prüfung ist **live**: Sie wird von der öffentlichen Samsa-API und von
  jedem unabhängigen C2PA-Validator bereitgestellt. Die Zuordnung eines Manifests zu
  Samsa wird verfügbar, sobald die Produktionssignierung aktiviert ist.
</Info>

### Wasserzeichen-Techniken

```json theme={null}
{
  "type": "watermark",
  "result": "not_checked",
  "confidence": null,
  "vendor_id": null
}
```

| Feld         | Beschreibung                                                                                                                       |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------- |
| `result`     | `samsa`, `absent`, `low_confidence` oder `not_checked` — siehe Tabelle unten.                                                      |
| `confidence` | `high`, `medium` oder `low`, und `null` **genau dann**, wenn `result` gleich `not_checked` ist. Der Schlüssel ist immer vorhanden. |
| `vendor_id`  | Benennt den Decoder, der einen Treffer geliefert hat; `null`, sofern `result` nicht `samsa` ist.                                   |

| `result`         | Bedeutung                                                                                 |
| ---------------- | ----------------------------------------------------------------------------------------- |
| `samsa`          | Ein Decoder lief und fand ein Samsa-Wasserzeichen.                                        |
| `absent`         | Ein Decoder lief und fand kein Samsa-Wasserzeichen.                                       |
| `low_confidence` | Ein Decoder lief und lieferte einen schwachen Treffer.                                    |
| `not_checked`    | Das Decoder-Backend ist nicht bereitgestellt, die Technik wurde also **nie ausgewertet**. |

<Warning>
  `not_checked` ist **keine** Aussage darüber, dass kein Wasserzeichen vorhanden ist —
  das bedeutet `absent`. Die gehostete Wasserzeichen-Erkennung ist noch nicht verfügbar;
  sie ist vor dem 2. Februar 2027 geplant. Bis dahin meldet die API diese Techniken als
  `not_checked`, niemals als falsches „kein Wasserzeichen“. Stelle eine
  `not_checked`-Technik nie als fehlendes Wasserzeichen dar.
</Warning>

Da die gehostete Wasserzeichen-Erkennung noch nicht live ist, kommt derzeit jeder
Wasserzeichen-Eintrag als `not_checked` mit `confidence: null` zurück.
Wasserzeichen-Einträge tragen keinen eigenen Techniknamen — die Algorithmus-IDs, die
Hashes der gepinnten Modell-Artefakte, die Soft-Binding-Labels je Signaturweg und die
quelloffenen Decoder hinter jeder Technik findest du unter
[So funktioniert die Erkennung](https://detect.samsa.ai/how-detection-works) oder über
[`GET /v1/public/detect/info`](/de/content-verification/info).

## Fehler

Fehler kommen als `{"detail": "…"}` zurück — nicht als
[Error-Envelope](/de/guides/errors) der Samsa-REST-API.

| Status | Wann                                                                                                                              |
| ------ | --------------------------------------------------------------------------------------------------------------------------------- |
| `400`  | Fehlerhafter Multipart-Body, fehlende Boundary, leerer Upload oder eine andere Anzahl File-Parts als genau einer.                 |
| `413`  | Der Upload überschreitet das Limit von 50 MB.                                                                                     |
| `415`  | Der Request ist kein `multipart/form-data`, oder die hochgeladenen Bytes sind kein unterstütztes Bild oder Video.                 |
| `503`  | Ein verfügbarer Decoder oder der C2PA-Verifier ist bei der Inferenz fehlgeschlagen. Die Antwort trägt einen `Retry-After`-Header. |

<Tip>
  Behandle `503` als vorübergehend und wiederhole die Anfrage nach dem
  `Retry-After`-Intervall. Ein Decoder, der schlicht nicht bereitgestellt ist, erzeugt nie
  einen `503` — er degradiert zu `not_checked` in einer normalen `200`-Antwort.
</Tip>
