Dateien hochladen

POST /api/v1/files lädt eine Datei mit multipart/form-data hoch. Der öffentliche Endpoint akzeptiert derzeit Dateien bis 100 MiB (104.857.600 Bytes). Er benötigt den Scope upload und die Rollenberechtigung files.upload des API-Key-Inhabers.

Request

FeldPflichtBeschreibung
filejaDie Datei. Dateiname und Content-Type stammen aus diesem Multipart-Part.
collection_idneinUUID einer Sammlung. Bei einer fehlenden oder nicht zugänglichen Sammlung bleibt die Datei nur in der Bibliothek.

Der Header Content-Length ist erforderlich. Akzeptiert werden image/*, video/*, application/pdf, text/plain und application/octet-stream. Bekannte Bildendungen – darunter übliche RAW-Formate, PSD, TIFF, HEIC und HEIF – werden vor der Validierung anhand des Dateinamens normalisiert.

bash
curl --fail-with-body \
  -X POST "$NEW_ARCHIVE_URL/api/v1/files" \
  -H "Authorization: Bearer $NEW_ARCHIVE_API_KEY" \
  -F "file=@sunset.jpg" \
  -F "collection_id=0198c9a0-7d3e-7c41-b7a2-3f9d1c2e4a5b"

Upload-Response

Ein erfolgreicher Upload liefert 202 Accepted. Die Bytes sind gespeichert, während im Hintergrund möglicherweise noch Thumbnails und Daten für den Search-Index erzeugt werden.

json
{
  "id": "0198c9a0-7d3e-7c41-b7a2-3f9d1c2e4a5b",
  "version_id": "0198c9a0-8a12-7e55-9c01-d4b6f7a8e9c0",
  "status": "processing"
}

Uploads über dem Limit liefern 413 payload_too_large. Ein volles Speicherkontingent des Teams liefert 507 quota_exceeded.

Status und Metadaten lesen

GET /api/v1/files/:fileId akzeptiert den Scope upload oder search. Verwende den Endpoint zum Polling eines Uploads oder zum Lesen eines einzelnen Suchergebnisses.

bash
curl --fail-with-body \
  "$NEW_ARCHIVE_URL/api/v1/files/0198c9a0-7d3e-7c41-b7a2-3f9d1c2e4a5b" \
  -H "Authorization: Bearer $NEW_ARCHIVE_API_KEY"
json
{
  "id": "0198c9a0-7d3e-7c41-b7a2-3f9d1c2e4a5b",
  "status": "ready",
  "original_name": "sunset.jpg",
  "mime_type": "image/jpeg",
  "size_bytes": 2481931,
  "width": 4000,
  "height": 3000,
  "taken_at": "2026-06-30T18:41:02.000Z",
  "created_at": "2026-07-11T09:12:44.201Z",
  "thumbnail_url": "https://storage.example/signed-thumbnail"
}
FeldTypBeschreibung
idstringStabile Datei-UUID.
statusstringprocessing, ready oder failed.
original_namestringBeim Upload übergebener Dateiname.
mime_typestringNormalisierter Content-Type.
size_bytesnumberGröße des gespeicherten Originals in Bytes.
widthnumber oder nullPixelbreite, wenn verfügbar.
heightnumber oder nullPixelhöhe, wenn verfügbar.
taken_atstring oder nullAufnahmezeit aus Metadaten im ISO-8601-Format.
created_atstringUpload-Zeitpunkt im ISO-8601-Format.
thumbnail_urlstring oder nullSigned URL für ein Thumbnail, etwa eine Stunde gültig.

Eine unbekannte Datei-ID – oder eine aus einem anderen Team – liefert 404 not_found. Downloads von Originaldateien gehören nicht zu API v1.

Processing-Status pollen

Sende höchstens einen Request pro Sekunde, da jeder Request auf das Rate Limit des API-Keys angerechnet wird.

js
async function waitForFile(fileId) {
  const url = `${process.env.NEW_ARCHIVE_URL}/api/v1/files/${fileId}`
  for (;;) {
    const response = await fetch(url, {
      headers: { Authorization: `Bearer ${process.env.NEW_ARCHIVE_API_KEY}` },
    })
    const body = await response.json()
    if (!response.ok)
      throw new Error(`${body.error.code}: ${body.error.message}`)
    if (body.status !== "processing") return body
    await new Promise((resolve) => setTimeout(resolve, 2000))
  }
}