Documentation API

L'API DuupFlow, point par point

Duplique des images et des vidéos, compresse et retire la détection IA depuis tes propres outils (scripts, Make, n8n, Zapier, agents IA). Cette page contient tout ce qu'il faut savoir — y compris pour l'assistant IA à qui tu poses tes questions.

Résumé (pour les humains et les assistants IA)

  • API REST : https://www.duupflow.com/api/v1, authentification par en-tête Authorization: Bearer dflw_live_….
  • Incluse sans frais dans les plans Pro et Agence (pas dans Solo ni le plan gratuit). Duplications illimitées via l'API.
  • Images : réponse immédiate (le fichier, ou un zip). Vidéos : asynchrone (un job à suivre, puis téléchargement).
  • Limites : 300 requêtes/min par clé · 100 jobs vidéo en attente · images ≤ 25 Mo (1–20 copies) · vidéos ≤ 150 Mo et ≤ 120 s (1–10 copies).
  • Formats vidéo : mp4, mov, mkv, avi, webm — le vertical 9:16 (Reels, TikTok, Shorts) est pris en charge, résolution et qualité conservées.
  • Résultats téléchargeables pendant 16 h. Webhook de fin de traitement : en cours de développement (pour l'instant, interroger le job toutes les 5–10 s).
  • Pas d'essai gratuit de l'API ; le Pro mensuel est sans engagement. Une démo est possible via le support Telegram.

1. À quoi sert l'API

L'API donne accès, sans passer par le site, aux mêmes traitements que le dashboard DuupFlow :

  • Dupliquer une image en 1 à 20 copies uniques (métadonnées, pixels invisibles, identité d'appareil).
  • Dupliquer une vidéo en 1 à 10 copies uniques, identiques à l'œil.
  • Compresser une image sans jamais l'alourdir.
  • Retirer la détection IA d'une image, ou l'activer en option sur une duplication.

Cas typiques : automatiser un flux de publication multi-comptes, brancher DuupFlow dans Make / n8n / Zapier (module HTTP), ou laisser un agent IA (Claude Code, scripts) lancer les duplications.

2. Accès et tarifs

PlanAccès APIPrix indicatif
Gratuit / SoloNon—
ProOui, sans frais en plus99 €/mois, ou 70 €/mois en annuel
AgenceOui, sans frais en plus249 €/mois, ou 176 €/mois en annuel
  • Les duplications via l'API sont illimitées sur Pro et Agence — pas de quota mensuel, pas de coût à l'appel.
  • Les invités d'une équipe Pro ou Agence peuvent créer leurs propres clés.
  • Pas d'essai gratuit de l'API. Le Pro mensuel est sans engagement (résiliable à tout moment). Une démo personnalisée est possible via le support Telegram.
  • Les prix à jour sont toujours sur la page Tarifs.

3. Démarrage rapide

  1. 1Passe sur le plan Pro ou Agence.
  2. 2Dans le dashboard, ouvre Développeurs et clique sur Générer une clé.
  3. 3Copie la clé tout de suite : elle n'est affichée qu'une seule fois.
  4. 4Vérifie qu'elle fonctionne avec GET /me (exemple ci-dessous).
  5. 5Lance ta première duplication.
Tester la clé
curl -H "Authorization: Bearer dflw_live_YOUR_KEY" \
  https://www.duupflow.com/api/v1/me
Réponse
{ "user_id": "…", "plan": "pro", "api_version": "v1" }

4. Authentification et clés

  • Chaque requête envoie l'en-tête Authorization: Bearer dflw_live_….
  • Jusqu'à 3 clés par compte (une par intégration, par exemple).
  • Une clé supprimée est désactivée immédiatement et ne peut pas être récupérée.
  • Si l'abonnement passe sous le plan Pro ou se retrouve en défaut de paiement, l'API répond 403 plan_required jusqu'à régularisation.
Une clé donne accès à ton compte : garde-la côté serveur (variables d'environnement, coffre de secrets). Ne la mets jamais dans du code front-end, une application mobile ou un dépôt public. En cas de fuite, supprime-la et génère-en une nouvelle.

5. Dupliquer une image

POST/api/v1/images/duplicateSynchrone — renvoie directement le résultat.
ChampValeurDéfaut
fileImage png, jpg, jpeg, webp, gif, heic, heif — ≤ 25 Morequis
countNombre de copies, 1 à 201
fundamentalsMétadonnées réécrites1
semiRetouche de pixels imperceptible1
visualsLéger décalage visuel0
reverseEffet miroir horizontal0
iphone_metaIdentité d'iPhone réaliste (EXIF Apple)0
countryCode pays ISO (ex. FR, US) pour la localisation—
remove_ai_detectionRetirer la détection IA avant duplication0

Réponse : 1 copie → le fichier image directement ; plusieurs copies → une archive zip. Les noms de fichiers sont neutres (aucune mention de DuupFlow).

Exemple
curl -X POST https://www.duupflow.com/api/v1/images/duplicate \
  -H "Authorization: Bearer dflw_live_YOUR_KEY" \
  -F "file=@photo.jpg" \
  -F "count=3" \
  -F "iphone_meta=1" \
  -o copies.zip

6. Dupliquer une vidéo (asynchrone)

POST/api/v1/videos/duplicateAsynchrone — crée un job et répond 202 tout de suite.
ChampValeurDéfaut
fileVidéo mp4, mov, mkv, avi, webm — ≤ 150 Mo et ≤ 120 srequis
countNombre de copies, 1 à 101
packsListe séparée par des virgules : visual, motion, metadata_technical, pixel_magicvisual,motion,metadata_technical
countryCode pays ISO pour les métadonnées de localisation—
iphone_metaMétadonnées d'iPhone réalistes (sortie .mov, HEVC)0
remove_ai_detectionContre-filigrane invisible, différent sur chaque copie0
  • visual : micro-variations de luminosité, contraste et couleur, invisibles à l'œil.
  • motion : léger mouvement de caméra.
  • metadata_technical : paramètres d'encodage et métadonnées techniques uniques.
  • pixel_magic : bruit imperceptible pour une empreinte unique.

La résolution et la qualité d'origine sont conservées (4K comprise), et une copie n'est jamais plus lourde que la source. Le 9:16 vertical est pris en charge.

Lancer le job
curl -X POST https://www.duupflow.com/api/v1/videos/duplicate \
  -H "Authorization: Bearer dflw_live_YOUR_KEY" \
  -F "file=@clip.mp4" \
  -F "count=3" \
  -F "packs=visual,motion,metadata_technical"
Réponse (202)
{
  "job_id": "3f1c…",
  "status": "queued",
  "poll_url": "https://www.duupflow.com/api/v1/jobs/3f1c…"
}

7. Suivre un job et télécharger

GET/api/v1/jobs/:idÉtat du job et liens de téléchargement.
  • status : queued → processing → completed ou failed.
  • progress : 0 à 100 ; message : étape en cours.
  • Quand completed, result.files liste chaque copie avec son url.
  • Quand failed, error explique pourquoi (fichier illisible, trop long…).
  • Si le serveur est momentanément saturé, le job est relancé automatiquement (il repasse en queued) — rien à faire de ton côté.
Réponse (terminé)
{
  "id": "3f1c…",
  "type": "videos.duplicate",
  "status": "completed",
  "progress": 100,
  "message": "Done",
  "result": {
    "files": [
      { "name": "…_c01_….mp4", "bytes": 8123456, "url": "https://www.duupflow.com/api/v1/jobs/3f1c…/files/…_c01_….mp4" }
    ]
  },
  "error": null,
  "created_at": "2026-10-29T10:00:00Z"
}
GET/api/v1/jobs/:id/files/:nameTélécharge une copie — avec la même clé API.
Télécharger
curl -H "Authorization: Bearer dflw_live_YOUR_KEY" \
  "https://www.duupflow.com/api/v1/jobs/JOB_ID/files/FILE_NAME" -o copy.mp4
Les fichiers produits restent disponibles 16 heures, puis sont supprimés. Télécharge-les dès que le job est terminé. Un temps de traitement typique est de quelques dizaines de secondes à quelques minutes par vidéo, selon sa durée, sa résolution et la charge.

8. Exemple complet (vidéo)

Python
import time, requests

API = "https://www.duupflow.com/api/v1"
H = {"Authorization": "Bearer dflw_live_YOUR_KEY"}

# 1) Start the job
with open("clip.mp4", "rb") as f:
    r = requests.post(f"{API}/videos/duplicate", headers=H,
                      files={"file": f}, data={"count": "3"})
r.raise_for_status()
job_id = r.json()["job_id"]

# 2) Poll until it's done
while True:
    job = requests.get(f"{API}/jobs/{job_id}", headers=H).json()
    if job["status"] in ("completed", "failed"):
        break
    time.sleep(8)

# 3) Download every copy
if job["status"] == "completed":
    for f in job["result"]["files"]:
        data = requests.get(f["url"], headers=H).content
        open(f["name"], "wb").write(data)
else:
    print("Failed:", job["error"])
Node.js
const API = "https://www.duupflow.com/api/v1";
const H = { Authorization: "Bearer dflw_live_YOUR_KEY" };

const form = new FormData();
form.append("file", new Blob([await fs.promises.readFile("clip.mp4")]), "clip.mp4");
form.append("count", "3");

const { job_id } = await (await fetch(`${API}/videos/duplicate`, { method: "POST", headers: H, body: form })).json();

let job;
do {
  await new Promise((r) => setTimeout(r, 8000));
  job = await (await fetch(`${API}/jobs/${job_id}`, { headers: H })).json();
} while (job.status === "queued" || job.status === "processing");

for (const f of job.result?.files ?? []) {
  const buf = Buffer.from(await (await fetch(f.url, { headers: H })).arrayBuffer());
  await fs.promises.writeFile(f.name, buf);
}

Dans Make, n8n ou Zapier : un module HTTP « multipart/form-data » pour lancer le job, une boucle avec temporisation (8 s) sur GET /jobs/:id, puis un module HTTP par fichier pour le télécharger.

9. Compresser une image

POST/api/v1/compressSynchrone — renvoie l'image compressée.
ChampValeurDéfaut
fileImage png, jpg, jpeg, webp — ≤ 25 Morequis
levellight, balanced ou strongbalanced

Le résultat n'est jamais plus lourd que l'original (sinon l'original est renvoyé). Le gain est indiqué dans les en-têtes X-DuupFlow-Saved-Percent, X-DuupFlow-Original-Bytes et X-DuupFlow-Output-Bytes. La compression vidéo via l'API n'est pas encore disponible.

Exemple
curl -X POST https://www.duupflow.com/api/v1/compress \
  -H "Authorization: Bearer dflw_live_YOUR_KEY" \
  -F "file=@photo.jpg" -F "level=strong" -D headers.txt -o compressed.jpg

10. Retirer la détection IA

POST/api/v1/ai-detectionSynchrone — renvoie l'image nettoyée.

Efface les métadonnées de provenance IA (C2PA, XMP…) et retouche les pixels de façon invisible (grain, micro-flou, couleurs), en gardant le format et la résolution. Image jpg, png ou webp ≤ 25 Mo. Pour les vidéos, utilise l'option remove_ai_detection de /videos/duplicate.

Soyons honnêtes : aucun outil ne peut garantir qu'un contenu ne sera jamais détecté. Un filigrane robuste intégré par certains générateurs (type SynthID) est conçu pour survivre à ce genre de traitement, et les plateformes utilisent aussi leurs propres classifieurs.
Exemple
curl -X POST https://www.duupflow.com/api/v1/ai-detection \
  -H "Authorization: Bearer dflw_live_YOUR_KEY" \
  -F "file=@image.png" -o cleaned.png

11. Limites

ÉlémentLimite
Requêtes300 par minute et par clé
Jobs vidéo en attente100 par compte
Image — taille / copies25 Mo / 1 à 20 copies
Vidéo — taille / durée / copies150 Mo / 120 s / 1 à 10 copies
Conservation des résultats vidéo16 heures
Clés API3 par compte
DuplicationsIllimitées (Pro et Agence)

12. Erreurs

Toutes les erreurs ont le même format JSON :

JSON
{ "error": { "code": "file_too_large", "message": "File exceeds the 150 MB limit." } }
HTTPcodeQue faire
400invalid_body · missing_file · read_failedEnvoyer un multipart/form-data avec un champ file.
401missing_key · invalid_keyVérifier l'en-tête Authorization et que la clé n'a pas été supprimée.
403plan_requiredLe compte doit être sur Pro ou Agence, paiement à jour.
404job_not_found · file_not_foundMauvais identifiant, ou résultat expiré (16 h).
413file_too_largeRéduire le fichier sous la limite.
415unsupported_type · video_not_supportedUtiliser un format accepté (extension du fichier comprise).
429rate_limited · too_many_jobsAttendre (en-tête Retry-After) puis réessayer.
500processing_failed · store_failedRéessayer ; si ça persiste, contacter le support.

13. Bonnes pratiques

  • Interroger un job toutes les 5 à 10 secondes, pas plus souvent.
  • Sur 429 ou 5xx : réessayer avec un délai croissant (backoff).
  • Garder la bonne extension dans le nom de fichier envoyé : c'est elle qui détermine le format.
  • Télécharger les résultats dès la fin du job (ils expirent après 16 h).
  • Une clé par intégration : en cas de problème, tu en coupes une sans casser les autres.
  • Chaque appel produit des copies différentes : relancer la même source donne de nouvelles variantes.

14. Webhooks

Une notification automatique (webhook) vers ton URL à la fin d'un job est en cours de développement. En attendant, interroge GET /jobs/:id.

15. Questions fréquentes

QuestionRéponse
Peut-on tout automatiser sans toucher au site ?Oui. Une fois la clé créée, tout se fait par l'API.
Y a-t-il un coût par appel ou un quota ?Non. L'API est incluse dans Pro et Agence, duplications illimitées. Seules les limites techniques s'appliquent (section 11).
Fonctionne avec Make, n8n, Zapier ?Oui, via leur module HTTP (multipart/form-data).
Les vidéos verticales 9:16 sont-elles prises en charge ?Oui, et la résolution d'origine est conservée.
Une copie peut-elle être plus lourde que l'original ?Non, le débit est plafonné sur celui de la source.
Peut-on choisir un « créateur » (workspace) via l'API ?Non, l'API agit au niveau du compte. Les créateurs se gèrent dans le dashboard.
Peut-on enregistrer des réglages prédéfinis ?Il suffit de renvoyer les mêmes paramètres à chaque appel depuis ton script.
Combien de temps les fichiers sont-ils gardés ?Les résultats vidéo 16 h. Les fichiers envoyés sont supprimés après traitement.
Peut-on tester avant d'acheter ?Pas d'essai gratuit de l'API ; le Pro mensuel est sans engagement, et une démo est possible via le support.
Y a-t-il un webhook ?En cours de développement ; pour l'instant, polling de GET /jobs/:id.
La détection IA est-elle garantie ?Non, aucun outil ne peut le garantir (voir section 10).
Où trouver de l'aide ?Support Telegram : t.me/DuupFlow_Support.