Pro API: create characters for Multi-Ref Video
A character is a sheet of five views of the same person (or creature), made from one photo
and stored under a character_id. It is what Multi-Ref Video uses to
recognise someone in a clip: the five views carry the likeness, with no training.
The characters you made in the app are already there: same licence, same list (see Characters from the app).
The five views
| Role | View |
|---|---|
| 1 | Bust, front, neutral expression |
| 2 | Bust, three-quarter, the character looks towards the right of the image, light smile |
| 3 | Bust, three-quarter, the character looks towards the left of the image, neutral |
| 4 | Full body, front |
| 5 | Full body, back |
Every view is generated on its own: none is obtained by flipping another.
Create a character
POST /characters (permission images). The work is asynchronous.
{ "name": "Lea", "kind": "woman", "image_b64": "<the photo>", "photo_role": "bust" }| Field | Type | What it does |
|---|---|---|
name | string, 1 to 40 characters | The character's first name |
kind | string | woman, man, or a creature described in English (baby dragon). It sets the pronouns of the instructions, never "they". |
image_b64 | base64 | The photo: sharp, one person only, at least 1024 px on the long side, 12 MB at most, JPEG, PNG or WebP |
photo_role | bust (default) or full_body | The photo is a bust (it becomes view 1) or a full-body shot (view 4) |
outfit | English text, optional | An outfit to put on first (a red leather jacket and black jeans) |
The answer, 202, is the character with status pending and cost_estimate. The photo becomes the
view of its role, and the server generates the other four, in 1 to 3 minutes.
Price: one credit per generated view, so 4 credits, plus 1 with outfit (the outfit is put on
first, as a separate step). A view that fails is not charged. POST /characters/quote gives the price
beforehand (outfit optional).
Follow, check, redo
GET /characters/{id} gives its state:
status | Meaning |
|---|---|
pending | The views are being made |
ready | The five views are there |
partial | Some views are missing or failed |
failed, empty | No usable view |
{
"character_id": "chr_8f3a...",
"name": "Lea",
"kind": "woman",
"origin": "api",
"status": "ready",
"progress": { "ready": 5, "total": 5 },
"views": [
{ "role": 1, "name": "bust_front", "status": "ready", "file_url": "https://api.tendre.ai/pro/v1/characters/chr_8f3a.../views/1/file" }
],
"expires_at": "2026-10-19T18:02:11.000Z"
}- Check the views before the first render.
GET /characters/{id}/views/{role}/filereturns the image. A failed view, or one that looks the wrong way, spoils the likeness in every video. - Redo a view:
POST /characters/{id}/views/{role}/redo, 1 credit. The view that came from the original photo cannot be redone (vue_photo). - List:
GET /charactersreturns your characters, the app's included, and the capmax. - Delete:
DELETE /characters/{id}erases the character and its views.
Characters from the app
A character created in the app's My characters screen appears in GET /characters with origin
app, and plays in Multi-Ref Video like any other. In the app, a character can have several
sheets (outfits, moods): sheet_id says which one is served (the most recent by default), sheets
lists them, and ?sheet=<id> asks for another on the read, on a view's file and on a redone view.
In a Multi-Ref clip, characters[].sheet_id picks the sheet. To redo a view of an app character,
give its kind in the body.
Storage
The views are encrypted (one key per file) and tied to your licence. 50 characters at most
with the Pro licence, the app's included. A character left unused for 15 days is erased
(expires_at): every Multi-Ref render and every read of a view pushes the date back. The photo you
send is kept as the view of its role, encrypted, like the generated views.
Through an agent (MCP)
With the MCP server, you just ask: "make a character from this photo". The agent
uses tendre_character_create (the photo comes through an upload link, a file attached in ChatGPT,
an image rendered in the conversation or a public address), shows you the five views, and redoes a
failed one with tendre_character_redo_view. tendre_character_get, tendre_character_list and
tendre_character_delete cover the rest, and tendre_quote gives the price first.
Then cast the character: see Multi-Ref Video.