MediaGrade SFTP Server API (2.0.0)

Download OpenAPI specification:

MediaGrade Team: support@mediagrade.com License: Proprietary

API REST pour la gestion des comptes SFTP et des fichiers MediaGrade.

Patterns d'I/O — à lire avant d'implémenter un client

L'API utilise trois patterns différents selon la nature de l'opération. Chaque endpoint déclare lequel s'applique. Le client doit en tenir compte pour ne pas se faire piéger par les limites d'API Gateway (timeout 30 s, payload request 10 MB, réponse Lambda 6 MB).

1. Sync direct — petits JSON (listing, search, mkdir)

Appel HTTP classique, réponse 200 immédiate avec un JSON paginé. Aucune contrainte particulière côté client.

Exemple :

GET /api/files/{accountId}?path=/folder&limit=1000

2. Presigned URL — bytes (upload, download)

Le client demande au backend une URL signée S3, puis échange les bytes directement avec S3 (pas via API Gateway). Contourne la limite 10 MB et permet l'affichage de progression réelle côté navigateur.

POST /api/files/{accountId}/upload-url    →  { uploadUrl, s3Key }
PUT  <uploadUrl>                          →  bytes vers S3 directement
GET  /api/files/{accountId}/download-url  →  { downloadUrl }
GET  <downloadUrl>                        →  bytes depuis S3 directement

Pour les téléchargements multi-fichiers, voir download-batch qui suit le pattern async (un ZIP est construit en arrière-plan).

3. Async job + polling — opérations longues (delete, rename, move)

Le backend ne fait pas le travail dans le cycle HTTP : il écrit un job en base, l'enqueue en SQS, et retourne immédiatement 202 Accepted avec un jobId et un statusUrl. Le client poll statusUrl jusqu'à ce que le statut soit terminal (completed, partial ou error).

Toutes les requêtes async doivent porter un header Idempotency-Key (UUID v4 généré côté client par action utilisateur). Une retry avec la même clé renvoie le même jobId — le serveur dédupe par (account_id, idempotency_key). Cela permet au client de retry sans risque de doublon.

DELETE /api/files/{accountId}/delete   →  202 { jobId, statusUrl }
PUT    /api/files/{accountId}/rename   →  202 { jobId, statusUrl }
PUT    /api/files/{accountId}/move     →  202 { jobId, statusUrl }
GET    {statusUrl}200 { status, progress, errors }

Le statut partial est utilisé quand l'opération a globalement abouti mais qu'une partie des objets a échoué (collision S3, autorisation, etc.). Dans ce cas, errors[] liste les { path, reason } non-traités — le client peut proposer un retry ciblé.

Cadence de polling recommandée : 500 ms initial, backoff exponentiel plafonné à 5 s. Pas plus rapide — la Lambda worker met à jour la progression toutes les 50 items ou 1 s, donc des polls plus serrés ne rapportent rien.

Authentification

Tous les endpoints (sauf /health) nécessitent une authentification via clé API. Deux méthodes sont supportées :

  • Header X-API-Key : X-API-Key: your-api-secret-key
  • Header Authorization : Authorization: Bearer your-api-secret-key

Rate Limiting

Les limites de taux suivantes s'appliquent par clé API :

  • Requêtes générales : 100 requêtes par minute
  • Uploads de fichiers : 10 requêtes par minute
  • Téléchargements : 50 requêtes par minute

En cas de dépassement, une réponse 429 Too Many Requests est retournée avec les headers suivants :

  • X-RateLimit-Limit : Limite totale
  • X-RateLimit-Remaining : Requêtes restantes
  • X-RateLimit-Reset : Timestamp de réinitialisation

Pagination

Les endpoints retournant des listes supportent la pagination via les paramètres de requête :

  • limit : Nombre d'éléments par page (défaut: 50, max: 1000)
  • offset : Nombre d'éléments à ignorer (défaut: 0)

La réponse inclut un objet pagination avec :

  • total : Nombre total d'éléments
  • limit : Limite utilisée
  • offset : Offset utilisé
  • returned : Nombre d'éléments retournés dans cette page

Encodage des Paramètres de Requête

Les paramètres de requête contenant des caractères spéciaux (accents, apostrophes, espaces) doivent être encodés en URL :

  • Exemple : path=files/Capture d'écran.pngpath=files%2FCapture%20d%27%C3%A9cran.png
  • Décodage automatique : L'API décode automatiquement les paramètres encodés
  • Normalisation Unicode : Tous les chemins sont normalisés en NFC (Normalization Form Composed) pour garantir la cohérence cross-platform

Important : macOS utilise NFD (Normalization Form Decomposed) par défaut, mais l'API normalise systématiquement en NFC pour garantir la cohérence avec Linux et Windows.

Mécanismes de Retry

En cas d'erreur temporaire (codes 5xx, 429), il est recommandé d'implémenter une stratégie de retry avec backoff exponentiel :

  • Tentatives : Maximum 3 tentatives
  • Délai initial : 1 seconde
  • Backoff : Multiplier par 2 à chaque tentative (1s, 2s, 4s)
  • Codes à retry : 429, 500, 502, 503, 504

Ne pas retry sur les codes 4xx (sauf 429) car ce sont des erreurs client.

Exemple de Retry

async function retryRequest(fn, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await fn();
    } catch (error) {
      if (i === maxRetries - 1) throw error;
      if ([429, 500, 502, 503, 504].includes(error.status)) {
        await new Promise(resolve => setTimeout(resolve, Math.pow(2, i) * 1000));
        continue;
      }
      throw error;
    }
  }
}

Health

Vérification de l'état du serveur

Vérifier l'état de santé du serveur

Endpoint de health check, ne nécessite pas d'authentification

Responses

Response samples

Content type
application/json
{
  • "status": "healthy",
  • "timestamp": "2025-09-24T17:27:19.450Z",
  • "version": "1.0.0",
  • "services": {
    }
}

Accounts

Gestion des comptes SFTP

Lister tous les comptes SFTP

Retourne la liste de tous les comptes SFTP. Peut être filtrée par une liste d'account IDs via le paramètre accountIds.

Authorizations:
ApiKeyAuth
query Parameters
accountIds
string
Example: accountIds=123e4567-e89b-12d3-a456-426614174000,987fcdeb-51a2-4d6c-b543-678901234567

Liste d'account IDs séparés par des virgules pour filtrer les résultats

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": [
    ]
}

Créer un compte SFTP

Crée un nouveau compte SFTP pour un compte MediaGrade. Le client est responsable de la génération du username et du password.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...

UUID du compte MediaGrade

username
required
string >= 3 characters

SFTP username choisi par le client. Convention: mediagrade-{slug}-{8charHash}

password
required
string >= 8 characters

Mot de passe SFTP en clair. Sera bcrypt-hashé côté serveur.

Responses

Request samples

Content type
application/json
{
  • "accountId": "123e4567-e89b-12d3-a456-426614174000",
  • "username": "mediagrade-masociete-a1b2c3d4",
  • "password": "Xk9m$pR7#vB2nQ8z"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Obtenir les détails d'un compte

Retourne les informations détaillées d'un compte SFTP spécifique

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Supprimer un compte SFTP

Supprime définitivement un compte SFTP et tous ses fichiers. ⚠️ Attention : Cette opération est irréversible.

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "message": "SFTP account deleted successfully"
}

Mettre à jour le mot de passe

Change le mot de passe SFTP d'un compte. Le client doit fournir le nouveau mot de passe.

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

Request Body schema: application/json
required
password
required
string >= 8 characters

Nouveau mot de passe

Responses

Request samples

Content type
application/json
{
  • "password": "NouveauMotDePasse123!"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "message": "Password updated"
}

Mettre à jour le quota de stockage

Modifie la limite de stockage d'un compte.

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

Request Body schema: application/json
required
quotaBytes
required
integer [ 1073741824 .. 1099511627776 ]

Nouvelle limite en bytes

Responses

Request samples

Content type
application/json
{
  • "quotaBytes": 21474836480
}

Response samples

Content type
application/json
{
  • "success": true,
  • "message": "Quota updated"
}

Activer/Désactiver un compte

Active ou désactive l'accès SFTP d'un compte

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

Request Body schema: application/json
required
enabled
required
boolean

État souhaité (true = activé, false = désactivé)

Responses

Request samples

Content type
application/json
{
  • "enabled": false
}

Response samples

Content type
application/json
{
  • "success": true,
  • "message": "Account disabled"
}

Files

Gestion des fichiers et répertoires

Lister les fichiers d'un compte

Retourne la liste des fichiers et répertoires d'un compte avec pagination. Supporte le tri par nom, taille, date de création/modification.

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

query Parameters
path
string
Default: "/"
Example: path=/documents

Chemin du répertoire à lister. Doit être encodé en URL si contenant des caractères spéciaux. Exemple encodé : files%2FCapture%20d%27%C3%A9cran.png

limit
integer [ 1 .. 1000 ]
Default: 1000
Example: limit=50

Nombre maximum de fichiers à retourner

offset
integer >= 0
Default: 0

Décalage pour la pagination

sortBy
string
Default: "name"
Enum: "name" "size" "createdAt" "updatedAt"
Example: sortBy=createdAt

Champ de tri

sortOrder
string
Default: "asc"
Enum: "asc" "desc"
Example: sortOrder=desc

Sens du tri

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Obtenir une URL signée S3 pour uploader un fichier (presigned)

Pattern presigned URL. Le client demande une URL S3 signée puis fait un PUT direct vers cette URL avec les bytes du fichier — aucun byte ne transite par l'API Gateway, ce qui contourne la limite 10 MB.

const { data } = await fetch('/api/files/{accountId}/upload-url', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json', 'X-Api-Key': apiKey },
  body: JSON.stringify({ fileName: 'photo.jpg', path: '/folder', contentType: 'image/jpeg' })
}).then(r => r.json());
await fetch(data.uploadUrl, { method: 'PUT', body: file, headers: { 'Content-Type': data.contentType } });

L'URL signée expire après 1 h. Une fois l'upload réussi, la Lambda file-sync est déclenchée par S3 et met à jour le listing du compte.

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

Request Body schema: application/json
required
fileName
required
string
path
string

Chemin du dossier de destination (défaut: /)

contentType
string

MIME (défaut: déduit de l'extension)

Responses

Request samples

Content type
application/json
{
  • "fileName": "photo.jpg",
  • "path": "/documents",
  • "contentType": "image/jpeg"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Obtenir une URL signée S3 pour télécharger un fichier (presigned)

Pattern presigned URL. Retourne une URL S3 signée vers laquelle le client fait un GET pour récupérer les bytes directement, sans passer par l'API Gateway.

Pour un téléchargement multi-fichiers, voir download-batch qui construit un ZIP en arrière-plan.

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

query Parameters
path
required
string
Example: path=/documents/file.pdf

Responses

Response samples

Content type
application/json
{}

Télécharger un fichier (redirection vers URL signée S3)

Retourne un redirect HTTP 302 vers une URL S3 signée. Le client suit la redirection et télécharge directement depuis S3 ; aucun byte ne transite par l'API. Pas de support des requêtes Range côté API (S3 gère les Range sur l'URL signée).

Pour récupérer l'URL signée sans suivre la redirection, utiliser plutôt GET /api/files/{accountId}/download-url.

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

query Parameters
path
required
string
Example: path=/documents/file.pdf

Chemin du fichier à télécharger. Doit être encodé en URL si contenant des caractères spéciaux. Exemple encodé : files%2FCapture%20d%27%C3%A9cran.png

Responses

Response samples

Content type
application/json
{
  • "error": "Bad Request",
  • "message": "Invalid request parameters"
}

Démarrer la construction d'un ZIP multi-fichiers (async)

Pattern async job + polling propre au download-batch — antérieur au pattern unifié des delete/rename/move et donc légèrement différent : le statut se poll sur GET /api/files/{accountId}/download-batch/status/{jobId} (et non sur /api/jobs/{jobId}/status). Le résultat final est une URL signée S3 vers l'archive ZIP générée par un service Fargate.

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

Request Body schema: application/json
required
paths
required
Array of strings
archiveName
string
Default: "download.zip"

Nom de l'archive (alias: name). Défaut: download.zip

name
string

Alias historique de archiveName. Si les deux sont fournis, archiveName prime.

Responses

Request samples

Content type
application/json
{
  • "paths": [
    ],
  • "archiveName": "export.zip",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Statut d'un job download-batch

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

jobId
required
string

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Créer un répertoire

Crée un nouveau répertoire

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

Request Body schema: application/json
required
path
required
string

Chemin du répertoire à créer

Responses

Request samples

Content type
application/json
{
  • "path": "/nouveau-dossier"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "message": "Directory created"
}

Supprimer des fichiers/dossiers (async)

Pattern async job + polling. Retourne immédiatement 202 Accepted avec un jobId (préfixe dl-) et un statusUrl. Le client poll statusUrl jusqu'à un statut terminal.

Une retry avec le même Idempotency-Key renvoie le même jobId.

Sur status partial, errors[] liste les objets non-supprimés (avec leur motif S3) — le client peut proposer un retry ciblé.

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

header Parameters
Idempotency-Key
required
string [ 1 .. 128 ] characters
Example: 8a4f5b2c-9d1e-4f3a-b7c8-1e2d3f4a5b6c

Clé d'idempotence générée par le client (UUID v4 recommandé) pour une action utilisateur donnée. Une retry avec la même clé renvoie le même jobId — le serveur dédupe par (account_id, idempotency_key). Le client doit persister la clé tant que le job n'est pas terminal pour pouvoir retry sans risque de doublon.

Request Body schema: application/json
required
paths
required
Array of strings

Chemins à supprimer (fichiers ou dossiers)

Responses

Request samples

Content type
application/json
{
  • "paths": [
    ]
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Renommer un fichier ou dossier (async)

Pattern async job + polling. Pour un fichier seul, l'opération est rapide (~1 s perçu). Pour un dossier contenant beaucoup de fichiers, le worker copie chaque objet S3 puis supprime — peut prendre plusieurs secondes selon le volume.

Une retry avec le même Idempotency-Key renvoie le même jobId (préfixe rn-).

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

header Parameters
Idempotency-Key
required
string [ 1 .. 128 ] characters
Example: 8a4f5b2c-9d1e-4f3a-b7c8-1e2d3f4a5b6c

Clé d'idempotence générée par le client (UUID v4 recommandé) pour une action utilisateur donnée. Une retry avec la même clé renvoie le même jobId — le serveur dédupe par (account_id, idempotency_key). Le client doit persister la clé tant que le job n'est pas terminal pour pouvoir retry sans risque de doublon.

Request Body schema: application/json
required
oldPath
required
string
newPath
required
string

Responses

Request samples

Content type
application/json
{
  • "oldPath": "/ancien-nom.txt",
  • "newPath": "/nouveau-nom.txt"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Déplacer un ou plusieurs éléments vers un dossier (async)

Pattern async job + polling. Chaque source peut être un fichier ou un dossier; le worker copie sous destination/basename(source) puis supprime l'original. Préfixe du jobId : mv-.

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

header Parameters
Idempotency-Key
required
string [ 1 .. 128 ] characters
Example: 8a4f5b2c-9d1e-4f3a-b7c8-1e2d3f4a5b6c

Clé d'idempotence générée par le client (UUID v4 recommandé) pour une action utilisateur donnée. Une retry avec la même clé renvoie le même jobId — le serveur dédupe par (account_id, idempotency_key). Le client doit persister la clé tant que le job n'est pas terminal pour pouvoir retry sans risque de doublon.

Request Body schema: application/json
required
sourcePaths
required
Array of strings

Chemins à déplacer

destination
required
string

Dossier de destination

Responses

Request samples

Content type
application/json
{
  • "sourcePaths": [
    ],
  • "destination": "/destination"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Resynchroniser file_storage avec S3 (async, scopable)

Pattern async job + polling. Réconcilie la table file_storage avec le contenu réel S3 dans le scope demandé : insert/update des fichiers présents en S3, suppression des rows orphelines (fichiers ou dossiers qui n'existent plus en S3), borné au sous-arbre spécifié.

  • Sans path → resync complet du compte. Le worker recalcule used_bytes à la fin.
  • Avec path → resync limité au sous-arbre. used_bytes n'est pas recalculé (les events S3 + file-sync le maintiennent à jour pendant le fonctionnement normal).

Préfixe du jobId : rf-. Le worker utilise des opérations bulk SQL (jsonb_to_recordset + DELETE … NOT EXISTS) pour rester rapide quel que soit le volume — un compte de 50 K fichiers passe en quelques secondes côté worker.

Cas d'usage typique côté browser : appeler avec path: "<dossier courant>" à chaque clic refresh, pour ne resync que la vue affichée (~10 fois plus rapide que le refresh global).

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

header Parameters
Idempotency-Key
required
string [ 1 .. 128 ] characters
Example: 8a4f5b2c-9d1e-4f3a-b7c8-1e2d3f4a5b6c

Clé d'idempotence générée par le client (UUID v4 recommandé) pour une action utilisateur donnée. Une retry avec la même clé renvoie le même jobId — le serveur dédupe par (account_id, idempotency_key). Le client doit persister la clé tant que le job n'est pas terminal pour pouvoir retry sans risque de doublon.

Request Body schema: application/json
optional
path
string

Sous-arbre à resync (chemin utilisateur, ex. /Folder/Sub). Si absent, vide ou /, resync complet du compte. Le serveur normalise les slashes et rejette les segments ...

recursive
boolean
Default: true
  • true (défaut) : resync du dossier ET de tous ses sous-dossiers. Le mode standard.
  • false : resync uniquement des enfants directs (fichiers du dossier + sous-dossiers visibles, sans descendre dans leur contenu). À utiliser quand on veut juste rafraîchir la vue affichée et qu'on est sûr que les profondeurs ne sont pas concernées. used_bytes n'est recalculé que sur un refresh complet (path absent et recursive: true).

Responses

Request samples

Content type
application/json
{
  • "path": "/Mirakulous",
  • "recursive": true
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Rechercher des fichiers par nom (sync, paginé)

Pattern sync direct. Recherche par sous-chaîne (ILIKE) sur file_name, optionnellement scopée à un dossier. Le résultat est paginé via limit / offset.

Le terme de recherche q doit faire au moins 2 caractères.

Authorizations:
ApiKeyAuth
path Parameters
accountId
required
string^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89...
Example: 123e4567-e89b-12d3-a456-426614174000

UUID du compte MediaGrade

query Parameters
q
required
string >= 2 characters
Example: q=document

Sous-chaîne à chercher dans le nom (ILIKE), 2 caractères minimum

path
string
Example: path=/documents

Restreindre à un sous-arbre (chemin utilisateur)

limit
integer [ 1 .. 500 ]
Default: 100
offset
integer >= 0
Default: 0

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Jobs

Statut des opérations asynchrones (delete, rename, move, refresh)

Statut d'un job async (delete / rename / move / refresh)

Retourne l'état courant d'un job. Le préfixe du jobId (dl-, rn-, mv-, rf-) identifie la table sous-jacente — le client n'a pas à s'en préoccuper.

Pour un job refresh, la réponse inclut en plus data.scopePath (chemin du sous-arbre resync ou null si compte complet), data.syncedCount (fichiers upserted) et data.removedCount (orphelins supprimés).

Cadence de polling recommandée : 500 ms initial, backoff exponentiel plafonné à 5 s. La progression est mise à jour côté worker toutes les 50 items ou 1 s, donc poller plus vite n'apporte rien.

const url = `/api/jobs/${jobId}/status`;
let delay = 500;
while (true) {
  const r = await fetch(url, { headers: { 'X-Api-Key': apiKey } });
  const { data } = await r.json();
  updateProgressBar(data.progress.percent);
  if (['completed', 'partial', 'error'].includes(data.status)) return data;
  await new Promise(r => setTimeout(r, delay));
  delay = Math.min(delay * 2, 5000);
}
Authorizations:
ApiKeyAuth
path Parameters
jobId
required
string^(dl|rn|mv|rf)-[0-9a-f]{32}$
Example: rn-7c1f5a3b8e2d4f6a9b0c1d2e3f4a5b6c

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

System

Informations système et statistiques

Statistiques serveur

Retourne les statistiques globales du serveur SFTP

Authorizations:
ApiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Informations système

Retourne le nom du service, sa version, l'environnement et l'architecture courante.

Authorizations:
ApiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}