UploadCenter

Erste Schritte

Vom leeren Konto bis zu Ihrer ersten hochgeladenen Datei – in fünf Schritten.

Installieren Sie das SDK
Offizielle, vollständig typisierte SDKs für TypeScript/JavaScript (Node.js und den Browser) sowie Python. Bei jedem der folgenden Schritte wird auch die entsprechende cURL-Anfrage angezeigt, falls Sie die API lieber direkt aufrufen möchten.
bash
npm install @uploadcenter/sdk-js
typescript
import { createClient } from "@uploadcenter/sdk-js";

const client = createClient({
  baseUrl: "https://api.uploadscenter.com",
  token: process.env.UPLOADCENTER_API_KEY, // an API key from your project settings
});

Jede Methode wird aus dem OpenAPI-Schema von UploadCenter generiert, sodass die Autovervollständigung die gesamte API-Oberfläche abdeckt — Das JS-Paket auf npm anzeigen oder das Python-Paket auf PyPI.

1
Ein Konto erstellen
Bei der Anmeldung wird automatisch ein Arbeitsbereich (Organisation) für Sie erstellt.
2
Erstellen Sie ein Projekt und einen API-Schlüssel
So gehen Sie in Ihrem Dashboard vor: Erstellen Sie ein Projekt und generieren Sie anschließend einen API-Schlüssel, der auf dieses Projekt beschränkt ist – der vollständige Schlüssel wird nur einmal angezeigt, kopieren Sie ihn daher sofort.
3
Einen Upload vorab signieren
Fordern Sie bei der API eine vorab signierte URL an – die Dateien durchlaufen zu keinem Zeitpunkt Ihr eigenes Backend.
bash
curl -X POST https://api.uploadscenter.com/v1/uploads/presign \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "project_id": "project_...",
    "filename": "photo.jpg",
    "size_bytes": 128000,
    "mime_type": "image/jpeg",
    "visibility": "private"
  }'
4
Lade die Datei hoch
Laden Sie die Datei direkt über die zurückgegebene `upload_url` hoch – dadurch werden Uploads unabhängig von der Dateigröße schnell abgewickelt.
bash
curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: image/jpeg" \
  --data-binary @photo.jpg
5
Upload bestätigen
Dies löst den Virenscan und die weitere Verarbeitung aus – die Datei wird erst dann als bereit markiert, wenn sie den Scan erfolgreich durchlaufen hat.
bash
curl -X POST https://api.uploadscenter.com/v1/uploads/complete \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"file_id": "file_..."}'

Eine Datei zurücklesen — GET /v1/files/{file_id}/url — Für private Dateien ist immer ein gültiger API-Schlüssel oder eine gültige Sitzung erforderlich. Bei öffentlichen Dateien gilt eine andere Regelung – siehe unten.

Öffentliche URLs
Beim Hochladen die Sichtbarkeit auf „öffentlich“ setzen. Sobald die Datei bereit ist, wird im URL-Feld ein permanenter, nicht authentifizierter Link angezeigt – dieser kann sicher direkt eingebettet werden, wird am Rand zwischengespeichert und läuft nie ab.
json
GET /v1/files/{file_id}

{
  "id": "file_...",
  "visibility": "public",
  "status": "ready",
  "url": "https://cdn.uploadscenter.com/o/…/photo.jpg"
}

Private Dateien (Standardeinstellung) verfügen nicht über ein URL-Feld – rufen Sie stattdessen GET /v1/files/{id}/url auf, wodurch ein neuer, signierter Link zurückgegeben wird, der für einen begrenzten Zeitraum gültig ist.

Auf Ereignisse reagieren
Fügen Sie in Ihren Projekteinstellungen einen Webhook hinzu, um bei Upload-, Verarbeitungs- und Kontingentereignissen benachrichtigt zu werden. Jede Übermittlung ist signiert – überprüfen Sie die Signatur, bevor Sie der Nutzlast vertrauen.
http
POST <your webhook URL>
Content-Type: application/json
X-Signature: sha256=<hex-encoded HMAC-SHA256>
X-Timestamp: <unix timestamp, seconds>

{"event":"file.processed","created_at":"2026-01-01T12:00:00Z","data":{"id":"file_...","project_id":"project_...","status":"ready", ...}}

Veranstaltungen: file.uploaded, file.processed, file.failed, file.quarantined, file.flagged, storage.limit_reached. Bis zu 3 Zustellversuche (mit einer Wartezeit von 30 Sekunden, 2 Minuten bzw. 10 Minuten) sind zulässig, bevor eine Zustellung als fehlgeschlagen markiert wird.

typescript
import crypto from "node:crypto";

// Sign over "${timestamp}.${rawBody}" — rawBody must be the exact bytes
// received, not a re-serialized JSON.stringify(JSON.parse(rawBody)).
function verifyWebhook(rawBody: string, timestamp: string, signatureHeader: string, secret: string): boolean {
  const expected = crypto.createHmac("sha256", secret).update(`${timestamp}.${rawBody}`).digest("hex");
  const provided = signatureHeader.replace(/^sha256=/, "");
  return crypto.timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(provided, "hex"));
}

// signatureHeader = req.headers["x-signature"]
// timestamp       = req.headers["x-timestamp"]
Bilder im Handumdrehen bearbeiten
Größe anpassen, zuschneiden und Format konvertieren mithilfe von Abfrageparametern – das Ergebnis wird nach der ersten Anfrage zwischengespeichert und nicht bei jedem Aufruf neu berechnet.
http
GET /v1/files/{file_id}/transform?w=480&h=320&format=auto&fit=cover

# fit: "cover" (crop to fill) or "inside" (contain)
# format: auto (default) | webp | jpeg | png
# quality: auto (default) | 1-100
#
# format=auto picks WebP or JPEG based on the request's Accept header —
# no more branching client-side for older browsers. quality=auto applies
# a sensible per-format default (80 for WebP, 82 for JPEG). Pass explicit
# values any time you want full control instead.
Versehen Sie Ihre Bilder mit einem Wasserzeichen
Fügen Sie das Logo Ihres Projekts über jede beliebige Transformation ein – Position, Deckkraft und Größe sind vollständig konfigurierbar, und das Ergebnis wird wie jede andere Transformation zwischengespeichert.
http
PUT /v1/projects/{project_id}/watermark
{"file_id": "file_..."}   # any image already uploaded to the project

GET /v1/files/{file_id}/transform?w=1200&watermark=true&gravity=south_east&opacity=60&overlay_scale=0.2

# gravity: north_west | north_east | south_west | south_east | center
# opacity: 1-100 (default 60)
# overlay_scale: 0.05-1.0 (default 0.2, fraction of the output image's width)
Benutzerdefinierte Domains
Stellen Sie öffentliche Dateien über Ihre eigene Domain statt über das gemeinsam genutzte CDN bereit, sobald die Eigentumsrechte über DNS überprüft wurden.
http
POST /v1/domains
{"project_id": "project_...", "hostname": "cdn.yourapp.com"}

# Add the returned TXT record at your DNS provider, then:
POST /v1/domains/{domain_id}/verify

# Once verified, point cdn.yourapp.com at UploadCenter (A/CNAME — shown in
# the dashboard) and a TLS certificate is issued automatically. From then
# on, every public file's url uses your domain instead of the shared CDN.
Inhaltsmoderation
Hochgeladene Bilder werden automatisch auf explizite Inhalte überprüft – es handelt sich dabei ausschließlich um eine Erkennung; es wird niemals etwas in Ihrem Namen blockiert oder gelöscht.
json
GET /v1/files/{file_id}

{
  "id": "file_...",
  "status": "ready",
  "moderation_status": "flagged",  // null (not evaluated) | "clean" | "flagged" | "error"
  "moderation_score": 0.87
}

Eine als „markiert“ gekennzeichnete Datei bleibt genau so, wie sie hochgeladen wurde – Ihre App legt fest, was „markiert“ für Ihr Produkt bedeutet. Verfügbar in kostenpflichtigen Tarifen; siehe die Seite mit den Funktionen.

Video-Miniaturansichten und abgeleitete Dateien
Jeder Video-Upload erhält automatisch ein JPEG-Miniaturbild; kleinere Videos werden zudem in ein 720p-MP4-Format umgewandelt. Die jeweilige URL jeder Variante ist sofort einsatzbereit – ohne zusätzlichen Authentifizierungsschritt.
json
GET /v1/files/{file_id}/variants

[
  { "variant": "thumbnail", "format": "jpg", "width": 640, "height": 360, "url": "https://…" },
  { "variant": "720p", "format": "mp4", "width": 1280, "height": 720, "url": "https://…" }
]
KI-gestützte Bild- und Videogenerierung
Bilder generieren, bearbeiten, Hintergründe entfernen, hochauflösen oder Variationen erstellen; Videos aus Text oder einem vorhandenen Bild generieren. Jeder Aufruf erfolgt asynchron – 202 mit einer Generierungs-ID, anschließend abfragen oder auf den Webhook „ai.generation.completed“ bzw. „ai.generation.failed“ warten.
typescript
const generation = await client.ai.generateImageEndpointV1AiImagesGeneratePost({
  project_id: projectId,
  prompt: "a minimalist logo of a fox, flat vector style",
  use_brand_kit: true, // pulls in this org's brand kit colors/fonts
});

// 202 Accepted — poll until it settles (or listen for the webhook below).
const result = await client.ai.getGenerationEndpointV1AiGenerationsGenerationIdGet(
  generation.id,
  projectId,
);
// result.file_ids — the new file(s), same shape as anything you upload

Das Ergebnis ist eine gewöhnliche Datei – „file_ids“ nach Abschluss der Generierung – mit eigener Sichtbarkeit, Zustellung und eigenem Lebenszyklus, genau wie alles, was Sie direkt hochladen.

Zuverlässigkeit, ehrlich gesagt
UploadCenter ist eine junge, aktiv weiterentwickelte Plattform – wir können nicht auf eine jahrelange Verfügbarkeitsbilanz verweisen, und wir werden auch keine Zahlen aus der Luft greifen. Was heute bereits vorhanden ist: Jede Datei wird vor der Bereitstellung einem Virenscan unterzogen, Uploads werden atomar verarbeitet (es bleibt nichts halbfertig, wenn ein Schritt fehlschlägt) und die Bereitstellung erfolgt über das Cloudflare-Netzwerk. Es gibt noch kein formelles SLA – wenn Ihr Anwendungsfall vertragliche Garantien erfordert, melden Sie sich bei uns, und wir besprechen, was realistisch ist.

Möchten Sie den vollständigen Überblick?

Auf der Seite „Funktionen“ finden Sie alle Funktionen – Versionsverwaltung, benutzerdefinierte Domains, Teamrollen und vieles mehr.