Pro API: drive cloud rendering from your own server

Everything the app does online (images, retouching, videos, trained characters) is also reachable over HTTP, at the same price in credits, without the app being open. You drive it from your own server, your scripts or your agent, using the credits on your licence.

Available with the Pro licence. The key is created in the app, under Settings > API.

Not a developer? The same thing is reachable from an AI agent without writing a line: see MCP.

Basehttps://api.tendre.ai/pro/v1
Authenticationheader Authorization: Bearer tk_pro_...
FormatJSON in and out, PNG for images, MP4 for videos
Machine descriptionopenapi.json (OpenAPI 3.0), to generate a client
Price gridGET /pro/v1/pricing

Get a key

In the app, with a Pro licence: Settings > API > New key. Give it a name ("production server", say), choose its permissions and, if you want, a daily credit cap and an expiry date.

The key is shown once. Copy it straight away. A lost key is replaced, never recovered.

  • Three active keys per licence at most. Enough to rotate one without cutting service: create the new one, install it, revoke the old one.
  • A key is not a seat. Your computer and your phone stay usable alongside it.
  • A key is worth your credits. Never put one in a web page, a distributed app or a public repository. Give it a daily credit cap as soon as it lives on a server.

What a key is allowed to do

PermissionWhat it allows
ReadAlways granted: render status, file download, balance, character list
ImagesSubmit and cancel images (generation, retouching, variation), create characters
VideosSubmit and cancel videos, Multi-Ref Video and Face swap included

A call beyond the key's permissions answers 403 missing_scope, with the missing permission in scope.

The render lifecycle

Always the same three steps.

  1. Submit. POST /images or POST /videos. Immediate answer with a jobId and the cost.
  2. Poll. GET /images/{jobId} or GET /videos/{jobId}, every 3 seconds, until status is completed or failed.
  3. Download. GET /images/{jobId}/file or GET /videos/{jobId}/file, as soon as the status is completed. The file is not kept, so download it without waiting.

Rough timings: 10 to 40 seconds for an image, 1 to 5 minutes for a video, longer when the engine starts cold.

Your first call

bash
KEY=tk_pro_...
B=https://api.tendre.ai/pro/v1
curl -s $B/credits -H "Authorization: Bearer $KEY"
json
{ "balance": 1830, "licenseId": "lic_...", "key": "k_1a2b3c4d",
  "limits": { "concurrent": 2, "perMinute": 60, "perDay": 0 }, "running": 0 }

If that answers, everything else will.

A complete render, three ways

bash

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

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

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"))

Where to go next

  • Images: generation, the three retouching modes, characters.
  • Videos: formats, the price grid, start and end frames, Multi-Ref Video, Face swap.
  • Characters: one photo, seven views, to cast in Multi-Ref Video.
  • Account: balance, caps, trained characters, activity.
  • Limits and errors: caps, every error code, good practice.
  • MCP (agents): plug Claude, ChatGPT or Cursor straight in, with no code.

What is not there yet

In the order planned: character training from your own photos, voices, upscaling to 2K, a fixed seed to reproduce a render, and webhooks so you can stop polling.

Training is the one worth a word: you cannot train through the API, but you can upload a .safetensors you already have and render with it straight away. See Account, credits and characters.

The API is versioned. Everything described here stays valid under /pro/v1: additions never break what exists, and a breaking change would ship as /pro/v2.

Windows · Mac · Cloud or local

Generate privately. Tonight.

Download tendre.AI for free and generate without limits, privately, on your own GPU.

OS Windows 10/11GPU NVIDIA 8GB+VRAM 12GB recommendedDisk 20GB

Mac: Apple silicon (M1 or later), macOS 13 or later. Intel Macs are not supported.

Local image generation on Mac needs an M4 with 24 GB of memory, or an M2 or M3 Pro, Max or Ultra with 24 GB. Below that, everything runs online with credits. Retouching and video run online on Mac for now.

Everything about tendre.AI for Mac

No NVIDIA GPU? Start 100% in the cloud: 5 free images and 1 free video every day. An NVIDIA card (8GB+) unlocks unlimited local generation.