eroq

API-Referenz · Media

Video · edit (Replace)

Put your characters in the place of the people in a clip you bring — every move, the lip movement, the scene and the sound stay. Or upscale a clip.

POST/v1/videos/edits30 / 60 credits / second at 768p / 1080p (eroq-replace-pro, 2 s minimum) · 9 / 14 credits / second at 1080p / 2K (eroq-upscale, 5 s minimum)

eroq Replace Pro (eroq-replace-pro, the default; every plan, eroq's own engine, uncensored, private) edits YOUR clip: it puts your characters in the place of the people in it. The result keeps the source's length, framing and sound, lands in your library, and is fetched like any render (poll GET /v1/videos/generations/{id}).

source is a media key you own: upload:<id> (a file in POST /v1/uploads) or creation:<id> (a clip in your library). It must be an MP4 or MOV; its length is measured on our side and billed per second. eroq-replace-pro puts your characters in place of the people in the clip, up to four at once, cast straight from their identity sheets: sheets lists one character per person (char:<id>), in the order the prompt's people are named — without it, the characters in elements are cast in their order, and with neither the call answers 400 reference_required; a character with no sheet and no photo answers 400 character_needs_sheet. With several people, targets says who each one replaces by place and action ("the driver on the right" — never by clothes; POST /v1/videos/edits/people reads them as who). outfits says what each one wears: their own outfit (character, the sheet's), the clip's (source, with its words in text — the people endpoint reads them as outfit) or one typed (custom); when everyone keeps the clip's clothes, only the heads are swapped. The engine prompt is written for you from the sheets; your prompt adds a short note. One continuous shot of 2–10 s, at 24 fps (400 source_fps otherwise — trim and convert longer clips first, the studio does it in the browser); the result keeps every move, the lip movement, the scene and the original sound, rendered in 768p or, with resolution: "1080p", in HD. Billed per second of clip at 24 fps. eroq-replace-one, its name until 16 Oct 2026, still answers as eroq-replace-pro.

eroq Upscale (model: "eroq-upscale", our own GPUs, nothing leaves eroq) brings any clip you own to 1080p or 2K: every frame restored by a video diffusion upscaler, the frame rate and the sound kept. 1–30 s and 900 frames per clip, billed per second of clip (5 s at least). No prompt — send source and resolution.

@mentions of your characters in prompt (their ids in elements) are the cast, each from their identity sheet, or their first photo while they have none (the sheet, built in the character's Identity tab, holds the face far better). Our own rule applies (no minors, ever). A declined edit is refunded.

Request-Body

sourcestringerforderlich

The clip to edit: upload:<id> or creation:<id> — MP4/MOV, 2–10 s at 24 fps (eroq-replace-pro), 1–30 s (eroq-upscale).

promptstring

A short note for eroq-replace-pro (the engine prompt is written for you from the sheets) — e.g. "they both laugh at the end". Up to 2000 characters. eroq-upscale takes none.

modelstring

eroq-replace-pro (default) or eroq-upscale. eroq-replace-one (Replace Pro's former name) still works.

resolutionstring

The tier the clip comes back at. eroq-upscale: 1080p (default) or 2K (Creator plan and up) — a clip already that sharp answers 400 already_sharp before billing. eroq-replace-pro: 768p (default) or 1080p (HD, rendered by the engine, twice the price). Ignored by the other engines.

modestring

Ignored by eroq-replace-pro (kept so older calls still validate).

elementsarray

Ids of the characters (char:<id>) you @mention. Without sheets, they are the cast, in this order.

keyframesarray

Ignored: no Replace engine follows painted keyframes any more. Kept so older calls still validate.

sheetsarray

eroq-replace-pro: one character per person replaced (char:<id>), in the order the people are named — each is cast from their identity sheet. 1 to 4. Omitted: the characters in elements.

targetsarray

eroq-replace-pro, several people: who each character replaces, by place and action, same order as sheets — ["the person on the left", "the driver on the right, both hands on the steering wheel"]. Never by clothes (a clothes word leaks onto the character). POST /v1/videos/edits/people reads them as who.

outfitsarray

eroq-replace-pro: what each character wears, same order as sheets — { "mode": "character" } (their own outfit, the sheet's), { "mode": "source", "text": "…" } (the clip's clothes, in words) or { "mode": "custom", "text": "…" }. Everyone on source = only the heads are swapped.

seedinteger

Accepted but ignored: Replace Pro takes no seed.

storeboolean

Persist the result at a permanent public URL (charged at the Store's rate).

keep_soundboolean

Kept so older calls still validate: eroq-replace-pro always keeps the source's sound, eroq-upscale the clip's own.

folder_idstring

Library folder the edited clip lands in — one of yours (GET /v1/folders). Omitted = the Library root; an unknown id answers 404 folder_not_found before anything is billed.

flow_idstring

A flow to run on the edited clip once it lands — one that starts « After a render » of clips (GET /v1/flows). Checked before anything is billed (403 plan_required below the plan flows take). See Flows.

curl https://eroq.ai/v1/videos/edits \
  -H "Authorization: Bearer $EROQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "eroq-replace-pro",
  "source": "upload:9f2c41ab77d0e1c3",
  "sheets": [
    "char:5b1d0e7a"
  ],
  "outfits": [
    {
      "mode": "character"
    }
  ],
  "resolution": "768p"
}'
/v1/videos/edits
→ POST /v1/videos/edits
Starte das Beispiel – es spielt einen echten Austausch aus den Daten der Doku ab. Kein Schlüssel, keine Anfrage, keine Kosten.

Response

200 · application/json
{
  "id": "c41e9a07-…",
  "object": "video.edit",
  "created": 1759068000,
  "status": "processing",
  "model": "eroq-replace-pro",
  "duration": "4s",
  "poll": "/v1/videos/generations/c41e9a07-…",
  "usage": { "credits_spent": 120, "credits_remaining": 530 }
}