Pro API: Cloud-Rendering von deinem eigenen Server steuern
Alles, was die App online tut (Bilder, Retusche, Videos, trainierte Charaktere), ist auch per HTTP erreichbar, zum gleichen Preis in Credits, ohne dass die App geöffnet sein muss. Du steuerst es von deinem eigenen Server, deinen Skripten oder deinem Agenten aus, mit den Credits deiner Lizenz.
Verfügbar mit der Pro-Lizenz. Der Schlüssel wird in der App unter Einstellungen > API erstellt.
| Basis | https://api.tendre.ai/pro/v1 |
| Authentifizierung | Header Authorization: Bearer tk_pro_... |
| Format | JSON ein und aus, PNG für Bilder, MP4 für Videos |
| Maschinenbeschreibung | openapi-pro.yaml (OpenAPI 3.0), zur Client-Generierung |
Einen Schlüssel erstellen
In der App, mit einer Pro-Lizenz: Einstellungen > API > Neuer Schlüssel. Gib ihm einen Namen (zum Beispiel "Produktionsserver"), wähle seine Berechtigungen und, falls gewünscht, ein tägliches Credit-Limit sowie ein Ablaufdatum.
Der Schlüssel wird nur einmal angezeigt. Kopiere ihn sofort. Ein verlorener Schlüssel wird ersetzt, nie wiederhergestellt.
- Maximal drei aktive Schlüssel pro Lizenz. Das reicht, um einen zu rotieren, ohne den Dienst zu unterbrechen: den neuen erstellen, installieren, den alten widerrufen.
- Ein Schlüssel ist kein Sitzplatz. Dein Computer und dein Telefon bleiben daneben nutzbar.
- Ein Schlüssel ist so wertvoll wie deine Credits. Lege ihn niemals in eine Webseite, eine verteilte App oder ein öffentliches Repository. Gib ihm ein tägliches Credit-Limit, sobald er auf einem Server läuft.
Was ein Schlüssel darf
| Berechtigung | Was sie erlaubt |
|---|---|
| Lesen | Immer gewährt: Render-Status, Datei-Download, Guthaben, Charakterliste |
| Bilder | Bilder einreichen und abbrechen (Generierung, Retusche, Variation) |
| Videos | Videos einreichen und abbrechen |
Ein Aufruf, der die Berechtigungen des Schlüssels überschreitet, antwortet mit 403 portee_manquante,
mit der fehlenden Berechtigung in portee.
Der Render-Lebenszyklus
Immer die gleichen drei Schritte.
- Einreichen.
POST /imagesoderPOST /videos. Sofortige Antwort mit einerjobIdund den Kosten. - Abfragen.
GET /images/{jobId}oderGET /videos/{jobId}, alle 3 Sekunden, bisstatuscompletedoderfailedist. - Herunterladen.
GET /images/{jobId}/fileoderGET /videos/{jobId}/file, sobald der Statuscompletedist. Die Datei wird nicht aufbewahrt, also lade sie sofort herunter.
Grobe Zeitangaben: 10 bis 40 Sekunden für ein Bild, 1 bis 5 Minuten für ein Video, länger wenn die Engine kalt startet.
Dein erster Aufruf
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 }
Wenn das antwortet, funktioniert alles andere auch.
Ein vollständiger Render, auf drei Wegen
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"))
Wie es weitergeht
- Bilder: Generierung, die drei Retusche-Modi, Charaktere.
- Videos: Formate, das Preisraster, Start- und Endframes.
- Konto: Guthaben, Limits, trainierte Charaktere, Aktivität.
- Limits und Fehler: Caps, alle Fehlercodes, Best Practices.
Was noch nicht da ist
In der geplanten Reihenfolge: Charakter-Training aus eigenen Fotos, Stimmen, Hochskalierung auf 2K, ein fester Seed zur Reproduktion eines Renders, und Webhooks, damit du das Abfragen stoppen kannst.
Die API ist versioniert. Alles hier Beschriebene bleibt unter /pro/v1 gültig: Ergänzungen
brechen nie, was bereits existiert, und eine breaking Change würde als /pro/v2 erscheinen.