Pro API : piloter le rendu cloud depuis ton propre serveur
Tout ce que l'application fait en ligne (images, retouches, vidéos, personnages entraînés) est aussi accessible via HTTP, au même prix en crédits, sans que l'application soit ouverte. Tu le pilotes depuis ton propre serveur, tes scripts ou ton agent, en utilisant les crédits de ta licence.
Disponible avec la licence Pro. La clé est créée dans l'application, sous Paramètres > API.
| Base | https://api.tendre.ai/pro/v1 |
| Authentification | en-tête Authorization: Bearer tk_pro_... |
| Format | JSON en entrée et en sortie, PNG pour les images, MP4 pour les vidéos |
| Description machine | openapi-pro.yaml (OpenAPI 3.0), pour générer un client |
Obtenir une clé
Dans l'application, avec une licence Pro : Paramètres > API > Nouvelle clé. Donne-lui un nom ("serveur de production", par exemple), choisis ses permissions et, si tu le souhaites, un plafond journalier de crédits et une date d'expiration.
La clé est affichée une seule fois. Copie-la immédiatement. Une clé perdue est remplacée, jamais récupérée.
- Trois clés actives par licence au maximum. De quoi en faire tourner une sans couper le service : crée la nouvelle, installe-la, révoque l'ancienne.
- Une clé n'est pas un siège. Ton ordinateur et ton téléphone restent utilisables en parallèle.
- Une clé vaut tes crédits. Ne la mets jamais dans une page web, une application distribuée ou un dépôt public. Donne-lui un plafond journalier de crédits dès qu'elle vit sur un serveur.
Ce qu'une clé est autorisée à faire
| Permission | Ce qu'elle permet |
|---|---|
| Read | Toujours accordée : statut du rendu, téléchargement de fichier, solde, liste de personnages |
| Images | Soumettre et annuler des images (génération, retouche, variation) |
| Videos | Soumettre et annuler des vidéos |
Un appel dépassant les permissions de la clé retourne 403 portee_manquante, avec la
permission manquante dans portee.
Le cycle de vie du rendu
Toujours les mêmes trois étapes.
- Soumettre.
POST /imagesouPOST /videos. Réponse immédiate avec unjobIdet le coût. - Interroger.
GET /images/{jobId}ouGET /videos/{jobId}, toutes les 3 secondes, jusqu'à ce questatussoitcompletedoufailed. - Télécharger.
GET /images/{jobId}/fileouGET /videos/{jobId}/file, dès que le statut estcompleted. Le fichier n'est pas conservé, alors télécharge-le sans attendre.
Durées approximatives : 10 à 40 secondes pour une image, 1 à 5 minutes pour une vidéo, plus longtemps quand le moteur démarre à froid.
Ton premier appel
KEY=tk_pro_...
B=https://api.tendre.ai/pro/v1
curl -s $B/credits -H "Authorization: Bearer $KEY"
{ "balance": 1830, "licenseId": "lic_...", "key": "k_1a2b3c4d",
"limits": { "concurrent": 2, "perMinute": 60, "perDay": 0 }, "running": 0 }
Si ça répond, tout le reste fonctionnera.
Un rendu complet, de trois façons
bash
KEY=tk_pro_...
B=https://api.tendre.ai/pro/v1
JOB=$(curl -s $B/images -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"prompt":"a lighthouse at dawn, photorealistic","width":1216,"height":832}' | jq -r .jobId)
until curl -s $B/images/$JOB -H "Authorization: Bearer $KEY" | grep -q '"completed"'; do sleep 3; done
curl -s $B/images/$JOB/file -H "Authorization: Bearer $KEY" -o lighthouse.png
PowerShell
$H = @{ Authorization = "Bearer tk_pro_..." }
$B = "https://api.tendre.ai/pro/v1"
$job = Invoke-RestMethod -Uri "$B/videos" -Method Post -Headers $H -ContentType "application/json" `
-Body '{"prompt":"waves on a beach at sunset, gentle wind","width":1080,"height":1920,"audio":true}'
do { Start-Sleep 5; $s = Invoke-RestMethod -Uri "$B/videos/$($job.jobId)" -Headers $H } while ($s.status -eq "pending")
Invoke-WebRequest -Uri "https://api.tendre.ai$($s.file_url)" -Headers $H -OutFile beach.mp4
Python
import time, requests
KEY, B = "tk_pro_...", "https://api.tendre.ai/pro/v1"
H = {"Authorization": f"Bearer {KEY}"}
job = requests.post(f"{B}/videos", headers=H, json={"prompt": "waves on a beach at sunset, gentle wind", "audio": True}).json()
while (s := requests.get(f"{B}/videos/{job['jobId']}", headers=H).json())["status"] == "pending":
time.sleep(3)
if s["status"] == "completed":
open("beach.mp4", "wb").write(requests.get("https://api.tendre.ai" + s["file_url"], headers=H).content)
else:
print("failed:", s.get("detail"))
Et ensuite
- Images : génération, les trois modes de retouche, personnages.
- Videos : formats, grille tarifaire, images de début et de fin.
- Account : solde, plafonds, personnages entraînés, activité.
- Limits and errors : plafonds, tous les codes d'erreur, bonnes pratiques.
Ce qui n'est pas encore là
Dans l'ordre prévu : l'entraînement de personnages à partir de tes propres photos, les voix, l'upscaling en 2K, une graine fixe pour reproduire un rendu, et les webhooks pour arrêter d'interroger.
L'API est versionnée. Tout ce qui est décrit ici reste valable sous /pro/v1 : les ajouts ne
cassent jamais l'existant, et un changement incompatible serait livré sous /pro/v2.