Pro API: genera en el cloud desde tu propio servidor
Todo lo que hace la app online (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.
¿No eres desarrollador? Lo mismo es accesible desde un agente de IA sin escribir ni una línea: consulta MCP.
| 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.json (OpenAPI 3.0), para generar un cliente |
| Tabla de precios | GET /pro/v1/pricing |
Obtener una clave
En la app, con una licencia Pro: Ajustes > API > New key. Dale un nombre ("servidor de producción", por ejemplo), elige sus permisos y, si quieres, un límite diario de créditos y una fecha de vencimiento.
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 puesto. 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. Ponle un límite diario de créditos en cuanto viva en un servidor.
Qué puede hacer una clave
| Permiso | Lo que permite |
|---|---|
| Read | Siempre concedido: estado del render, descarga de archivos, saldo, lista de personajes |
| Images | Enviar y cancelar imágenes (generación, retoque, variación), crear personajes |
| Videos | Enviar y cancelar vídeos, Multi-Ref Vídeo y Face swap incluidos |
Una llamada fuera de los permisos de la clave responde 403 missing_scope, con el permiso
que falta en scope.
El ciclo de vida del render
Siempre los mismos tres pasos.
- Enviar.
POST /imagesoPOST /videos. Respuesta inmediata con unjobIdy el coste. - Consultar.
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: de 10 a 40 segundos para una imagen, de 1 a 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 maneras
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.pngPowerShell
$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.mp4Python
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é hacer 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, Multi-Ref Vídeo, Face swap.
- Personajes: una foto, siete vistas, para usar en Multi-Ref Vídeo.
- Cuenta: saldo, límites, personajes entrenados, actividad.
- Límites y errores: límites, todos los códigos de error, buenas prácticas.
- MCP (agentes): conecta Claude, ChatGPT o Cursor directamente, sin código.
Lo que aún no está disponible
En el orden previsto: entrenamiento de personajes desde tus propias fotos, voces, upscaling a 2K, una semilla fija para reproducir un render y webhooks para dejar de consultar el estado.
El entrenamiento merece una aclaración: no puedes entrenar a través de la API, pero puedes subir un
.safetensors que ya tengas y renderizar con él de inmediato. Consulta
Cuenta, créditos y personajes.
La API está versionada. Todo lo descrito aquí sigue siendo válido bajo /pro/v1: las adiciones nunca
rompen lo existente, y un cambio que rompa la compatibilidad se publicaría como /pro/v2.