UploadCenter

Bien démarrer

D'un compte vide à votre premier fichier uploadé, en cinq étapes.

Installer le SDK
Des SDK officiels et entièrement typés pour TypeScript/JavaScript (Node.js et navigateur) et Python. Chaque étape ci-dessous montre aussi la requête cURL équivalente, si vous préférez appeler l'API directement.
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
});

Chaque méthode est générée depuis le schéma OpenAPI d'UploadCenter, l'autocomplétion couvre donc toute la surface de l'API — voir le paquet JS sur npm ou le paquet Python sur PyPI.

1
Créer un compte
Un espace de travail (organisation) est créé automatiquement pour vous à l'inscription.
2
Créer un projet et une clé API
Depuis votre tableau de bord : créez un projet, puis générez une clé API qui lui est associée — la clé complète n'est affichée qu'une fois, copiez-la immédiatement.
3
Présigner un upload
Demandez à l'API une URL présignée — les fichiers ne transitent jamais par votre propre 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
Uploader le fichier
Envoyez le fichier directement via PUT vers l'upload_url retournée — c'est ce qui rend les uploads rapides, quelle que soit la taille.
bash
curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: image/jpeg" \
  --data-binary @photo.jpg
5
Confirmer l'upload
C'est ce qui déclenche l'analyse antivirus et le traitement — le fichier n'est marqué prêt qu'une fois ces étapes validées.
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_..."}'

Relire un fichier — GET /v1/files/{file_id}/url — nécessite toujours une clé API ou une session valide pour les fichiers privés. Les fichiers publics fonctionnent différemment — voir ci-dessous.

URLs publiques
Uploadez avec visibility: "public" et, une fois le fichier prêt, son champ url devient un lien permanent et non authentifié — utilisable directement, mis en cache en périphérie, n'expire jamais.
json
GET /v1/files/{file_id}

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

Les fichiers privés (par défaut) n'ont pas de champ url — appelez plutôt GET /v1/files/{id}/url, qui renvoie un lien signé valable pour une durée limitée à chaque appel.

Réagir aux événements
Ajoutez un webhook depuis les paramètres de votre projet pour être notifié des événements d'upload, de traitement et de quota. Chaque livraison est signée — vérifiez-la avant de faire confiance au payload.
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", ...}}

Événements : file.uploaded, file.processed, file.failed, file.quarantined, file.flagged, storage.limit_reached. Jusqu'à 3 tentatives de livraison (30s, 2min, 10min de backoff) avant qu'une livraison soit marquée morte.

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"]
Transformer des images à la volée
Redimensionnez, recadrez et convertissez le format via des paramètres de requête — le résultat est mis en cache dès la première requête, jamais recalculé.
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.
Filigraner vos images
Superposez le logo de votre projet sur n'importe quelle transformation — position, opacité et taille entièrement configurables, et le résultat est mis en cache comme toute autre transformation.
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)
Domaines personnalisés
Servez vos fichiers publics depuis votre propre domaine plutôt que le CDN partagé, une fois la propriété vérifiée par DNS.
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.
Modération de contenu
Les images uploadées sont automatiquement analysées pour détecter tout contenu explicite — détection uniquement, rien n'est jamais bloqué ni supprimé en votre nom.
json
GET /v1/files/{file_id}

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

Un fichier signalé reste exactement tel qu'il a été uploadé — c'est votre application qui décide ce que « signalé » signifie pour votre produit. Disponible sur les plans payants, voir la page fonctionnalités.

Miniatures vidéo et fichiers dérivés
Chaque vidéo uploadée reçoit automatiquement une miniature JPEG ; les vidéos plus légères reçoivent aussi un transcodage MP4 720p. L'url de chaque variante est directement utilisable — aucune signature supplémentaire nécessaire.
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://…" }
]
Génération d'image & vidéo par IA
Générez, éditez, supprimez l'arrière-plan, améliorez la résolution ou créez des variantes d'une image ; générez une vidéo à partir d'un texte ou d'une image existante. Chaque appel est asynchrone — 202 avec un id de génération, puis interrogez-le ou écoutez le webhook ai.generation.completed / ai.generation.failed.
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

Le résultat est un fichier ordinaire — file_ids sur la génération terminée — avec sa propre visibilité, diffusion et cycle de vie, exactement comme tout ce que vous uploadez directement.

Fiabilité, en toute transparence
UploadCenter est une plateforme jeune, activement développée — nous n'avons pas des années d'historique de disponibilité à présenter, et nous n'allons pas inventer un chiffre. Ce qui est déjà en place aujourd'hui : chaque fichier est analysé par antivirus avant d'être jamais servi, les uploads sont traités de façon atomique (rien ne reste à moitié fait en cas d'échec d'une étape), et la diffusion passe par le réseau de Cloudflare. Il n'y a pas encore de SLA formel — si votre cas d'usage nécessite des garanties contractuelles, contactez-nous et parlons de ce qui est réaliste.

Envie d'une vue d'ensemble ?

Découvrez toutes les fonctionnalités — versionnage, domaines personnalisés, rôles d'équipe et plus — sur la page fonctionnalités.