Pro API: genereer via de cloud vanuit je eigen server
Alles wat de app online doet (afbeeldingen, retoucheren, video's, getrainde personages) is ook bereikbaar via HTTP, tegen dezelfde prijs in credits, zonder dat de app open hoeft te zijn. Je stuurt het aan vanuit je eigen server, je scripts of je agent, met de credits van je licentie.
Beschikbaar met de Pro-licentie. De sleutel maak je aan in de app, via Instellingen > API.
| Basis | https://api.tendre.ai/pro/v1 |
| Authenticatie | header Authorization: Bearer tk_pro_... |
| Formaat | JSON in en uit, PNG voor afbeeldingen, MP4 voor video's |
| Machinebeschrijving | openapi-pro.yaml (OpenAPI 3.0), om een client te genereren |
Een sleutel aanmaken
In de app, met een Pro-licentie: Instellingen > API > Nieuwe sleutel. Geef hem een naam (bijvoorbeeld "productieserver"), kies de machtigingen en, als je wilt, een dagelijks creditlimiet en een vervaldatum.
De sleutel wordt slechts één keer getoond. Kopieer hem meteen. Een verloren sleutel wordt vervangen, nooit hersteld.
- Maximaal drie actieve sleutels per licentie. Genoeg om er één te roteren zonder onderbreking: maak de nieuwe aan, installeer hem, trek de oude in.
- Een sleutel is geen seat. Je computer en je telefoon blijven gewoon bruikbaar naast de sleutel.
- Een sleutel staat gelijk aan je credits. Zet hem nooit in een webpagina, een gedistribueerde app of een openbare repository. Geef hem een dagelijks creditlimiet zodra hij op een server staat.
Wat een sleutel mag doen
| Machtiging | Wat het toestaat |
|---|---|
| Lezen | Altijd verleend: renderstatus, bestand downloaden, saldo, personagelijst |
| Afbeeldingen | Afbeeldingen indienen en annuleren (generatie, retoucheren, variatie) |
| Video's | Video's indienen en annuleren |
Een aanroep die buiten de machtigingen van de sleutel valt, geeft 403 portee_manquante terug,
met de ontbrekende machtiging in portee.
De render-levenscyclus
Altijd dezelfde drie stappen.
- Indienen.
POST /imagesofPOST /videos. Directe reactie met eenjobIden de kosten. - Pollen.
GET /images/{jobId}ofGET /videos/{jobId}, elke 3 seconden, totdatstatuscompletedoffailedis. - Downloaden.
GET /images/{jobId}/fileofGET /videos/{jobId}/file, zodra de statuscompletedis. Het bestand wordt niet bewaard, dus download het zonder te wachten.
Globale tijdsindicaties: 10 tot 40 seconden voor een afbeelding, 1 tot 5 minuten voor een video, langer als de engine koud opstart.
Je eerste aanroep
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 }
Als dit een antwoord geeft, werkt de rest ook.
Een volledige render, drie manieren
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"))
Waar je daarna naartoe gaat
- Afbeeldingen: generatie, de drie retoucheermodi, personages.
- Video's: formaten, het prijsoverzicht, begin- en eindframes.
- Account: saldo, limieten, getrainde personages, activiteit.
- Limieten en fouten: limieten, alle foutcodes, goede praktijken.
Wat er nog niet is
In de geplande volgorde: personagetraining op basis van je eigen foto's, stemmen, upscaling naar 2K, een vaste seed om een render te reproduceren, en webhooks zodat je kunt stoppen met pollen.
De API is geversioneerd. Alles wat hier beschreven staat, blijft geldig onder /pro/v1:
toevoegingen breken nooit wat al bestaat, en een ingrijpende wijziging wordt uitgebracht als
/pro/v2.