Profil + solde crédits + abonnement + métadonnées de la clé API courante.
Response
{
"user": { "id": "user_…", "email": "…", "createdAt": "…" },
"credits": { "balance": 4750, "monthlyQuota": 5300, "usedThisMonth": 550 },
"subscription": { "planId": "pro", "status": "active", "currentPeriodEnd": "…" },
"apiKey": { "id": "…", "scopes": ["read","generate"], "rateLimit": { "perMinute": 60, "perDay": 5000 } }
}
cURL
curl -H "Authorization: Bearer sk_swp_xxx" https://swappr.fr/api/v1/me
JavaScript
const res = await fetch("https://swappr.fr/api/v1/me", {
headers: { Authorization: `Bearer ${SWAPPR_KEY}` },
});
const data = await res.json();
Python
import requests
r = requests.get("https://swappr.fr/api/v1/me",
headers={"Authorization": f"Bearer {SWAPPR_KEY}"})
print(r.json())
GET/api/v1/jobsscope: readListe les jobs actifs et récemment terminés. `?include=active,recent&limit=40`.
Response
{
"jobs": [{ "id": "…", "status": "processing", "workflow": "studio_image", "createdAt": "…" }],
"hasMore": false
}
cURL
curl -H "Authorization: Bearer sk_swp_xxx" "https://swappr.fr/api/v1/jobs?include=active,recent&limit=40"
JavaScript
await fetch("https://swappr.fr/api/v1/jobs?include=active,recent", { headers: { Authorization: `Bearer ${k}` }})
Python
requests.get("https://swappr.fr/api/v1/jobs?include=active,recent", headers={"Authorization": f"Bearer {k}"})
POST/api/v1/studio/image/generatescope: generateLance une génération image. Retourne un jobId à poller. Modèles : gpt-image-2, nano-banana-2, seedream-45, wan-27-image, qwen-image, grok-imagine. Avec nsfw=true : défaut seedream-45, 3 guards API (plan, consentement dashboard, modèle compatible).
Request body
{
"prompt": "luxury café interior, golden hour, cinematic",
"modelId": "seedream-45",
"imageCount": 1,
"aspectRatio": "4:5",
"nsfw": false,
"referenceImageUrls": []
}
Response
{ "jobId": "…", "batchId": "…", "status": "queued", "creditsCharged": 10 }
cURL
curl -X POST https://swappr.fr/api/v1/studio/image/generate \
-H "Authorization: Bearer sk_swp_xxx" \
-H "Content-Type: application/json" \
-d '{"prompt":"café interior","modelId":"seedream-45","aspectRatio":"4:5"}'
JavaScript
const res = await fetch("https://swappr.fr/api/v1/studio/image/generate", {
method: "POST",
headers: { Authorization: `Bearer ${k}`, "Content-Type": "application/json" },
body: JSON.stringify({ prompt: "café interior", modelId: "seedream-45" }),
});
Python
requests.post("https://swappr.fr/api/v1/studio/image/generate",
headers={"Authorization": f"Bearer {k}", "Content-Type": "application/json"},
json={"prompt": "café interior", "modelId": "seedream-45"})
GET/api/v1/studio/modelsscope: readCatalogue des modèles Studio image/vidéo : tarifs, qualités, ratios, support NSFW.
Response
{
"imageModels": [{ "id": "seedream-45", "label": "Seedream 4.5", "nsfwCapable": true }],
"videoModels": [{ "id": "kling-3", "label": "Kling", "durations": [5, 10] }]
}
cURL
curl -H "Authorization: Bearer sk_swp_xxx" https://swappr.fr/api/v1/studio/models
JavaScript
await fetch("https://swappr.fr/api/v1/studio/models", { headers: { Authorization: `Bearer ${k}` }})
Python
requests.get("https://swappr.fr/api/v1/studio/models", headers={"Authorization": f"Bearer {k}"})
POST/api/v1/studio/video/generatescope: generateLance une génération vidéo asynchrone. Supporte références image/vidéo, audio selon modèle, ratios et durées.
Request body
{
"prompt": "cinematic rooftop reel",
"modelId": "kling-3",
"aspectRatio": "9:16",
"duration": 5,
"referenceImageUrls": ["https://…"],
"generateAudio": false
}
Response
{ "jobId": "…", "status": "queued", "creditsCharged": 120 }
cURL
curl -X POST https://swappr.fr/api/v1/studio/video/generate \
-H "Authorization: Bearer sk_swp_xxx" -H "Content-Type: application/json" \
-d '{"prompt":"rooftop reel","modelId":"kling-3","aspectRatio":"9:16","duration":5}'
JavaScript
await fetch("https://swappr.fr/api/v1/studio/video/generate", {
method: "POST",
headers: { Authorization: `Bearer ${k}`, "Content-Type": "application/json" },
body: JSON.stringify({ prompt: "rooftop reel", modelId: "kling-3", duration: 5 }),
});
Python
requests.post("https://swappr.fr/api/v1/studio/video/generate",
headers={"Authorization": f"Bearer {k}", "Content-Type": "application/json"},
json={"prompt": "rooftop reel", "modelId": "kling-3", "duration": 5})
POST/api/v1/studio/audio/ttsscope: generateSynthèse vocale ElevenLabs synchrone. Retourne un média audio et débite les crédits au tarif Studio Son.
Request body
{
"text": "Bienvenue sur Swappr.",
"voiceId": "VOICE_ID",
"modelId": "eleven_multilingual_v2",
"languageCode": "fr"
}
Response
{ "url": "https://…/audio.mp3", "mediaType": "audio", "creditsCharged": 4 }
cURL
curl -X POST https://swappr.fr/api/v1/studio/audio/tts \
-H "Authorization: Bearer sk_swp_xxx" -H "Content-Type: application/json" \
-d '{"text":"Bienvenue sur Swappr.","voiceId":"VOICE_ID"}'
JavaScript
await fetch("https://swappr.fr/api/v1/studio/audio/tts", {
method: "POST",
headers: { Authorization: `Bearer ${k}`, "Content-Type": "application/json" },
body: JSON.stringify({ text: "Bienvenue sur Swappr.", voiceId: "VOICE_ID" }),
});
Python
requests.post("https://swappr.fr/api/v1/studio/audio/tts",
headers={"Authorization": f"Bearer {k}", "Content-Type": "application/json"},
json={"text": "Bienvenue sur Swappr.", "voiceId": "VOICE_ID"})
POST/api/v1/studio/audio/dialoguescope: generateDialogue multi-voix ElevenLabs synchrone, jusqu'à 10 répliques.
Request body
{
"inputs": [
{ "text": "Salut !", "voiceId": "VOICE_A" },
{ "text": "On tourne maintenant ?", "voiceId": "VOICE_B" }
],
"languageCode": "fr"
}
Response
{ "url": "https://…/dialogue.mp3", "mediaType": "audio", "creditsCharged": 8 }
cURL
curl -X POST https://swappr.fr/api/v1/studio/audio/dialogue \
-H "Authorization: Bearer sk_swp_xxx" -H "Content-Type: application/json" \
-d '{"inputs":[{"text":"Salut !","voiceId":"VOICE_A"}]}'
JavaScript
await fetch("https://swappr.fr/api/v1/studio/audio/dialogue", {
method: "POST",
headers: { Authorization: `Bearer ${k}`, "Content-Type": "application/json" },
body: JSON.stringify({ inputs: [{ text: "Salut !", voiceId: "VOICE_A" }] }),
});
Python
requests.post("https://swappr.fr/api/v1/studio/audio/dialogue",
headers={"Authorization": f"Bearer {k}", "Content-Type": "application/json"},
json={"inputs": [{"text": "Salut !", "voiceId": "VOICE_A"}]})
GET/api/v1/jobs/{id}scope: readStatut + outputs d'un job. Poll toutes les 3 s recommandé.
Response
{
"id": "…", "status": "completed", "outputs": ["https://…"],
"creditsCharged": 10, "createdAt": "…", "updatedAt": "…"
}
cURL
curl -H "Authorization: Bearer sk_swp_xxx" https://swappr.fr/api/v1/jobs/JOB_ID
JavaScript
await fetch(`https://swappr.fr/api/v1/jobs/${jobId}`, { headers: { Authorization: `Bearer ${k}` }})
Python
requests.get(f"https://swappr.fr/api/v1/jobs/{job_id}", headers={"Authorization": f"Bearer {k}"})
POST/api/v1/uploadsscope: generateUpload multipart d'un fichier de référence image, vidéo ou audio. Utilisez ensuite `storagePath` ou `url` dans les endpoints génératifs.
Response
{ "url": "https://…", "storagePath": "api-uploads/user/…", "mimeType": "image/jpeg", "size": 123456 }
cURL
curl -X POST https://swappr.fr/api/v1/uploads \
-H "Authorization: Bearer sk_swp_xxx" \
-F "[email protected]"
JavaScript
const form = new FormData();
form.append("file", file);
await fetch("https://swappr.fr/api/v1/uploads", { method: "POST", headers: { Authorization: `Bearer ${k}` }, body: form });
Python
requests.post("https://swappr.fr/api/v1/uploads",
headers={"Authorization": f"Bearer {k}"},
files={"file": open("reference.jpg", "rb")})
GET/api/v1/nsfw/statusscope: readÉtat d'accès NSFW : plan compatible, consentement signé, mode disponible.
Response
{ "eligible": true, "consentRequired": false, "planId": "pro", "surchargeMultiplier": 1.25 }
cURL
curl -H "Authorization: Bearer sk_swp_xxx" https://swappr.fr/api/v1/nsfw/status
JavaScript
await fetch("https://swappr.fr/api/v1/nsfw/status", { headers: { Authorization: `Bearer ${k}` }})
Python
requests.get("https://swappr.fr/api/v1/nsfw/status", headers={"Authorization": f"Bearer {k}"})
GET/api/v1/library/itemsscope: readListe paginée des médias de la bibliothèque. `?kind=saved|temporary&limit=20&cursor=<iso>`.
Response
{
"items": [{ "id": "…", "url": "…", "mediaType": "image", "retention": "saved", "createdAt": "…", "jobId": "…" }],
"nextCursor": "2026-06-12T12:00:00Z",
"hasMore": true
}
cURL
curl -H "Authorization: Bearer sk_swp_xxx" "https://swappr.fr/api/v1/library/items?limit=20&kind=saved"
JavaScript
await fetch("https://swappr.fr/api/v1/library/items?limit=20", { headers: { Authorization: `Bearer ${k}` }})
Python
requests.get("https://swappr.fr/api/v1/library/items?limit=20", headers={"Authorization": f"Bearer {k}"})
POST/api/v1/library/items/{id}/savescope: generateSauvegarde permanente d'un média temporaire de la bibliothèque.
Request body
{ "mediaType": "image", "modelId": "seedream-45" }
Response
{ "id": "…", "retention": "saved", "url": "https://…" }
cURL
curl -X POST https://swappr.fr/api/v1/library/items/ITEM_ID/save \
-H "Authorization: Bearer sk_swp_xxx" -H "Content-Type: application/json" -d '{}'
JavaScript
await fetch("https://swappr.fr/api/v1/library/items/ITEM_ID/save", { method: "POST", headers: { Authorization: `Bearer ${k}` }})
Python
requests.post("https://swappr.fr/api/v1/library/items/ITEM_ID/save", headers={"Authorization": f"Bearer {k}"})
GET/api/v1/modelsscope: readListe des personas/modèles IA enregistrés par l'utilisateur, utilisables comme référence d'identité.
Response
{ "models": [{ "id": "…", "name": "Maya", "imageUrl": "https://…", "createdAt": "…" }] }
cURL
curl -H "Authorization: Bearer sk_swp_xxx" https://swappr.fr/api/v1/models
JavaScript
await fetch("https://swappr.fr/api/v1/models", { headers: { Authorization: `Bearer ${k}` }})
Python
requests.get("https://swappr.fr/api/v1/models", headers={"Authorization": f"Bearer {k}"})
GET/api/v1/faceswap/pricingscope: readTarifs Face Swap HD et refinement selon moteur, NSFW et options.
Response
{ "baseCredits": 15, "refineCredits": 9, "nsfwMultiplier": 1.25 }
cURL
curl -H "Authorization: Bearer sk_swp_xxx" https://swappr.fr/api/v1/faceswap/pricing
JavaScript
await fetch("https://swappr.fr/api/v1/faceswap/pricing", { headers: { Authorization: `Bearer ${k}` }})
Python
requests.get("https://swappr.fr/api/v1/faceswap/pricing", headers={"Authorization": f"Bearer {k}"})
POST/api/v1/faceswap/generatescope: generateFace Swap HD asynchrone : source + cible via URL publique ou `storagePath` d'upload.
Request body
{
"sourceImageUrl": "https://…/face.jpg",
"targetImageUrl": "https://…/scene.jpg",
"engine": "gpt",
"nsfw": false
}
Response
{ "jobId": "…", "status": "queued", "creditsCharged": 15 }
cURL
curl -X POST https://swappr.fr/api/v1/faceswap/generate \
-H "Authorization: Bearer sk_swp_xxx" -H "Content-Type: application/json" \
-d '{"sourceImageUrl":"https://…/face.jpg","targetImageUrl":"https://…/scene.jpg"}'
JavaScript
await fetch("https://swappr.fr/api/v1/faceswap/generate", {
method: "POST",
headers: { Authorization: `Bearer ${k}`, "Content-Type": "application/json" },
body: JSON.stringify({ sourceImageUrl: "https://…/face.jpg", targetImageUrl: "https://…/scene.jpg" }),
});
Python
requests.post("https://swappr.fr/api/v1/faceswap/generate",
headers={"Authorization": f"Bearer {k}", "Content-Type": "application/json"},
json={"sourceImageUrl": "https://…/face.jpg", "targetImageUrl": "https://…/scene.jpg"})
POST/api/v1/faceswap/refinescope: generateFinition/réalisme post Face Swap. Utile après un swap validé pour améliorer lumière, peau et blending.
Request body
{ "imageUrl": "https://…/swap.jpg", "engine": "gpt", "nsfw": false }
Response
{ "jobId": "…", "status": "queued", "creditsCharged": 9 }
cURL
curl -X POST https://swappr.fr/api/v1/faceswap/refine \
-H "Authorization: Bearer sk_swp_xxx" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://…/swap.jpg"}'
JavaScript
await fetch("https://swappr.fr/api/v1/faceswap/refine", {
method: "POST",
headers: { Authorization: `Bearer ${k}`, "Content-Type": "application/json" },
body: JSON.stringify({ imageUrl: "https://…/swap.jpg" }),
});
Python
requests.post("https://swappr.fr/api/v1/faceswap/refine",
headers={"Authorization": f"Bearer {k}", "Content-Type": "application/json"},
json={"imageUrl": "https://…/swap.jpg"})
GET/api/v1/camera-roll/pricingscope: readTarifs Camera Roll safe-only selon moteur, résolution et nombre de photos.
Response
{ "engines": ["gpt", "nano"], "qualities": ["1k", "2k", "4k"], "photoCounts": [4, 8, 12, 20] }
cURL
curl -H "Authorization: Bearer sk_swp_xxx" https://swappr.fr/api/v1/camera-roll/pricing
JavaScript
await fetch("https://swappr.fr/api/v1/camera-roll/pricing", { headers: { Authorization: `Bearer ${k}` }})
Python
requests.get("https://swappr.fr/api/v1/camera-roll/pricing", headers={"Authorization": f"Bearer {k}"})
GET/api/v1/camera-roll/scenesscope: readCatalogue des scènes Camera Roll iPhone-style, filtrable par vibe/catégorie.
Response
{ "scenes": [{ "id": "parking-selfie", "title": "Parking selfie", "category": "lifestyle" }] }
cURL
curl -H "Authorization: Bearer sk_swp_xxx" https://swappr.fr/api/v1/camera-roll/scenes
JavaScript
await fetch("https://swappr.fr/api/v1/camera-roll/scenes", { headers: { Authorization: `Bearer ${k}` }})
Python
requests.get("https://swappr.fr/api/v1/camera-roll/scenes", headers={"Authorization": f"Bearer {k}"})
POST/api/v1/camera-roll/generatescope: generateGénère une galerie Camera Roll cohérente depuis une identité ou une référence. `subjectGender` accepte `feminine`, `masculine`, `neutral`, `auto`.
Request body
{
"prompt": "night parking, casual selfie",
"sceneIds": ["parking-selfie"],
"photoCount": 5,
"engine": "gpt",
"aspectRatio": "3:4",
"subjectGender": "feminine"
}
Response
{ "batchId": "…", "jobIds": ["…"], "status": "queued", "creditsCharged": 75 }
cURL
curl -X POST https://swappr.fr/api/v1/camera-roll/generate \
-H "Authorization: Bearer sk_swp_xxx" -H "Content-Type: application/json" \
-d '{"prompt":"night parking","sceneIds":["parking-selfie"],"photoCount":5,"subjectGender":"feminine"}'
JavaScript
await fetch("https://swappr.fr/api/v1/camera-roll/generate", {
method: "POST",
headers: { Authorization: `Bearer ${k}`, "Content-Type": "application/json" },
body: JSON.stringify({ prompt: "night parking", sceneIds: ["parking-selfie"], photoCount: 5, subjectGender: "feminine" }),
});
Python
requests.post("https://swappr.fr/api/v1/camera-roll/generate",
headers={"Authorization": f"Bearer {k}", "Content-Type": "application/json"},
json={"prompt": "night parking", "sceneIds": ["parking-selfie"], "photoCount": 5, "subjectGender": "feminine"})