Pro API: lanza renders en la nube desde tu propio servidor
Todo lo que la app hace en línea (imágenes, retoques, vídeos, personajes entrenados) también es accesible por HTTP, al mismo precio en créditos, sin necesidad de tener la app abierta. Lo controlas desde tu propio servidor, tus scripts o tu agente, usando los créditos de tu licencia.
Disponible con la licencia Pro. La clave se crea en la app, en Ajustes > API.
| Base | https://api.tendre.ai/pro/v1 |
| Autenticación | cabecera Authorization: Bearer tk_pro_... |
| Formato | JSON de entrada y salida, PNG para imágenes, MP4 para vídeos |
| Descripción de la máquina | openapi-pro.yaml (OpenAPI 3.0), para generar un cliente |
Obtener una clave
En la app, con una licencia Pro: Ajustes > API > Nueva clave. Dale un nombre (por ejemplo, "servidor de producción"), elige sus permisos y, si quieres, un límite diario de créditos y una fecha de caducidad.
La clave se muestra una sola vez. Cópiala de inmediato. Una clave perdida se reemplaza, nunca se recupera.
- Máximo tres claves activas por licencia. Suficiente para rotar una sin interrumpir el servicio: crea la nueva, instálala, revoca la antigua.
- Una clave no es un asiento. Tu ordenador y tu teléfono siguen siendo utilizables junto a ella.
- Una clave vale tanto como tus créditos. Nunca la pongas en una página web, una app distribuida o un repositorio público. Asígnale un límite diario de créditos en cuanto viva en un servidor.
Qué puede hacer una clave
| Permiso | Qué permite |
|---|---|
| Lectura | Siempre concedido: estado del render, descarga de archivos, saldo, lista de personajes |
| Imágenes | Enviar y cancelar imágenes (generación, retoque, variación) |
| Vídeos | Enviar y cancelar vídeos |
Una llamada que supera los permisos de la clave responde con 403 portee_manquante, con el
permiso que falta en portee.
El ciclo de vida del render
Siempre los mismos tres pasos.
- Enviar.
POST /imagesoPOST /videos. Respuesta inmediata con unjobIdy el coste. - Sondear.
GET /images/{jobId}oGET /videos/{jobId}, cada 3 segundos, hasta questatusseacompletedofailed. - Descargar.
GET /images/{jobId}/fileoGET /videos/{jobId}/file, en cuanto el estado seacompleted. El archivo no se conserva, así que descárgalo sin esperar.
Tiempos aproximados: entre 10 y 40 segundos para una imagen, entre 1 y 5 minutos para un vídeo, más tiempo cuando el motor arranca en frío.
Tu primera llamada
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 eso responde, todo lo demás funcionará.
Un render completo, de tres formas
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"))
Qué ver a continuación
- Imágenes: generación, los tres modos de retoque, personajes.
- Vídeos: formatos, la tabla de precios, fotogramas de inicio y fin.
- Cuenta: saldo, límites, personajes entrenados, actividad.
- Límites y errores: límites, todos los códigos de error, buenas prácticas.
Lo que aún no está disponible
Por orden de planificación: entrenamiento de personajes a partir de tus propias fotos, voces, escalado a 2K, una semilla fija para reproducir un render, y webhooks para dejar de hacer sondeos.
La API tiene versiones. Todo lo descrito aquí sigue siendo válido bajo /pro/v1: las
incorporaciones nunca rompen lo que ya existe, y un cambio incompatible se publicaría como
/pro/v2.