<!-- /en/docs/utilities-api (en) -->

# Utilities API: media, captions and C2PA

Nine modules: C2PA Signer Profiles, FORSAJ, HOLST, INDEXLIFT, KLEY, OVERLAY, PLASTINKA, SPEKTR and SUFLER. Contracts were checked against source on 8 September 2026; access depends on your account and the selected operation.


## Connection and upload

Keep your API key in the `FRANKLAB_KEY` environment variable. Examples use origin `https://apergrex.ru`; all paths below already include `/franklab/api`. The repeated `franklab` in `/franklab/api/franklab/jobs` is required. SPEKTR/Recraft uses `X-API-Key`; other examples use `Authorization: Bearer`. Do not supply partnerId.

```bash
export FRANKLAB_ORIGIN="https://apergrex.ru"
# FRANKLAB_KEY is supplied by your secret manager
curl --fail-with-body "$FRANKLAB_ORIGIN/franklab/api/franklab/jobs/upload" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -F "file=@synthetic.mp4;type=video/mp4"
```

Use upload response `data.url` to replace `https://example.com/synthetic.*` in examples; those URLs are placeholders, not downloadable media. Maximum 150 MiB, source retention 7 days. MIME: video/mp4, video/webm, video/quicktime, video/x-msvideo; audio/mpeg, audio/mp3, audio/wav, audio/ogg, audio/pcm, audio/l16, audio/x-pcm; image/png, image/jpeg, image/gif, image/webp. Upload does not convert formats. URLs must be server-accessible; private/local URLs and prohibited redirects are rejected. Save completed outputs before expiresAt when provided.


Connection check: GET /franklab/api/franklab/integrations/text-sticker/auth/stats with an API key. SPEKTR Make reads GET /franklab/api/v1/images/omni-image?pageNum=1&pageSize=1. This reads history/checks authentication; it does not test generation.

## Status, output and billing

A successful submission returns HTTP 200 and `success:true`, which does not mean the output is ready. Store `data.taskId`; poll the matching route every 5 seconds until `data.status=completed` or `failed`. `queued` and `processing` are non-terminal. Set a finite deadline; resume reading the existing ID after a timeout. Do not automatically repeat POST after an ambiguous network error.

| Family | Polling | Output / error |
| --- | --- | --- |
| FORSAJ, HOLST, KLEY, PLASTINKA, SUFLER, SPEKTR jobs | `GET /franklab/api/franklab/jobs/{taskId}` | `data.downloadUrl`, metadata; `data.error` |
| OVERLAY | `GET /franklab/api/make/jobs/{taskId}` | `data.result.downloadUrl`; `data.error` / `data.result.error` |
| INDEXLIFT async | `GET /franklab/api/franklab/jobs/audit-landing/async/{taskId}` | `data.result.data.seo_report`, `data.result.data.brief_suggestions`, `data.phase`, `data.error_message` |
| SPEKTR Recraft | `GET /franklab/api/v1/recraft/record-info?taskId=...` | `data.state`, parse `data.resultJson` → `resultUrls[]`; `data.failMsg` |
| C2PA, sample resources | No task polling | `data` profile/sample |

Jobs expose `final_cost_franks`, `cost_currency=FRANK`, `cost_status` and `cost_unit`. With `cost_status=reserved`, the amount is reserved; `final` is settled, `refunded` is refunded, and `unavailable` means no reliable price. Frank is an internal accounting unit, not a currency. A missing field does not mean zero cost. The server checks tariff and capability access. No separate generic utility REST estimate is confirmed; Studio estimate is not a universal utility quote. C2PA list is free in source; profile mutations may be billed. Recraft passthrough and synchronous INDEXLIFT do not establish this settlement contract.

HTTP 400 usually means invalid parameters or combinations; 401 means authentication; 404 means missing resource; 429 means rate limiting. For 5xx/provider errors, reconcile the existing task before resubmission. `success:true` with `data.status=failed` is still failure. Diagnostic operations may return metadataReport/metrics/qcReport without a file; availability is qualified separately.

## Content Credentials (C2PA)

Supporting jobs accept `c2paSigningMode=off|franklab|user_profile`, `c2paSignerProfileId` for user_profile, and `contentOrigin=not_declared|human_edited|ai_assisted|ai_generated|human_created|camera_captured`. Optional strings: humanAuthorName, humanAuthorUrl, reviewedBy, reviewedAt, reviewMethod, c2paActionDescription, c2paDisclosure. sourceMaterialUrls and originalEvidenceUrls each allow up to 10 public HTTPS URLs. Restricted human_created/camera_captured claims require an active permitting profile and evidence. Request verifiedIncomingC2paIngredient is not proof: the server verifies the result. Signing is separate from trusted-chain validation: inspect c2paStatus, c2paSigned, c2paCryptographicallyValid, c2paTrustedChainValid, c2paCawgIdentityPresent, c2paPublicVerifierRecognized, c2paManifestUrl and c2paVerificationReport. OVERLAY make/jobs DTO does not declare C2PA fields.

## C2PA Signer Profiles

Listing returns active partner profiles without PEM secrets. Creation and rotation take your certificate/key; generate_self_signed creates a self-signed profile. trustLevel=trusted is rejected here. Rotation creates a new version; keep profile IDs distinct. Revocation changes profile validity. No credential mutation was tested.

### Operations and minimal JSON requests

Each example below is the complete JSON for its POST; replace URLs/IDs with your own. Operation/mode selectors choose functions, not generation models. “source” means source-checked without live/E2E; “blocked” marks a known limitation.

| Operation | HTTP and path | Minimal JSON / status |
| --- | --- | --- |
| `list` | `GET /franklab/api/make/c2pa/signer-profiles` | `{}` source |
| `generate_self_signed` | `POST /franklab/api/make/c2pa/signer-profiles` | `{"action":"generate_self_signed","label":"My signing profile"}` source |
| `create_from_pem` | `POST /franklab/api/make/c2pa/signer-profiles` | `{"action":"create_from_pem","label":"My signing profile","certificateChainPem":"<YOUR_CERTIFICATE_CHAIN_PEM>","privateKeyPem":"<YOUR_PRIVATE_KEY_PEM>"}` source |
| `rotate_from_pem` | `POST /franklab/api/make/c2pa/signer-profiles/{profileId}/rotate` | `{"label":"My signing profile","certificateChainPem":"<YOUR_CERTIFICATE_CHAIN_PEM>","privateKeyPem":"<YOUR_PRIVATE_KEY_PEM>"}` source |
| `revoke` | `POST /franklab/api/make/c2pa/signer-profiles/{profileId}/revoke` | `{}` source |
| `lookup_signer-profiles` | `GET /franklab/api/make/c2pa/signer-profiles` | source |
| `check_connection` | `GET /franklab/api/franklab/integrations/text-sticker/auth/stats` | source |


```bash
curl --fail-with-body "$FRANKLAB_ORIGIN/franklab/api/make/c2pa/signer-profiles" \
  -H "Authorization: Bearer $FRANKLAB_KEY"
```

### REST fields

Fields apply to the selected operation; required conditions and the minimal example define usage. `[]` denotes array items.

| Field | Type | Conditions and allowed values |
| --- | --- | --- |
| `action` | string | required (generate_self_signed); Required input in this operation example; required (create_from_pem) |
| `label` | string | required (generate_self_signed); label; required (create_from_pem); required (rotate_from_pem) |
| `allowRestrictedOriginClaims` | boolean | allow Restricted Origin Claims;  / true / false |
| `certificateChainPem` | string | required (create_from_pem); certificate Chain Pem; required (rotate_from_pem) |
| `privateKeyPem` | string | required (create_from_pem); private Key Pem; required (rotate_from_pem) |
| `profileId` | string | required (rotate_from_pem); Path parameter: owned active signer profile ID; required (revoke) |

### Make options and REST conversion

This is the Make selection reference; form names can differ from REST. Convert v1*/v2*, text* and sample* fields as described above. Nested conditions describe the Make form.

| Form field | When | Values |
| --- | --- | --- |
| `action` |  | list / generate_self_signed / create_from_pem / rotate_from_pem / revoke |
| `profileId` | action=rotate_from_pem | rpc://getC2paSignerProfiles |
| `allowRestrictedOriginClaims` | action=rotate_from_pem |  / true / false |
| `profileId` | action=revoke | rpc://getC2paSignerProfiles |

### Response and verification limits

HTTP 200 {success:true,data:PROFILE[]}; profileId,id,label,status,trustLevel,allowRestrictedOriginClaims,version,profileGroupId,createdAt,updatedAt,rotatedAt,revokedAt; no PEM returned.


For rotation REST accepts optional allowRestrictedOriginClaims; omission inherits the previous value. Current Make communication does not forward this control for rotate_from_pem.

## FORSAJ

video_speed posts videoUrl and speed to jobs/video-speed. audio_speed puts the audio URL in videoUrl and sends operation=speed to jobs/audio. speed: 0.25–4. audioBitrate is a string from 8k to 320k; replace the Make custom choice with the actual bitrate. Do not send mode to REST. Video duration may describe the source; inspect the output media.

### Operations and minimal JSON requests

Each example below is the complete JSON for its POST; replace URLs/IDs with your own. Operation/mode selectors choose functions, not generation models. “source” means source-checked without live/E2E; “blocked” marks a known limitation.

| Operation | HTTP and path | Minimal JSON / status |
| --- | --- | --- |
| `video_speed` | `POST /franklab/api/franklab/jobs/video-speed` | `{"videoUrl":"https://example.com/synthetic.mp4","speed":1.1}` source |
| `audio_speed` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","speed":1.1,"operation":"speed","audioBitrate":"64k"}` source |
| `get_task` | `GET /franklab/api/franklab/jobs/{taskId}` | source |
| `upload_source` | `POST /franklab/api/franklab/jobs/upload` | source |
| `check_connection` | `GET /franklab/api/franklab/integrations/text-sticker/auth/stats` | source |


```bash
curl --fail-with-body "$FRANKLAB_ORIGIN/franklab/api/franklab/jobs/video-speed" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"videoUrl":"https://example.com/synthetic.mp4","speed":1.1}'
```

### REST fields

Fields apply to the selected operation; required conditions and the minimal example define usage. `[]` denotes array items.

| Field | Type | Conditions and allowed values |
| --- | --- | --- |
| `c2paSigningMode` | string | off / franklab / user_profile; c2pa Signing Mode |
| `contentOrigin` | string | franklab or user_profile; restricted origins require permitting user_profile and evidence; not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured; content Origin |
| `humanAuthorName` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; human Author Name |
| `humanAuthorUrl` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; human Author Url |
| `reviewedBy` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; reviewed By |
| `reviewedAt` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; reviewed At |
| `reviewMethod` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; review Method |
| `sourceMaterialUrls` | array | c2paSigningMode=franklab OR c2paSigningMode=user_profile; max items 10 |
| `originalEvidenceUrls` | array | c2paSigningMode=franklab OR c2paSigningMode=user_profile; max items 10 |
| `verifiedIncomingC2paIngredient` | boolean | c2paSigningMode=franklab OR c2paSigningMode=user_profile; verified Incoming C2pa Ingredient |
| `c2paActionDescription` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; c2pa Action Description |
| `c2paDisclosure` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; c2pa Disclosure |
| `c2paSignerProfileId` | string | required when c2paSigningMode=user_profile; rpc://getC2paSignerProfiles; c2pa Signer Profile Id |
| `videoUrl` | string | required (video_speed); URL; required (audio_speed) |
| `speed` | number | required (video_speed); min 0.25; max 4; required (audio_speed) |
| `callbackUrl` | string | URL |
| `audioBitrate` | string | 64k / 96k / 128k / 160k / 192k / 256k / 320k; 8k–320k string; custom is a Make control, not a REST value |
| `operation` | string | required (audio_speed) |
| `taskId` | string | required (get_task); Path parameter: returned taskId, scoped to the same partner |
| `file` | binary | required (upload_source); multipart/form-data file; maximum 157286400 bytes |

### Make options and REST conversion

This is the Make selection reference; form names can differ from REST. Convert v1*/v2*, text* and sample* fields as described above. Nested conditions describe the Make form.

| Form field | When | Values |
| --- | --- | --- |
| `mode` |  | video_speed / audio_speed |
| `audioBitrate` | mode=audio_speed | 64k / 96k / 128k / 160k / 192k / 256k / 320k / custom |
| `c2paSigningMode` |  | off / franklab / user_profile |
| `contentOrigin` | c2paSigningMode=franklab | not_declared / human_edited / ai_assisted / ai_generated |
| `c2paSignerProfileId` | c2paSigningMode=user_profile | rpc://getC2paSignerProfiles |
| `contentOrigin` | c2paSigningMode=user_profile | not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured |

### Response and verification limits

HTTP 200 {success:true,data:{taskId,status,final_cost_franks,cost_currency,cost_status,cost_unit}}; poll the returned taskId.


## HOLST

Supply imageUrl and either operation or steps (up to 20 entries, each with op). outputFormat: jpeg/jpg/png/webp/avif/gif; outputQuality: 1–100. The current top-level DTO strips several Make fields: watermarkPosition/Opacity/Scale, textPosition/fontSize/color/font, brightness/saturation/hue/contrast/gamma, imageUrls/columns/gap/background. For watermark, text, adjust and collage use steps with position/opacity/scale, content/fontSize/color, brightness and imageUrls/columns/gap respectively. Even ImageStepDto has no font: HOLST font selection is unverified. REST accepts removeBgProvider, alphaMatting, ocrLanguages, metadataEngine and includeGps, but Make communication omits their top-level mapping. OCR/remove_bg/strip_gps/read_metadata depend on worker capabilities; info/read_metadata may be blocked by required output-file inventory checks.

### Operations and minimal JSON requests

Each example below is the complete JSON for its POST; replace URLs/IDs with your own. Operation/mode selectors choose functions, not generation models. “source” means source-checked without live/E2E; “blocked” marks a known limitation.

| Operation | HTTP and path | Minimal JSON / status |
| --- | --- | --- |
| `resize` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"resize","width":64,"height":64}` source |
| `crop` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"crop","aspectRatio":"1:1"}` source |
| `filter` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"filter","filterPreset":"grayscale"}` source |
| `watermark` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","steps":[{"op":"watermark","imageUrl":"https://example.com/synthetic.png","position":"bottom-right","opacity":0.5,"scale":0.15}],"outputFormat":"png"}` source |
| `image_overlay` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"image_overlay","overlayImageUrl":"https://example.com/synthetic.png","overlayScale":0.25}` source |
| `text` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","steps":[{"op":"text","content":"Synthetic test","fontSize":24,"color":"#FFFFFF","position":"center"}],"outputFormat":"png"}` source |
| `rotate` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"rotate","angle":90}` source |
| `flip` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"flip"}` source |
| `flop` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"flop"}` source |
| `blur` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"blur","sigma":2}` source |
| `sharpen` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"sharpen","sigma":1}` source |
| `info` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"info"}` **blocked** |
| `strip_meta` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"strip_meta"}` source |
| `write_exif` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"write_exif","imageDescription":"Synthetic test"}` source |
| `write_metadata` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"write_metadata","metaTitle":"Synthetic test"}` source |
| `replace_metadata` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"replace_metadata","metaTitle":"Synthetic test"}` source |
| `mask` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"mask","shape":"rounded","radius":8}` source |
| `collage` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","steps":[{"op":"collage","imageUrls":["https://example.com/synthetic.png","https://example.com/synthetic.png"],"columns":2,"gap":4}],"outputFormat":"png"}` source |
| `adjust` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","steps":[{"op":"adjust","brightness":1.1}],"outputFormat":"png"}` source |
| `read_metadata` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"read_metadata","metadataEngine":"exiftool"}` **blocked** |
| `remove_bg` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"remove_bg","removeBgProvider":"local"}` source |
| `ocr` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"ocr","ocrLanguages":"eng"}` **blocked** |
| `strip_gps` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","operation":"strip_gps"}` source |
| `pipeline` | `POST /franklab/api/franklab/jobs/image` | `{"imageUrl":"https://example.com/synthetic.png","steps":[{"op":"resize","width":64,"height":64}],"outputFormat":"png"}` source |
| `lookup_image-presets` | `GET /franklab/api/franklab/integrations/text-sticker/image-presets` | source |
| `lookup_image-formats` | `GET /franklab/api/franklab/integrations/text-sticker/image-formats` | source |
| `lookup_fonts` | `GET /franklab/api/franklab/integrations/text-sticker/fonts` | source |
| `lookup_signer-profiles` | `GET /franklab/api/make/c2pa/signer-profiles` | source |
| `get_task` | `GET /franklab/api/franklab/jobs/{taskId}` | source |
| `upload_source` | `POST /franklab/api/franklab/jobs/upload` | source |
| `check_connection` | `GET /franklab/api/franklab/integrations/text-sticker/auth/stats` | source |


```bash
curl --fail-with-body "$FRANKLAB_ORIGIN/franklab/api/franklab/jobs/image" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"imageUrl":"https://example.com/synthetic.png","operation":"resize","width":64,"height":64}'
```

### REST fields

Fields apply to the selected operation; required conditions and the minimal example define usage. `[]` denotes array items.

| Field | Type | Conditions and allowed values |
| --- | --- | --- |
| `imageUrl` | string | required (resize); URL; required (crop); required (filter); required (watermark); required (image_overlay); required (text); required (rotate); required (flip); required (flop); required (blur); required (sharpen); required (info); required (strip_meta); required (write_exif); required (write_metadata); required (replace_metadata); required (mask); required (collage); required (adjust); required (read_metadata); required (remove_bg); required (ocr); required (strip_gps); required (pipeline) |
| `outputFormat` | string | jpeg / png / webp / avif / gif; output Format |
| `outputQuality` | number | min 1; max 100 |
| `c2paSigningMode` | string | off / franklab / user_profile; c2pa Signing Mode |
| `contentOrigin` | string | franklab or user_profile; restricted origins require permitting user_profile and evidence; not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured; content Origin |
| `humanAuthorName` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; human Author Name |
| `humanAuthorUrl` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; human Author Url |
| `reviewedBy` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; reviewed By |
| `reviewedAt` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; reviewed At |
| `reviewMethod` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; review Method |
| `sourceMaterialUrls` | array | c2paSigningMode=franklab OR c2paSigningMode=user_profile; max items 10 |
| `originalEvidenceUrls` | array | c2paSigningMode=franklab OR c2paSigningMode=user_profile; max items 10 |
| `verifiedIncomingC2paIngredient` | boolean | c2paSigningMode=franklab OR c2paSigningMode=user_profile; verified Incoming C2pa Ingredient |
| `c2paActionDescription` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; c2pa Action Description |
| `c2paDisclosure` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; c2pa Disclosure |
| `c2paSignerProfileId` | string | required when c2paSigningMode=user_profile; rpc://getC2paSignerProfiles; c2pa Signer Profile Id |
| `preset` | string | rpc://getImagePresets; preset |
| `width` | number | width |
| `height` | number | height |
| `fit` | string | cover / contain / fill / inside / outside; fit |
| `operation` | string | required (resize); required (crop); required (filter); required (image_overlay); required (rotate); required (flip); required (flop); required (blur); required (sharpen); required (info); required (strip_meta); required (write_exif); required (write_metadata); required (replace_metadata); required (mask); required (read_metadata); required (remove_bg); required (ocr); required (strip_gps) |
| `aspectRatio` | string | aspect Ratio |
| `filterPreset` | string | grayscale / sepia / warm / cold / vibrant / muted / dramatic; filter Preset |
| `steps` | array | required (watermark); max items 20; required (text); required (collage); required (adjust); required (pipeline) |
| `steps[].op` | string | required (watermark); resize / crop / filter / watermark / text / rotate / flip / flop / blur / sharpen / mask / collage / adjust / format / info / read_metadata / remove_bg / ocr / strip_meta / write_exif / write_metadata / replace_metadata / strip_gps; steps[].op; required (text); required (collage); required (adjust); required (pipeline) |
| `steps[].preset` | string | steps[].op=resize OR steps[].op=filter; grayscale / sepia / warm / cold / vibrant / muted / dramatic; rpc://getImagePresets; steps[].preset |
| `steps[].width` | number | steps[].op=resize OR steps[].op=crop OR steps[].op=collage; steps[].width |
| `steps[].height` | number | steps[].op=resize OR steps[].op=crop OR steps[].op=collage; steps[].height |
| `steps[].fit` | string | steps[].op=resize; cover / contain / fill / inside / outside; steps[].fit |
| `steps[].aspectRatio` | string | steps[].op=crop; steps[].aspect Ratio |
| `steps[].left` | number | steps[].op=crop; steps[].left |
| `steps[].top` | number | steps[].op=crop; steps[].top |
| `steps[].brightness` | number | steps[].op=filter OR steps[].op=adjust; steps[].brightness |
| `steps[].saturation` | number | steps[].op=filter OR steps[].op=adjust; steps[].saturation |
| `steps[].hue` | number | steps[].op=filter OR steps[].op=adjust; steps[].hue |
| `steps[].imageUrl` | string | steps[].op=watermark; steps[].image Url |
| `steps[].position` | string | steps[].op=watermark OR steps[].op=text; bottom-right / bottom-left / top-right / top-left / center / top-center / bottom-center; steps[].position |
| `steps[].opacity` | number | steps[].op=watermark; steps[].opacity |
| `steps[].scale` | number | steps[].op=watermark; steps[].scale |
| `steps[].margin` | number | steps[].op=watermark; steps[].margin |
| `steps[].content` | string | steps[].op=text; steps[].content |
| `steps[].fontSize` | number | steps[].op=text; steps[].font Size |
| `steps[].color` | string | steps[].op=text; steps[].color |
| `steps[].bgColor` | string | steps[].op=text; steps[].bg Color |
| `steps[].bgOpacity` | number | steps[].op=text; steps[].bg Opacity |
| `steps[].align` | string | steps[].op=text; center / left / right; steps[].align |
| `steps[].maxWidth` | number | steps[].op=text; steps[].max Width |
| `steps[].padding` | number | steps[].op=text; steps[].padding |
| `steps[].angle` | number | steps[].op=rotate; steps[].angle |
| `steps[].background` | string | steps[].op=rotate OR steps[].op=collage; steps[].background |
| `steps[].sigma` | number | steps[].op=blur OR steps[].op=sharpen; steps[].sigma |
| `steps[].shape` | string | steps[].op=mask; rounded / circle; steps[].shape |
| `steps[].radius` | number | steps[].op=mask; steps[].radius |
| `steps[].imageUrls` | array | steps[].op=collage; steps[].image Urls |
| `steps[].columns` | number | steps[].op=collage; steps[].columns |
| `steps[].gap` | number | steps[].op=collage; steps[].gap |
| `steps[].contrast` | number | steps[].op=adjust; steps[].contrast |
| `steps[].gamma` | number | steps[].op=adjust; steps[].gamma |
| `steps[].format` | string | steps[].op=format; jpeg / png / webp / avif / gif; steps[].format |
| `steps[].metadataEngine` | string | steps[].op=read_metadata; sharp / exiftool; steps[].metadata Engine |
| `steps[].includeGps` | boolean | steps[].op=read_metadata; steps[].include Gps |
| `steps[].removeBgProvider` | string | steps[].op=remove_bg; local; steps[].remove Bg Provider |
| `steps[].alphaMatting` | boolean | steps[].op=remove_bg; steps[].alpha Matting |
| `steps[].ocrLanguages` | string | steps[].op=ocr; steps[].ocr Languages |
| `steps[].metaTitle` | string | steps[].op=write_metadata OR steps[].op=replace_metadata; steps[].meta Title |
| `steps[].metaDescription` | string | steps[].op=write_metadata OR steps[].op=replace_metadata; steps[].meta Description |
| `steps[].metaKeywords` | string | steps[].op=write_metadata; steps[].meta Keywords |
| `steps[].altText` | string | steps[].op=write_metadata OR steps[].op=replace_metadata; steps[].alt Text |
| `steps[].semanticDescription` | string | steps[].op=write_metadata; steps[].semantic Description |
| `steps[].semanticTags` | string | steps[].op=write_metadata OR steps[].op=replace_metadata; steps[].semantic Tags |
| `watermarkImageUrl` | string | URL |
| `overlayImageUrl` | string | required (image_overlay); URL |
| `overlayPosition` | string | top-left / top-center / top-right / center-left / center / center-right / bottom-left / bottom-center / bottom-right; overlay Position |
| `overlayOpacity` | number | min 0; max 1 |
| `overlayScale` | number | min 0.01; max 1 |
| `overlayMargin` | number | min 0 |
| `content` | string | content |
| `angle` | number | angle |
| `sigma` | number | sigma |
| `imageDescription` | string | image Description |
| `copyright` | string | copyright |
| `artist` | string | artist |
| `metaTitle` | string | meta Title |
| `metaDescription` | string | meta Description |
| `metaKeywords` | string | meta Keywords |
| `metaAuthor` | string | meta Author |
| `metaCopyright` | string | meta Copyright |
| `metaCredit` | string | meta Credit |
| `metaSoftware` | string | meta Software |
| `metaLicenseUrl` | string | URL |
| `metaAcquireLicensePage` | string | URL |
| `metaSourceUrl` | string | URL |
| `metaDateCreated` | string | meta Date Created |
| `metaDigitalSourceType` | string | meta Digital Source Type |
| `altText` | string | alt Text |
| `semanticDescription` | string | semantic Description |
| `semanticTags` | string | semantic Tags |
| `semanticScene` | string | semantic Scene |
| `semanticStyle` | string | semantic Style |
| `semanticMood` | string | semantic Mood |
| `semanticColors` | string | semantic Colors |
| `semanticUseCases` | string | semantic Use Cases |
| `ocrText` | string | ocr Text |
| `shape` | string | rounded / circle; shape |
| `radius` | number | radius |
| `metadataEngine` | string | sharp / exiftool; metadata Engine |
| `includeGps` | boolean | include Gps |
| `removeBgProvider` | string | local; remove Bg Provider |
| `alphaMatting` | boolean | alpha Matting |
| `ocrLanguages` | string | ocr Languages |
| `taskId` | string | required (get_task); Path parameter: returned taskId, scoped to the same partner |
| `file` | binary | required (upload_source); multipart/form-data file; maximum 157286400 bytes |

### Make options and REST conversion

This is the Make selection reference; form names can differ from REST. Convert v1*/v2*, text* and sample* fields as described above. Nested conditions describe the Make form.

| Form field | When | Values |
| --- | --- | --- |
| `operation` |  | resize / crop / filter / watermark / image_overlay / text / rotate / flip / flop / blur / sharpen / info / strip_meta / write_exif / write_metadata / replace_metadata / mask / collage / adjust / read_metadata / remove_bg / ocr / strip_gps |
| `preset` | operation=resize | rpc://getImagePresets |
| `fit` | operation=resize | cover / contain / fill / inside / outside |
| `filterPreset` | operation=filter | grayscale / sepia / warm / cold / vibrant / muted / dramatic |
| `watermarkPosition` | operation=watermark | bottom-right / bottom-left / top-right / top-left / center / top-center / bottom-center |
| `overlayPosition` | operation=image_overlay | top-left / top-center / top-right / center-left / center / center-right / bottom-left / bottom-center / bottom-right |
| `textFont` | operation=text | rpc://getFonts |
| `textPosition` | operation=text | center / top / bottom / top-left / top-right / bottom-left / bottom-right |
| `shape` | operation=mask | rounded / circle |
| `metadataEngine` | operation=read_metadata | sharp / exiftool |
| `removeBgProvider` | operation=remove_bg | local |
| `outputFormat` |  | jpeg / png / webp / avif / gif |
| `c2paSigningMode` |  | off / franklab / user_profile |
| `contentOrigin` | c2paSigningMode=franklab | not_declared / human_edited / ai_assisted / ai_generated |
| `c2paSignerProfileId` | c2paSigningMode=user_profile | rpc://getC2paSignerProfiles |
| `contentOrigin` | c2paSigningMode=user_profile | not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured |
| `steps[].op` |  | resize / crop / filter / watermark / text / rotate / flip / flop / blur / sharpen / mask / collage / adjust / format / info / read_metadata / remove_bg / ocr / strip_meta / write_exif / write_metadata / replace_metadata / strip_gps |
| `steps[].preset` | steps[].op=resize | rpc://getImagePresets |
| `steps[].fit` | steps[].op=resize | cover / contain / fill / inside / outside |
| `steps[].preset` | steps[].op=filter | grayscale / sepia / warm / cold / vibrant / muted / dramatic |
| `steps[].position` | steps[].op=watermark | bottom-right / bottom-left / top-right / top-left / center / top-center / bottom-center |
| `steps[].position` | steps[].op=text | center / top-center / bottom-center / top-left / top-right / bottom-left / bottom-right |
| `steps[].align` | steps[].op=text | center / left / right |
| `steps[].shape` | steps[].op=mask | rounded / circle |
| `steps[].format` | steps[].op=format | jpeg / png / webp / avif / gif |
| `steps[].metadataEngine` | steps[].op=read_metadata | sharp / exiftool |
| `steps[].removeBgProvider` | steps[].op=remove_bg | local |

### Response and verification limits

HTTP 200 {success:true,data:{taskId,status,final_cost_franks,cost_currency,cost_status,cost_unit}}; poll the returned taskId.


Sharpen steps accept sigma; Make flat/jagged are absent from the REST DTO. write_exif steps do not declare imageDescription/copyright/artist: use single operation=write_exif.

Known REST limitation: `info`, `read_metadata`, `ocr`. The worker returns data without a primary file, while task terminalization requires that file. These functions are blocked pending a separate fix; do not use them for a paid trial.

## INDEXLIFT

execution_mode=sync calls audit-landing with {url,mode}; async_wait calls audit-landing/async and its dedicated status route. Make pageUrl maps to url. mode: single-page or crawl. Resume with the saved taskId instead of submitting again. idempotency_key is absent from the DTO: use the Idempotency-Key header for async. The synchronous route forwards the SEO service response; it does not establish the media-job billing or response contract.

### Operations and minimal JSON requests

Each example below is the complete JSON for its POST; replace URLs/IDs with your own. Operation/mode selectors choose functions, not generation models. “source” means source-checked without live/E2E; “blocked” marks a known limitation.

| Operation | HTTP and path | Minimal JSON / status |
| --- | --- | --- |
| `async_wait` | `POST /franklab/api/franklab/jobs/audit-landing/async` | `{"url":"https://example.com/","mode":"single-page"}` source |
| `sync` | `POST /franklab/api/franklab/jobs/audit-landing` | `{"url":"https://example.com/","mode":"single-page"}` source |
| `get_task` | `GET /franklab/api/franklab/jobs/audit-landing/async/{taskId}` | source |
| `upload_source` | `POST /franklab/api/franklab/jobs/upload` | source |
| `check_connection` | `GET /franklab/api/franklab/integrations/text-sticker/auth/stats` | source |


```bash
curl --fail-with-body "$FRANKLAB_ORIGIN/franklab/api/franklab/jobs/audit-landing/async" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"url":"https://example.com/","mode":"single-page"}'
```

For async POST add `-H "Idempotency-Key: your-unique-request-id"`. Reuse a key only for the same request.

### REST fields

Fields apply to the selected operation; required conditions and the minimal example define usage. `[]` denotes array items.

| Field | Type | Conditions and allowed values |
| --- | --- | --- |
| `url` | string | required (async_wait); Public HTTP(S) URL; required (sync) |
| `mode` | string | single-page / crawl |
| `taskId` | string | required (get_task); Path parameter: returned taskId, scoped to the same partner |
| `file` | binary | required (upload_source); multipart/form-data file; maximum 157286400 bytes |

### Make options and REST conversion

This is the Make selection reference; form names can differ from REST. Convert v1*/v2*, text* and sample* fields as described above. Nested conditions describe the Make form.

| Form field | When | Values |
| --- | --- | --- |
| `execution_mode` |  | async_wait / sync |
| `mode` |  | single-page / crawl |

### Response and verification limits

Sync forwards SEO response; async: {success:true,data:{taskId,task_id,status:"queued",phase,idempotency_key,idempotency_hit,final_cost_franks,cost_currency,cost_status:"reserved",cost_unit}}.


Asynchronous INDEXLIFT uses zeroCost in source and opens no reservation. It is a distinct free execution contract, not a paid media-job; successful execution still needs verification. The parent campaign observed the nested report at `data.result.data.seo_report` on 8 September 2026; `data.result` preserves the SEO service envelope. Read suggestions at `data.result.data.brief_suggestions` when present. Make currently reads top-level `body.data.seo_report`, which can omit this result. Async successful `cost_status` is `confirmed` with zero cost, not the ordinary JobsFacade `final`.

## KLEY

operation selects the route: speed → video-speed; subtitles → subtitles; overlay/image_on_video → overlay; all others → montage. concat accepts videos[] with url and the transition to the next clip; transition fields on the last item are ignored. transitionSoundMode=none/auto/manual; manual requires transitionSoundPreset, volume 0–1.5. Do not send a top-level transitionType string. slideshow requires at least 2 images; slideTransitionDuration must be less than slideDuration. quality_compare requires referenceVideoUrl. Analysis/comparison operations do not guarantee downloadUrl and need separate execution verification.

### Operations and minimal JSON requests

Each example below is the complete JSON for its POST; replace URLs/IDs with your own. Operation/mode selectors choose functions, not generation models. “source” means source-checked without live/E2E; “blocked” marks a known limitation.

| Operation | HTTP and path | Minimal JSON / status |
| --- | --- | --- |
| `concat` | `POST /franklab/api/franklab/jobs/montage` | `{"operation":"concat","videos":[{"url":"https://example.com/synthetic.mp4"},{"url":"https://example.com/synthetic.mp4"}]}` source |
| `frame` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"frame","position":"start","format":"png"}` source |
| `trim` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"trim","startTime":0,"duration":1}` source |
| `reverse` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"reverse"}` source |
| `crop` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"crop","aspectRatio":"1:1"}` source |
| `resize` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"resize","width":160,"height":160}` source |
| `probe` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"probe"}` **blocked** |
| `write_tags` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"write_tags","tagTitle":"Synthetic test"}` source |
| `replace_tags` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"replace_tags","tagTitle":"Synthetic test"}` source |
| `strip_tags` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"strip_tags"}` source |
| `gif` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"gif","duration":1,"fps":5,"width":160}` source |
| `fade` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"fade","fadeInDuration":0.2}` source |
| `thumbnail_smart` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"thumbnail_smart"}` source |
| `transcode` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"transcode","videoCodec":"libx264","crf":28}` source |
| `pip` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"pip","overlayVideoUrl":"https://example.com/synthetic.mp4","pipScale":0.25}` source |
| `image_on_video` | `POST /franklab/api/franklab/jobs/overlay` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"image_on_video","overlayImageUrl":"https://example.com/synthetic.png","overlayScale":0.25}` source |
| `video_on_image` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"video_on_image","imageUrl":"https://example.com/synthetic.png","overlayVideoUrl":"https://example.com/synthetic.mp4","durationMode":"overlay"}` source |
| `slideshow` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"slideshow","imageUrls":["https://example.com/synthetic.png","https://example.com/synthetic.png"],"slideDuration":1,"slideTransition":"none"}` source |
| `speed` | `POST /franklab/api/franklab/jobs/video-speed` | `{"videoUrl":"https://example.com/synthetic.mp4","speed":1.1}` source |
| `subtitles` | `POST /franklab/api/franklab/jobs/subtitles` | `{"videoUrl":"https://example.com/synthetic.mp4","subtitles":[{"text":"Synthetic test","startTime":0,"endTime":1}]}` source |
| `overlay` | `POST /franklab/api/franklab/jobs/overlay` | `{"videoUrl":"https://example.com/synthetic.mp4","overlays":[{"type":"text","content":"Synthetic test","x":50,"y":50}]}` source |
| `quality_compare` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"quality_compare","referenceVideoUrl":"https://example.com/synthetic.mp4"}` **blocked** |
| `stabilize` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"stabilize"}` source |
| `scenes` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"scenes"}` **blocked** |
| `qc_report` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"qc_report"}` **blocked** |
| `split_screen` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"split_screen","videos":[{"url":"https://example.com/synthetic.mp4"},{"url":"https://example.com/synthetic.mp4"}],"splitLayout":"horizontal"}` source |
| `slow_motion` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"slow_motion","slowFactor":2,"slowFps":30}` source |
| `denoise` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"denoise","denoiseMethod":"hqdn3d","denoiseStrength":"low"}` source |
| `hdr_to_sdr` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"hdr_to_sdr","tonemapMethod":"hable"}` source |
| `animated` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"animated","animatedFormat":"webp","duration":1,"fps":5,"width":160}` source |
| `mezzanine` | `POST /franklab/api/franklab/jobs/montage` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"mezzanine","mezzanineCodec":"prores","proresProfile":0}` source |
| `lookup_transitions` | `GET /franklab/api/franklab/integrations/text-sticker/transitions` | source |
| `lookup_transition-sounds` | `GET /franklab/api/franklab/integrations/text-sticker/transition-sounds` | source |
| `lookup_aspect-ratios` | `GET /franklab/api/franklab/integrations/text-sticker/aspect-ratios` | source |
| `lookup_resize-presets` | `GET /franklab/api/franklab/integrations/text-sticker/resize-presets` | source |
| `lookup_signer-profiles` | `GET /franklab/api/make/c2pa/signer-profiles` | source |
| `get_task` | `GET /franklab/api/franklab/jobs/{taskId}` | source |
| `upload_source` | `POST /franklab/api/franklab/jobs/upload` | source |
| `check_connection` | `GET /franklab/api/franklab/integrations/text-sticker/auth/stats` | source |


```bash
curl --fail-with-body "$FRANKLAB_ORIGIN/franklab/api/franklab/jobs/montage" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"operation":"concat","videos":[{"url":"https://example.com/synthetic.mp4"},{"url":"https://example.com/synthetic.mp4"}]}'
```

### REST fields

Fields apply to the selected operation; required conditions and the minimal example define usage. `[]` denotes array items.

| Field | Type | Conditions and allowed values |
| --- | --- | --- |
| `callbackUrl` | string | URL |
| `videos` | array | max items 20 |
| `maxTransitionRatio` | number | max Transition Ratio |
| `operation` | string | required (concat); required (frame); required (trim); required (reverse); required (crop); required (resize); required (probe); required (write_tags); required (replace_tags); required (strip_tags); required (gif); required (fade); required (thumbnail_smart); required (transcode); required (pip); required (image_on_video); required (video_on_image); required (slideshow); required (quality_compare); required (stabilize); required (scenes); required (qc_report); required (split_screen); required (slow_motion); required (denoise); required (hdr_to_sdr); required (animated); required (mezzanine) |
| `videoUrl` | string | required (frame); URL; required (trim); required (reverse); required (crop); required (resize); required (probe); required (write_tags); required (replace_tags); required (strip_tags); required (gif); required (fade); required (thumbnail_smart); required (transcode); required (pip); required (image_on_video); required (video_on_image); required (slideshow); required (speed); required (subtitles); required (overlay); required (quality_compare); required (stabilize); required (scenes); required (qc_report); required (split_screen); required (slow_motion); required (denoise); required (hdr_to_sdr); required (animated); required (mezzanine) |
| `position` | string | first / middle / last / custom; position |
| `customTime` | number | custom Time |
| `format` | string | jpg / png; format |
| `startTime` | number | start Time; min 0 |
| `duration` | number | duration; min 0 |
| `aspectRatio` | string | rpc://getAspectRatios; aspect Ratio |
| `cropW` | number | crop W |
| `cropH` | number | crop H |
| `cropX` | number | crop X |
| `cropY` | number | crop Y |
| `preset` | string | rpc://getResizePresets; preset; fast / medium / slow / veryslow |
| `width` | number | width |
| `height` | number | height |
| `tagTitle` | string | tag Title |
| `tagArtist` | string | tag Artist |
| `tagDescription` | string | tag Description |
| `tagComment` | string | tag Comment |
| `tagDate` | string | tag Date |
| `tagKeywords` | string | tag Keywords |
| `tagCopyright` | string | tag Copyright |
| `tagSoftware` | string | tag Software |
| `tagGenre` | string | tag Genre |
| `tagLanguage` | string | tag Language |
| `tagCreationTime` | string | tag Creation Time |
| `summary` | string | summary |
| `transcript` | string | transcript |
| `thumbnailAltText` | string | thumbnail Alt Text |
| `c2paSigningMode` | string | off / franklab / user_profile; c2pa Signing Mode |
| `c2paSignerProfileId` | string | required when c2paSigningMode=user_profile; rpc://getC2paSignerProfiles; c2pa Signer Profile Id |
| `contentOrigin` | string | franklab or user_profile; restricted origins require permitting user_profile and evidence; not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured; content Origin |
| `sourceMaterialUrls` | array | max items 10 |
| `originalEvidenceUrls` | array | max items 10 |
| `verifiedIncomingC2paIngredient` | boolean | verified Incoming C2pa Ingredient |
| `c2paActionDescription` | string | c2pa Action Description |
| `c2paDisclosure` | string | c2pa Disclosure |
| `fps` | number | fps |
| `fadeInDuration` | number | fade In Duration |
| `fadeOutDuration` | number | fade Out Duration |
| `videoCodec` | string | libx264 / libx265 / libvpx-vp9 / copy; video Codec |
| `crf` | number | crf |
| `audioBitrate` | string | 64k / 96k / 128k / 160k / 192k / 256k / 320k; 8k–320k string; custom is a Make control, not a REST value |
| `overlayVideoUrl` | string | required (pip); URL; required (video_on_image) |
| `pipPosition` | string | top-left / top-right / bottom-left / bottom-right / center; pip Position |
| `pipScale` | number | pip Scale |
| `includeBaseAudio` | boolean | include Base Audio |
| `baseAudioVolume` | number | base Audio Volume |
| `includeOverlayAudio` | boolean | include Overlay Audio |
| `overlayAudioVolume` | number | overlay Audio Volume |
| `overlayImageUrl` | string | required (image_on_video); URL |
| `overlayPosition` | string | top-left / top-center / top-right / center / bottom-left / bottom-center / bottom-right; overlay Position |
| `overlayScale` | number | min 0.01; max 1 |
| `overlayOpacity` | number | min 0; max 1 |
| `overlayMargin` | number | min 0 |
| `endTime` | number | min 0 |
| `imageUrl` | string | required (video_on_image); URL |
| `durationMode` | string | overlay / fixed; duration Mode |
| `imageUrls` | array | max items 20 |
| `slideDuration` | number | slide Duration |
| `slideTransition` | string | rpc://getTransitions; slide Transition |
| `slideTransitionDuration` | number | slide Transition Duration |
| `speed` | number | required (speed); min 0.25; max 4 |
| `templateId` | string | template Id |
| `language` | string | ru / en / auto; language |
| `highlightMode` | string | none / keywords / karaoke; highlight Mode |
| `platform` | string | none / tiktok / instagram_reels / youtube_shorts; platform |
| `safeZonePreset` | string | safe Zone Preset |
| `subtitles` | array | max items 500 |
| `overlays` | array | max items 20 |
| `configId` | string | config Id |
| `referenceVideoUrl` | string | required (quality_compare); URL |
| `shakiness` | number | min 1; max 10 |
| `smoothing` | number | min 1; max 100 |
| `sceneThreshold` | number | min 1; max 100 |
| `sceneThumbnails` | boolean | scene Thumbnails |
| `splitLayout` | string | horizontal / vertical / grid_2x2; split Layout |
| `slowFactor` | number | 2 / 4; slow Factor |
| `slowFps` | number | 30 / 60; slow Fps |
| `denoiseMethod` | string | hqdn3d / nlmeans; denoise Method |
| `denoiseStrength` | string | low / medium / high; denoise Strength |
| `tonemapMethod` | string | hable / mobius / reinhard; tonemap Method |
| `animatedFormat` | string | webp / avif; animated Format |
| `mezzanineCodec` | string | prores / dnxhd; mezzanine Codec |
| `proresProfile` | number | 0 / 1 / 2 / 3; prores Profile |
| `dnxhdProfile` | string | dnxhr_lb / dnxhr_sq / dnxhr_hq / dnxhr_hqx; dnxhd Profile |
| `taskId` | string | required (get_task); Path parameter: returned taskId, scoped to the same partner |
| `file` | binary | required (upload_source); multipart/form-data file; maximum 157286400 bytes |

### Make options and REST conversion

This is the Make selection reference; form names can differ from REST. Convert v1*/v2*, text* and sample* fields as described above. Nested conditions describe the Make form.

| Form field | When | Values |
| --- | --- | --- |
| `operation` |  | concat / frame / trim / reverse / crop / resize / probe / write_tags / replace_tags / strip_tags / gif / fade / thumbnail_smart / transcode / pip / image_on_video / video_on_image / slideshow / speed / subtitles / overlay / quality_compare / stabilize / scenes / qc_report / split_screen / slow_motion / denoise / hdr_to_sdr / animated / mezzanine |
| `position` | operation=frame | first / middle / last / custom |
| `format` | operation=frame | jpg / png |
| `aspectRatio` | operation=crop | rpc://getAspectRatios |
| `preset` | operation=resize | rpc://getResizePresets |
| `c2paSigningMode` | operation=write_tags | off / franklab / user_profile |
| `c2paSignerProfileId` | operation=write_tags | rpc://getC2paSignerProfiles |
| `contentOrigin` | operation=write_tags | not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured |
| `c2paSigningMode` | operation=replace_tags | off / franklab / user_profile |
| `c2paSignerProfileId` | operation=replace_tags | rpc://getC2paSignerProfiles |
| `contentOrigin` | operation=replace_tags | not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured |
| `format` | operation=thumbnail_smart | jpg / png |
| `videoCodec` | operation=transcode | libx264 / libx265 / libvpx-vp9 / copy |
| `preset` | operation=transcode | fast / medium / slow / veryslow |
| `pipPosition` | operation=pip | top-left / top-right / bottom-left / bottom-right / center |
| `overlayPosition` | operation=image_on_video | top-left / top-center / top-right / center / bottom-left / bottom-center / bottom-right |
| `pipPosition` | operation=video_on_image | top-left / top-right / bottom-left / bottom-right / center |
| `durationMode` | operation=video_on_image | overlay / fixed |
| `slideTransition` | operation=slideshow | rpc://getTransitions |
| `subtitleLanguage` | operation=subtitles | ru / en / auto |
| `highlightMode` | operation=subtitles | none / keywords / karaoke |
| `subtitlePlatform` | operation=subtitles | none / tiktok / instagram_reels / youtube_shorts |
| `splitLayout` | operation=split_screen | horizontal / vertical / grid_2x2 |
| `slowFactor` | operation=slow_motion | 2 / 4 |
| `slowFps` | operation=slow_motion | 30 / 60 |
| `denoiseMethod` | operation=denoise | hqdn3d / nlmeans |
| `denoiseStrength` | operation=denoise | low / medium / high |
| `tonemapMethod` | operation=hdr_to_sdr | hable / mobius / reinhard |
| `animatedFormat` | operation=animated | webp / avif |
| `mezzanineCodec` | operation=mezzanine | prores / dnxhd |
| `proresProfile` | operation=mezzanine | 0 / 1 / 2 / 3 |
| `dnxhdProfile` | operation=mezzanine | dnxhr_lb / dnxhr_sq / dnxhr_hq / dnxhr_hqx |

### Response and verification limits

HTTP 200 {success:true,data:{taskId,status,final_cost_franks,cost_currency,cost_status,cost_unit}}; poll the returned taskId.


Known REST limitation: `probe`, `quality_compare`, `qc_report`, `scenes`. The worker returns data without a primary file, while task terminalization requires that file. These functions are blocked pending a separate fix; do not use them for a paid trial.

## OVERLAY

Creation and polling use make/jobs. The artifact URL is data.result.downloadUrl. overlays has up to 20 objects: type=text/sticker/animated_sticker/emoji/watermark with type-specific fields. Use IDs from the lookup routes. Text layers use content; watermark layers use imageUrl. platform and configId control placement.

### Operations and minimal JSON requests

Each example below is the complete JSON for its POST; replace URLs/IDs with your own. Operation/mode selectors choose functions, not generation models. “source” means source-checked without live/E2E; “blocked” marks a known limitation.

| Operation | HTTP and path | Minimal JSON / status |
| --- | --- | --- |
| `overlay` | `POST /franklab/api/make/jobs/overlay` | `{"videoUrl":"https://example.com/synthetic.mp4","overlays":[{"type":"text","content":"Synthetic test","x":50,"y":50,"fontSize":24,"color":"#FFFFFF"}]}` source |
| `lookup_stickers_animated_true` | `GET /franklab/api/franklab/integrations/text-sticker/stickers?animated=true` | source |
| `lookup_emojis` | `GET /franklab/api/franklab/integrations/text-sticker/emojis` | source |
| `lookup_fonts` | `GET /franklab/api/franklab/integrations/text-sticker/fonts` | source |
| `lookup_stickers_animated_false` | `GET /franklab/api/franklab/integrations/text-sticker/stickers?animated=false` | source |
| `lookup_safe-zone-options` | `GET /franklab/api/franklab/integrations/text-sticker/safe-zone-options` | source |
| `lookup_subtitle-templates` | `GET /franklab/api/franklab/integrations/text-sticker/subtitle-templates` | source |
| `lookup_transitions` | `GET /franklab/api/franklab/integrations/text-sticker/transitions` | source |
| `lookup_video-effects` | `GET /franklab/api/franklab/integrations/text-sticker/video-effects` | source |
| `get_task` | `GET /franklab/api/make/jobs/{taskId}` | source |
| `upload_source` | `POST /franklab/api/franklab/jobs/upload` | source |
| `check_connection` | `GET /franklab/api/franklab/integrations/text-sticker/auth/stats` | source |


```bash
curl --fail-with-body "$FRANKLAB_ORIGIN/franklab/api/make/jobs/overlay" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"videoUrl":"https://example.com/synthetic.mp4","overlays":[{"type":"text","content":"Synthetic test","x":50,"y":50,"fontSize":24,"color":"#FFFFFF"}]}'
```

### REST fields

Fields apply to the selected operation; required conditions and the minimal example define usage. `[]` denotes array items.

| Field | Type | Conditions and allowed values |
| --- | --- | --- |
| `videoUrl` | string | required (overlay); URL |
| `platform` | string | none / tiktok / instagram_reels / youtube_shorts; platform |
| `configId` | string | config Id |
| `overlays` | array | max items 20 |
| `overlays[].type` | string | required (overlay); text / emoji / sticker / animated_sticker / watermark; overlays[].type |
| `overlays[].content` | string | overlays[].content |
| `overlays[].stickerId` | string | rpc://getOverlayStickers; overlays[].sticker Id |
| `overlays[].animatedStickerId` | string | rpc://getOverlayAnimatedStickers; overlays[].animated Sticker Id |
| `overlays[].imageUrl` | string | overlays[].image Url |
| `overlays[].opacity` | number | overlays[].opacity |
| `overlays[].scale` | number | overlays[].scale |
| `overlays[].position` | string |  / bottom-right / bottom-left / top-right / top-left / center / top-center / bottom-center; overlays[].position |
| `overlays[].margin` | number | overlays[].margin |
| `overlays[].emojiId` | string | rpc://getOverlayEmojis; overlays[].emoji Id |
| `overlays[].placement` | string | custom / center / top_safe / bottom_safe / top_left_safe / top_right_safe / bottom_left_safe / bottom_right_safe; overlays[].placement |
| `overlays[].x` | number | overlays[].x |
| `overlays[].y` | number | overlays[].y |
| `overlays[].startTime` | number | overlays[].start Time |
| `overlays[].endTime` | number | overlays[].end Time |
| `overlays[].fontSize` | number | overlays[].font Size |
| `overlays[].color` | string | overlays[].color |
| `overlays[].font` | string | rpc://getOverlayFonts; overlays[].font |
| `overlays[].shadowColor` | string | overlays[].shadow Color |
| `overlays[].shadowX` | number | overlays[].shadow X |
| `overlays[].shadowY` | number | overlays[].shadow Y |
| `overlays[].width` | number | overlays[].width |
| `overlays[].height` | number | overlays[].height |
| `callbackUrl` | string | URL |
| `taskId` | string | required (get_task); Path parameter: returned taskId, scoped to the same partner |
| `file` | binary | required (upload_source); multipart/form-data file; maximum 157286400 bytes |

### Make options and REST conversion

This is the Make selection reference; form names can differ from REST. Convert v1*/v2*, text* and sample* fields as described above. Nested conditions describe the Make form.

| Form field | When | Values |
| --- | --- | --- |
| `platform` |  | none / tiktok / instagram_reels / youtube_shorts |
| `overlays[].type` |  | text / emoji / sticker / animated_sticker / watermark |
| `overlays[].stickerId` |  | rpc://getOverlayStickers |
| `overlays[].animatedStickerId` |  | rpc://getOverlayAnimatedStickers |
| `overlays[].position` |  |  / bottom-right / bottom-left / top-right / top-left / center / top-center / bottom-center |
| `overlays[].emojiId` |  | rpc://getOverlayEmojis |
| `overlays[].placement` |  | custom / center / top_safe / bottom_safe / top_left_safe / top_right_safe / bottom_left_safe / bottom_right_safe |
| `overlays[].font` |  | rpc://getOverlayFonts |

### Response and verification limits

HTTP 200 {success:true,data:{taskId,status,final_cost_franks,cost_currency,cost_status,cost_unit}}; poll the returned taskId.


## PLASTINKA

The 8 September 2026 WAV `trim` check returned an audio-only MP4, but its codec could not be decoded by the local verification tools. Do not assume the returned container is browser-compatible; verify playback for your input format. Other audio operations were not tested by this example.

For audio processing, the source audio URL is named videoUrl. overlay/replace/fit also need audioUrl or sampleId; Make apply_sample becomes operation=sampleOperation (overlay/replace). merge uses audioUrls[] plus videoUrl equal to the first URL. save_sample returns a resource id, not a task: JSON {name,sampleUrl} or multipart name+sampleFile, exactly one source, up to 50 MiB, mp3/wav/aac/m4a/ogg/flac. sampleEndTime must exceed sampleStartTime. Make exposes sampleSourceMode=file but sends JSON without sampleFile; use direct multipart REST.

### Operations and minimal JSON requests

Each example below is the complete JSON for its POST; replace URLs/IDs with your own. Operation/mode selectors choose functions, not generation models. “source” means source-checked without live/E2E; “blocked” marks a known limitation.

| Operation | HTTP and path | Minimal JSON / status |
| --- | --- | --- |
| `save_sample` | `POST /franklab/api/franklab/audio-samples` | `{"name":"Synthetic sample","sampleUrl":"https://example.com/synthetic.wav"}` source |
| `apply_sample` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.mp4","operation":"overlay","sampleId":"<SAMPLE_UUID>"}` source |
| `overlay` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"overlay","audioUrl":"https://example.com/synthetic.wav"}` source |
| `replace` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"replace","audioUrl":"https://example.com/synthetic.wav"}` source |
| `fit` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"fit","audioUrl":"https://example.com/synthetic.wav","fitStrategy":"trim_pad","fitAudioMode":"replace"}` source |
| `extract` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"extract"}` source |
| `speed` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"speed","speed":1.1}` source |
| `remove` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"remove"}` source |
| `probe` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"probe"}` **blocked** |
| `write_tags` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"write_tags","tagTitle":"Synthetic test"}` source |
| `replace_tags` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"replace_tags","tagTitle":"Synthetic test"}` source |
| `strip_tags` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"strip_tags"}` source |
| `normalize` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"normalize","targetLoudness":-16}` source |
| `trim` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"trim","startTime":0,"duration":1}` source |
| `convert` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"convert","targetFormat":"mp3","audioBitrate":"64k"}` source |
| `fade` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"fade","fadeInDuration":0.2}` source |
| `merge` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"merge","audioUrls":["https://example.com/synthetic.wav","https://example.com/synthetic.wav"]}` source |
| `quality_compare` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"quality_compare","referenceAudioUrl":"https://example.com/synthetic.wav"}` **blocked** |
| `analyze` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"analyze"}` **blocked** |
| `spectrogram` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"spectrogram","imageWidth":320,"imageHeight":240}` source |
| `waveform_image` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"waveform_image","imageWidth":320,"imageHeight":240}` source |
| `fingerprint` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"fingerprint"}` **blocked** |
| `enhance_dialogue` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"enhance_dialogue","enhanceOriginal":1,"enhanceAmount":1}` source |
| `stereo_tools` | `POST /franklab/api/franklab/jobs/audio` | `{"videoUrl":"https://example.com/synthetic.wav","operation":"stereo_tools","stereoPreset":"mono"}` source |
| `lookup_audio-samples` | `GET /franklab/api/franklab/integrations/text-sticker/audio-samples` | source |
| `lookup_signer-profiles` | `GET /franklab/api/make/c2pa/signer-profiles` | source |
| `get_task` | `GET /franklab/api/franklab/jobs/{taskId}` | source |
| `upload_source` | `POST /franklab/api/franklab/jobs/upload` | source |
| `save_sample_file` | `POST /franklab/api/franklab/audio-samples` | source |
| `list_samples` | `GET /franklab/api/franklab/audio-samples` | source |
| `check_connection` | `GET /franklab/api/franklab/integrations/text-sticker/auth/stats` | source |


```bash
curl --fail-with-body "$FRANKLAB_ORIGIN/franklab/api/franklab/jobs/audio" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"videoUrl":"https://example.com/synthetic.mp4","operation":"overlay","sampleId":"<SAMPLE_UUID>"}'
```

```bash
curl --fail-with-body "$FRANKLAB_ORIGIN/franklab/api/franklab/audio-samples" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -F "name=Synthetic sample" -F "sampleFile=@synthetic.wav;type=audio/wav"
```

### REST fields

Fields apply to the selected operation; required conditions and the minimal example define usage. `[]` denotes array items.

| Field | Type | Conditions and allowed values |
| --- | --- | --- |
| `name` | string | required (save_sample); max length 120; required (save_sample_file); Non-empty, maximum 120 characters |
| `sampleUrl` | string | required when sampleSourceMode=url; URL |
| `sampleStartTime` | number | min 0; Seconds >=0 |
| `sampleEndTime` | number | min 0; Seconds greater than start |
| `videoUrl` | string | required (apply_sample); URL; required (overlay); required (replace); required (fit); required (extract); required (speed); required (remove); required (probe); required (write_tags); required (replace_tags); required (strip_tags); required (normalize); required (trim); required (convert); required (fade); required (merge); required (quality_compare); required (analyze); required (spectrogram); required (waveform_image); required (fingerprint); required (enhance_dialogue); required (stereo_tools) |
| `sampleId` | string | required (apply_sample); rpc://getAudioSamples; sample Id |
| `operation` | string | required (apply_sample); overlay / replace / fit; operation; required (overlay); required (replace); required (fit); required (extract); required (speed); required (remove); required (probe); required (write_tags); required (replace_tags); required (strip_tags); required (normalize); required (trim); required (convert); required (fade); required (merge); required (quality_compare); required (analyze); required (spectrogram); required (waveform_image); required (fingerprint); required (enhance_dialogue); required (stereo_tools) |
| `insertAtTime` | number | min 0 |
| `audioStartTime` | number | min 0 |
| `audioEndTime` | number | min 0 |
| `audioVolume` | number | min 0; max 2 |
| `videoVolume` | number | min 0; max 2; fitAudioMode=mix |
| `loopIfShort` | boolean | loop If Short; fitStrategy=trim_pad |
| `callbackUrl` | string | URL |
| `audioUrl` | string | required (overlay); URL; required (replace); required (fit) |
| `audioFadeOut` | boolean | audio Fade Out |
| `fitAudioMode` | string | required (fit); replace / mix; fit Audio Mode |
| `fitStrategy` | string | required (fit); trim_pad / stretch; fit Strategy |
| `speedMode` | string | required when fitStrategy=stretch; standard / voice_natural; speed Mode; required (speed) |
| `speed` | number | required (speed); min 0.25; max 4 |
| `audioBitrate` | string | 64k / 96k / 128k / 160k / 192k / 256k / 320k; 8k–320k string; custom is a Make control, not a REST value |
| `tagTitle` | string | tag Title |
| `tagArtist` | string | tag Artist |
| `tagAlbum` | string | tag Album |
| `tagGenre` | string | tag Genre |
| `tagComment` | string | tag Comment |
| `tagDate` | string | tag Date |
| `tagDescription` | string | tag Description |
| `tagKeywords` | string | tag Keywords |
| `tagCopyright` | string | tag Copyright |
| `tagComposer` | string | tag Composer |
| `tagAlbumArtist` | string | tag Album Artist |
| `tagTrack` | string | tag Track |
| `tagDisc` | string | tag Disc |
| `tagPublisher` | string | tag Publisher |
| `tagBpm` | string | tag Bpm |
| `tagLanguage` | string | tag Language |
| `tagSoftware` | string | tag Software |
| `summary` | string | summary |
| `transcript` | string | transcript |
| `c2paSigningMode` | string | off / franklab / user_profile; c2pa Signing Mode |
| `c2paSignerProfileId` | string | required when c2paSigningMode=user_profile; rpc://getC2paSignerProfiles; c2pa Signer Profile Id |
| `contentOrigin` | string | franklab or user_profile; restricted origins require permitting user_profile and evidence; not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured; content Origin |
| `sourceMaterialUrls` | array | max items 10 |
| `originalEvidenceUrls` | array | max items 10 |
| `verifiedIncomingC2paIngredient` | boolean | verified Incoming C2pa Ingredient |
| `c2paActionDescription` | string | c2pa Action Description |
| `c2paDisclosure` | string | c2pa Disclosure |
| `targetLoudness` | number | target Loudness |
| `targetTruePeak` | number | target True Peak |
| `startTime` | number | min 0 |
| `duration` | number | required (trim); min 0 |
| `targetFormat` | string | required (convert); mp3 / aac / wav / ogg / flac / alac / opus; target Format |
| `fadeInDuration` | number | min 0 |
| `fadeOutDuration` | number | min 0 |
| `audioUrls` | array | max items 20 |
| `referenceAudioUrl` | string | required (quality_compare); URL |
| `imageWidth` | number | min 160; max 4096 |
| `imageHeight` | number | min 120; max 2160 |
| `spectrogramColor` | string | intensity / channel / rainbow / moreland / nebulae / fire / fiery / fruit / cool / magma / green / viridis / plasma / cividis / terrain; spectrogram Color |
| `spectrogramScale` | string | log / lin / sqrt / cbrt / 4thrt / 5thrt; spectrogram Scale |
| `spectrogramLegend` | boolean | spectrogram Legend |
| `waveformColor` | string | waveform Color |
| `waveformBgColor` | string | waveform Bg Color |
| `waveformSplitChannels` | boolean | waveform Split Channels |
| `enhanceOriginal` | number | min 0; max 1 |
| `enhanceAmount` | number | min 0; max 3 |
| `stereoPreset` | string | widen / narrow / mono; stereo Preset |
| `taskId` | string | required (get_task); Path parameter: returned taskId, scoped to the same partner |
| `file` | binary | required (upload_source); multipart/form-data file; maximum 157286400 bytes |
| `sampleFile` | binary | required (save_sample_file); multipart/form-data; <=50 MiB; mp3/wav/aac/m4a/ogg/flac |

### Make options and REST conversion

This is the Make selection reference; form names can differ from REST. Convert v1*/v2*, text* and sample* fields as described above. Nested conditions describe the Make form.

| Form field | When | Values |
| --- | --- | --- |
| `operation` |  | save_sample / apply_sample / overlay / replace / fit / extract / speed / remove / probe / write_tags / replace_tags / strip_tags / normalize / trim / convert / fade / merge / quality_compare / analyze / spectrogram / waveform_image / fingerprint / enhance_dialogue / stereo_tools |
| `sampleSourceMode` | operation=save_sample | url / file |
| `sampleId` | operation=apply_sample | rpc://getAudioSamples |
| `sampleOperation` | operation=apply_sample | overlay / replace / fit |
| `fitAudioMode` | operation=fit | replace / mix |
| `fitStrategy` | operation=fit | trim_pad / stretch |
| `speedMode` | operation=fit; fitStrategy=stretch | standard / voice_natural |
| `speedMode` | operation=speed | standard / voice_natural |
| `audioBitrate` | operation=speed | 64k / 96k / 128k / 160k / 192k / 256k / 320k / custom |
| `c2paSigningMode` | operation=write_tags | off / franklab / user_profile |
| `c2paSignerProfileId` | operation=write_tags | rpc://getC2paSignerProfiles |
| `contentOrigin` | operation=write_tags | not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured |
| `c2paSigningMode` | operation=replace_tags | off / franklab / user_profile |
| `c2paSignerProfileId` | operation=replace_tags | rpc://getC2paSignerProfiles |
| `contentOrigin` | operation=replace_tags | not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured |
| `targetFormat` | operation=convert | mp3 / aac / wav / ogg / flac / alac / opus |
| `audioBitrate` | operation=convert | 64k / 96k / 128k / 160k / 192k / 256k / 320k / custom |
| `spectrogramColor` | operation=spectrogram | intensity / channel / rainbow / moreland / nebulae / fire / fiery / fruit / cool / magma / green / viridis / plasma / cividis / terrain |
| `spectrogramScale` | operation=spectrogram | log / lin / sqrt / cbrt / 4thrt / 5thrt |
| `stereoPreset` | operation=stereo_tools | widen / narrow / mono |

### Response and verification limits

HTTP 200 {success:true,data:{id,name,sourceUrl,mimeType,format,durationMs,clipStartTime,clipEndTime,isSystem,createdAt}}; no task polling.


Known REST limitation: `probe`, `quality_compare`, `analyze`, `fingerprint`. The worker returns data without a primary file, while task terminalization requires that file. These functions are blocked pending a separate fix; do not use them for a paid trial.

## SPEKTR

The 8 September 2026 `waveform` check failed during processing and its reservation was fully refunded. This result does not establish availability of the other SPEKTR operations.

background_remove uses X-API-Key and Recraft {model:"recraft/remove-background",input:{image:URL}}. Provider envelope: code/data.taskId; status is data.state; results are JSON.parse(data.resultJson).resultUrls[]. This is passthrough without confirmed FrankLab customer settlement. Other operations use Bearer and jobs. waveform maps Make audioUrl → videoUrl; video_round → operation=round; video_remove_bg → operation=remove_bg. Bria image replacement requires exactly one of prompt/refImages; erase_by_text needs objectName; lifestyle needs sceneDescription. Bria video erase over 5 seconds requires autoTrim=true; the backend verifies duration. Make task_id resume may choose Recraft polling for jobs; REST clients must retain the polling route with the ID.

### Operations and minimal JSON requests

Each example below is the complete JSON for its POST; replace URLs/IDs with your own. Operation/mode selectors choose functions, not generation models. “source” means source-checked without live/E2E; “blocked” marks a known limitation.

| Operation | HTTP and path | Minimal JSON / status |
| --- | --- | --- |
| `background_remove` | `POST /franklab/api/v1/recraft/create-task` | `{"model":"recraft/remove-background","input":{"image":"https://example.com/synthetic.png"}}` **blocked** |
| `bria_image_remove_bg` | `POST /franklab/api/franklab/jobs/image` | `{"operation":"bria_image_remove_bg","imageUrl":"https://example.com/synthetic.png"}` source |
| `bria_image_replace_bg` | `POST /franklab/api/franklab/jobs/image` | `{"operation":"bria_image_replace_bg","imageUrl":"https://example.com/synthetic.png","prompt":"Plain studio background"}` source |
| `bria_erase_foreground` | `POST /franklab/api/franklab/jobs/image` | `{"operation":"bria_erase_foreground","imageUrl":"https://example.com/synthetic.png"}` source |
| `bria_erase_by_text` | `POST /franklab/api/franklab/jobs/image` | `{"operation":"bria_erase_by_text","imageUrl":"https://example.com/synthetic.png","objectName":"lamp"}` source |
| `bria_product_lifestyle_by_text` | `POST /franklab/api/franklab/jobs/image` | `{"operation":"bria_product_lifestyle_by_text","imageUrl":"https://example.com/synthetic.png","sceneDescription":"Product on a plain table","placementType":"automatic_aspect_ratio","briaAspectRatio":"1:1"}` source |
| `bria_product_cutout` | `POST /franklab/api/franklab/jobs/image` | `{"operation":"bria_product_cutout","imageUrl":"https://example.com/synthetic.png"}` source |
| `waveform` | `POST /franklab/api/franklab/jobs/montage` | `{"operation":"waveform","videoUrl":"https://example.com/synthetic.wav","width":320,"height":240}` source |
| `video_round` | `POST /franklab/api/franklab/jobs/montage` | `{"operation":"round","videoUrl":"https://example.com/synthetic.mp4","shape":"rounded","radius":8,"backgroundColor":"#000000"}` source |
| `video_remove_bg` | `POST /franklab/api/franklab/jobs/montage` | `{"operation":"remove_bg","videoUrl":"https://example.com/synthetic.mp4","removeBgProvider":"bria","removeBgOutputCodec":"webm_vp9"}` source |
| `bria_video_replace_bg` | `POST /franklab/api/franklab/jobs/montage` | `{"operation":"bria_video_replace_bg","videoUrl":"https://example.com/synthetic.mp4","backgroundUrl":"https://example.com/synthetic.png","duration":1}` source |
| `bria_video_erase_object` | `POST /franklab/api/franklab/jobs/montage` | `{"operation":"bria_video_erase_object","videoUrl":"https://example.com/synthetic.mp4","maskUrl":"https://example.com/synthetic.mp4","duration":1}` source |
| `get_task` | `GET /franklab/api/franklab/jobs/{taskId}` | source |
| `upload_source` | `POST /franklab/api/franklab/jobs/upload` | source |
| `get_recraft_task` | `GET /franklab/api/v1/recraft/record-info` | **blocked** |
| `check_connection` | `GET /franklab/api/v1/images/omni-image` | source |


```bash
curl --fail-with-body "$FRANKLAB_ORIGIN/franklab/api/franklab/jobs/montage" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"operation":"waveform","videoUrl":"https://example.com/synthetic.wav","width":320,"height":240}'
```

### REST fields

Fields apply to the selected operation; required conditions and the minimal example define usage. `[]` denotes array items.

| Field | Type | Conditions and allowed values |
| --- | --- | --- |
| `model` | string | required (background_remove); recraft/remove-background |
| `input` | object | required (background_remove); Input object |
| `input.image` | string | required (background_remove); Image URL; Make documents png/jpg/webp, <=5 MB, <=16 MP, 256–4096 px |
| `callBackUrl` | string | Optional provider callback URL |
| `callbackUrl` | string | URL |
| `imageUrl` | string | required (bria_image_remove_bg); URL; required (bria_image_replace_bg); required (bria_erase_foreground); required (bria_erase_by_text); required (bria_product_lifestyle_by_text); required (bria_product_cutout) |
| `preserveAlpha` | boolean | preserve Alpha |
| `operation` | string | required (bria_image_remove_bg); required (bria_image_replace_bg); required (bria_erase_foreground); required (bria_erase_by_text); required (bria_product_lifestyle_by_text); required (bria_product_cutout); required (waveform); required (video_round); required (video_remove_bg); required (bria_video_replace_bg); required (bria_video_erase_object) |
| `prompt` | string | prompt |
| `refImages` | array | ref Images |
| `briaMode` | string | high_control / base / fast; bria Mode |
| `negativePrompt` | string | negative Prompt |
| `refinePrompt` | boolean | refine Prompt |
| `originalQuality` | boolean | original Quality |
| `forceBackgroundDetection` | boolean | force Background Detection |
| `seed` | number | seed |
| `objectName` | string | required (bria_erase_by_text); object Name |
| `sceneDescription` | string | required (bria_product_lifestyle_by_text); scene Description |
| `optimizeDescription` | boolean | optimize Description |
| `placementType` | string | automatic_aspect_ratio / original / manual_placement / manual_padding / custom_coordinates; placement Type |
| `briaAspectRatio` | string | 1:1 / 4:5 / 9:16 / 16:9 / 3:2 / 2:3; bria Aspect Ratio |
| `forceRmbg` | boolean | force Rmbg |
| `sku` | string | sku |
| `videoUrl` | string | required (waveform); URL; required (video_round); required (video_remove_bg); required (bria_video_replace_bg); required (bria_video_erase_object) |
| `width` | number | width |
| `height` | number | height |
| `waveformColor` | string | waveform Color |
| `waveformBgColor` | string | waveform Bg Color |
| `shape` | string | rounded / circle; shape |
| `radius` | number | radius |
| `backgroundColor` | string | background Color |
| `removeBgProvider` | string | bria / auto / replicate; remove Bg Provider |
| `removeBgBackgroundColor` | string | Transparent / Black / White / Gray / Red / Green / Blue / Yellow / Cyan / Magenta / Orange; remove Bg Background Color |
| `removeBgOutputCodec` | string | webm_vp9 / mov_h265 / mov_proresks / mkv_vp9 / gif / mp4_h264 / mp4_h265 / mkv_h264 / mkv_h265; remove Bg Output Codec |
| `removeBgPreserveAudio` | boolean | remove Bg Preserve Audio |
| `backgroundUrl` | string | required (bria_video_replace_bg); URL |
| `duration` | number | duration |
| `briaOutputCodec` | string | mp4_h264 / mp4_h265 / webm_vp9 / mov_h265 / mov_proresks / mkv_h264 / mkv_h265 / mkv_vp9 / gif; bria Output Codec |
| `briaPreserveAudio` | boolean | bria Preserve Audio |
| `maskUrl` | string | required (bria_video_erase_object); URL |
| `autoTrim` | boolean | auto Trim |
| `taskId` | string | required (get_task); Path parameter: returned taskId, scoped to the same partner; required (get_recraft_task); Query parameter returned by recraft/create-task |
| `file` | binary | required (upload_source); multipart/form-data file; maximum 157286400 bytes |
| `pageNum` | number | Query pagination; connection check uses 1 |
| `pageSize` | number | Query pagination; connection check uses 1 |

### Make options and REST conversion

This is the Make selection reference; form names can differ from REST. Convert v1*/v2*, text* and sample* fields as described above. Nested conditions describe the Make form.

| Form field | When | Values |
| --- | --- | --- |
| `operation` |  | background_remove / bria_image_remove_bg / bria_image_replace_bg / bria_erase_foreground / bria_erase_by_text / bria_product_lifestyle_by_text / bria_product_cutout / waveform / video_round / video_remove_bg / bria_video_replace_bg / bria_video_erase_object |
| `briaMode` | operation=bria_image_replace_bg | high_control / base / fast |
| `briaMode` | operation=bria_product_lifestyle_by_text | high_control / base / fast |
| `placementType` | operation=bria_product_lifestyle_by_text | automatic_aspect_ratio / original / manual_placement / manual_padding / custom_coordinates |
| `briaAspectRatio` | operation=bria_product_lifestyle_by_text | 1:1 / 4:5 / 9:16 / 16:9 / 3:2 / 2:3 |
| `shape` | operation=video_round | rounded / circle |
| `removeBgProvider` | operation=video_remove_bg | bria / auto / replicate |
| `removeBgBackgroundColor` | operation=video_remove_bg | Transparent / Black / White / Gray / Red / Green / Blue / Yellow / Cyan / Magenta / Orange |
| `removeBgOutputCodec` | operation=video_remove_bg | webm_vp9 / mov_h265 / mov_proresks / mkv_vp9 / gif / mp4_h264 / mp4_h265 / mkv_h264 / mkv_h265 |
| `briaOutputCodec` | operation=bria_video_replace_bg | mp4_h264 / mp4_h265 / webm_vp9 / mov_h265 / mov_proresks / mkv_h264 / mkv_h265 / mkv_vp9 / gif |
| `briaOutputCodec` | operation=bria_video_erase_object | mp4_h264 / mp4_h265 / webm_vp9 / mov_h265 / mov_proresks / mkv_h264 / mkv_h265 / mkv_vp9 / gif |

### Response and verification limits

HTTP response with provider JSON {code:200,data:{taskId}}; inspect code and msg separately from HTTP status.


Recraft completes on `data.state=success|fail`. The Make repeat condition checks other fields and can continue polling after completion; direct REST clients must check `state`.

## SUFLER

videoUrl is required. Automatic transcription: omit subtitles; transcriptionEngine selects whisper/xai_grok_transcribe/gemini/local_whisper/elevenlabs_scribe. Manual captions use subtitles[] with text,startTime,endTime; 0 ≤ startTime < endTime. Optional words[] uses word,start,end, non-overlapping and inside its cue. Maximum 500 cues. Make v1*/v2* are form names; REST uses templateId,fontSize,color,positionX etc. v2 manual overrides require presetOverrideMode=manual. Translation uses translateTo and optional dualLanguage. outputMode: burn/srt/vtt/ass/burn+srt/burn+vtt. v1 uses highlightMode; v2 uses renderMode and emphasisMode.

### Operations and minimal JSON requests

Each example below is the complete JSON for its POST; replace URLs/IDs with your own. Operation/mode selectors choose functions, not generation models. “source” means source-checked without live/E2E; “blocked” marks a known limitation.

| Operation | HTTP and path | Minimal JSON / status |
| --- | --- | --- |
| `v1` | `POST /franklab/api/franklab/jobs/subtitles` | `{"videoUrl":"https://example.com/synthetic.mp4","captionEngine":"v1","subtitles":[{"text":"Synthetic test","startTime":0,"endTime":1}],"outputMode":"burn"}` source |
| `v2` | `POST /franklab/api/franklab/jobs/subtitles` | `{"videoUrl":"https://example.com/synthetic.mp4","captionEngine":"v2","subtitles":[{"text":"Synthetic test","startTime":0,"endTime":1}],"outputMode":"burn","templateId":"shorts_pro"}` source |
| `lookup_fonts` | `GET /franklab/api/franklab/integrations/text-sticker/fonts` | source |
| `lookup_subtitle-templates` | `GET /franklab/api/franklab/integrations/text-sticker/subtitle-templates` | source |
| `lookup_video-effects` | `GET /franklab/api/franklab/integrations/text-sticker/video-effects` | source |
| `lookup_safe-zone-platform-options` | `GET /franklab/api/franklab/integrations/text-sticker/safe-zone-platform-options` | source |
| `lookup_safe-zone-placement-options` | `GET /franklab/api/franklab/integrations/text-sticker/safe-zone-placement-options` | source |
| `get_task` | `GET /franklab/api/franklab/jobs/{taskId}` | source |
| `upload_source` | `POST /franklab/api/franklab/jobs/upload` | source |
| `check_connection` | `GET /franklab/api/franklab/integrations/text-sticker/auth/stats` | source |


```bash
curl --fail-with-body "$FRANKLAB_ORIGIN/franklab/api/franklab/jobs/subtitles" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"videoUrl":"https://example.com/synthetic.mp4","captionEngine":"v1","subtitles":[{"text":"Synthetic test","startTime":0,"endTime":1}],"outputMode":"burn"}'
```

### REST fields

Fields apply to the selected operation; required conditions and the minimal example define usage. `[]` denotes array items.

| Field | Type | Conditions and allowed values |
| --- | --- | --- |
| `videoUrl` | string | required (v1); URL; required (v2) |
| `language` | string | auto / ru / en; language |
| `transcriptionEngine` | string | subtitleSourceMode=auto; whisper / xai_grok_transcribe / elevenlabs_scribe / local_whisper; transcription Engine |
| `diarize` | boolean | subtitleSourceMode=auto; transcriptionEngine=xai_grok_transcribe OR subtitleSourceMode=auto; transcriptionEngine=elevenlabs_scribe; diarize |
| `transcriptionFormat` | boolean | subtitleSourceMode=auto; transcriptionEngine=xai_grok_transcribe; transcription Format |
| `fillerWords` | boolean | subtitleSourceMode=auto; transcriptionEngine=xai_grok_transcribe; filler Words |
| `keyterm` | array | subtitleSourceMode=auto; transcriptionEngine=xai_grok_transcribe OR subtitleSourceMode=auto; transcriptionEngine=elevenlabs_scribe OR subtitleSourceMode=auto; transcriptionEngine=local_whisper; max items 100; max length 50 |
| `keyterm[]` | string | required when subtitleSourceMode=auto; transcriptionEngine=xai_grok_transcribe; keyterm[] |
| `subtitles` | array | required when subtitleSourceMode=manual; max items 500 |
| `subtitles[].text` | string | required when subtitleSourceMode=manual; subtitles[].text |
| `subtitles[].startTime` | number | required when subtitleSourceMode=manual; subtitles[].start Time |
| `subtitles[].endTime` | number | required when subtitleSourceMode=manual; subtitles[].end Time |
| `subtitles[].words` | array | subtitleSourceMode=manual; subtitles[].words |
| `subtitles[].words[].word` | string | required when subtitleSourceMode=manual; subtitles[].words[].word |
| `subtitles[].words[].start` | number | required when subtitleSourceMode=manual; subtitles[].words[].start |
| `subtitles[].words[].end` | number | required when subtitleSourceMode=manual; subtitles[].words[].end |
| `translateTo` | string | translationMode=translate; en / ru / de / fr / es / it / pt / zh / ja / ko / ar; translate To |
| `dualLanguage` | boolean | translationMode=translate; dual Language |
| `videoEffects` | array | effectsMode=custom; max items 20 |
| `videoEffects[].effectId` | string | required when effectsMode=custom; rpc://getVideoEffects; video Effects[].effect Id |
| `videoEffects[].scope` | string | effectsMode=custom; clip / range; video Effects[].scope |
| `videoEffects[].startTime` | number | effectsMode=custom; video Effects[].start Time |
| `videoEffects[].endTime` | number | effectsMode=custom; video Effects[].end Time |
| `videoEffects[].intensity` | number | effectsMode=custom; video Effects[].intensity |
| `outputMode` | string | burn / srt / vtt / ass / burn+srt / burn+vtt; output Mode |
| `c2paSigningMode` | string | off / franklab / user_profile; c2pa Signing Mode |
| `contentOrigin` | string | franklab or user_profile; restricted origins require permitting user_profile and evidence; not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured; content Origin |
| `humanAuthorName` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; human Author Name |
| `humanAuthorUrl` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; human Author Url |
| `reviewedBy` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; reviewed By |
| `reviewedAt` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; reviewed At |
| `reviewMethod` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; review Method |
| `sourceMaterialUrls` | array | c2paSigningMode=franklab OR c2paSigningMode=user_profile; max items 10 |
| `originalEvidenceUrls` | array | c2paSigningMode=franklab OR c2paSigningMode=user_profile; max items 10 |
| `verifiedIncomingC2paIngredient` | boolean | c2paSigningMode=franklab OR c2paSigningMode=user_profile; verified Incoming C2pa Ingredient |
| `c2paActionDescription` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; c2pa Action Description |
| `c2paDisclosure` | string | c2paSigningMode=franklab OR c2paSigningMode=user_profile; c2pa Disclosure |
| `c2paSignerProfileId` | string | required when c2paSigningMode=user_profile; rpc://getC2paSignerProfiles; c2pa Signer Profile Id |
| `callbackUrl` | string | URL |
| `templateId` | string | clean-classic / clean-bold / podcast-lower-third / interview-soft-shadow / reels-punch / tiktok-bold-center / tiktok-keyword-highlight / viral-word-pop / clean-product-demo / boxed-active-word / karaoke-lite / karaoke-pop / gaming-outline / gaming-neon / education-marker / education-clean-center / minimal-modern / boxed-bold / emoji-accent / meme-caption / serif-cinematic / classic-subtitles / creator-hook / news-ticker / documentary-narration / sports-highlight / luxury-minimal / horror-crawl / children-playful / corporate-clean / vlog-casual / music-lyric / creative-handwritten / travel-explorer / tech-review / motivational-impact / cooking-recipe / fitness-energy / wedding-elegant / retro-display / academic-formal / brand-showcase / slavic-decorative; template Id; shorts_pro / creator_hook_v2 / product_demo_v2 / cta_product_v2 / sufler_bold_emoji_stack_v2 / sufler_ref_dan_v2 / sufler_ref_viktor_v2 / sufler_neon_outline_emoji_v2 / sufler_orange_active_strip_v2 / sufler_minimal_white_pill_v2 / sufler_black_shadow_keyword_v2 / sufler_neon_banner_v2 / sufler_clean_yellow_stack_v2 / sufler_compact_yellow_italic_v2 / sufler_orange_keyword_stack_v2 / frank_bold_orange_box_v2 / frank_green_caption_box_v2 / frank_bold_yellow_icon_v2 / frank_creator_yellow_stack_v2 / frank_red_green_active_v2 / frank_red_white_active_v2 / frank_yellow_keyword_v2 / frank_yellow_italic_v2 / frank_soft_pill_v2 |
| `highlightMode` | string |  / none / keywords / karaoke / emoji; highlight Mode |
| `platform` | string | v1PlacementMode=exact_preset; rpc://getSafeZonePlatforms; platform; v2TemplateId=shorts_pro; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset; Query parameter; use platform from safe-zone platform lookup |
| `safeZonePreset` | string | v1PlacementMode=exact_preset; rpc://getSafeZonePlacements; safe Zone Preset; v2TemplateId=shorts_pro; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset |
| `positionX` | number | v1PlacementMode=exact_coordinates; min 0; max 100; v2TemplateId=shorts_pro; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates |
| `positionY` | number | v1PlacementMode=exact_coordinates; min 0; max 100; v2TemplateId=shorts_pro; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; v2PlacementMode=exact_coordinates |
| `fontSize` | number | v1TextStyleMode=custom; min 1; max 512; v2TemplateId=shorts_pro; v2PresetControlMode=manual OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual |
| `font` | string | v1TextStyleMode=custom; rpc://getFonts; max length 64; v2TemplateId=shorts_pro; v2PresetControlMode=manual OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual |
| `color` | string | v1TextStyleMode=custom; color; v2TemplateId=shorts_pro; v2PresetControlMode=manual OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual |
| `uppercase` | boolean | v1TextStyleMode=custom; uppercase |
| `displayWords` | number | v1TextStyleMode=custom; min 1; max 6 |
| `maxLines` | number | v1TextStyleMode=custom; min 1; max 2; v2TemplateId=shorts_pro; v2PresetControlMode=manual OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual |
| `maxCharsPerLine` | number | v1TextStyleMode=custom; min 8; max 42; v2TemplateId=shorts_pro; v2PresetControlMode=manual OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual |
| `gapSplitSec` | number | v1TextStyleMode=custom; min 0.15; max 2 |
| `lingerMs` | number | v1TextStyleMode=custom; min 0; max 500 |
| `captionEngine` | string |  |
| `presetOverrideMode` | string | v2TemplateId=shorts_pro OR v2TemplateId=creator_hook_v2 OR v2TemplateId=product_demo_v2 OR v2TemplateId=cta_product_v2 OR v2TemplateId=sufler_bold_emoji_stack_v2 OR v2TemplateId=sufler_ref_dan_v2 OR v2TemplateId=sufler_ref_viktor_v2 OR v2TemplateId=sufler_neon_outline_emoji_v2 OR v2TemplateId=sufler_orange_active_strip_v2 OR v2TemplateId=sufler_minimal_white_pill_v2 OR v2TemplateId=sufler_black_shadow_keyword_v2 OR v2TemplateId=sufler_neon_banner_v2 OR v2TemplateId=sufler_clean_yellow_stack_v2 OR v2TemplateId=sufler_compact_yellow_italic_v2 OR v2TemplateId=sufler_orange_keyword_stack_v2 OR v2TemplateId=frank_bold_orange_box_v2 OR v2TemplateId=frank_green_caption_box_v2 OR v2TemplateId=frank_bold_yellow_icon_v2 OR v2TemplateId=frank_creator_yellow_stack_v2 OR v2TemplateId=frank_red_green_active_v2 OR v2TemplateId=frank_red_white_active_v2 OR v2TemplateId=frank_yellow_keyword_v2 OR v2TemplateId=frank_yellow_italic_v2 OR v2TemplateId=frank_soft_pill_v2; preset / manual; preset Override Mode |
| `outline` | number | v2TemplateId=shorts_pro; v2PresetControlMode=manual OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; min 0; max 8 |
| `outlineColor` | string | v2TemplateId=shorts_pro; v2PresetControlMode=manual OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; outline Color |
| `shadow` | number | v2TemplateId=shorts_pro; v2PresetControlMode=manual OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; min 0; max 8 |
| `renderMode` | string | v2TemplateId=shorts_pro; v2PresetControlMode=manual OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual;  / static / phrase_pop / word_pop / active_word / word_reveal / active_box; render Mode |
| `animationIntensity` | string | v2TemplateId=shorts_pro; v2PresetControlMode=manual OR v2TemplateId=creator_hook_v2; v2PresetControlMode=manual OR v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; low / medium / high; animation Intensity |
| `highlightColor` | string | v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; highlight Color |
| `revealBaseline` | string | v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual;  / none / dim / full; reveal Baseline |
| `animationStyle` | string | v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; max length 40 |
| `emojiAccentMode` | string | v2TemplateId=product_demo_v2; v2PresetControlMode=manual OR v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_bold_emoji_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_dan_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_outline_emoji_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_black_shadow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_clean_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_compact_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_keyword_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_yellow_icon_v2; v2PresetControlMode=manual OR v2TemplateId=frank_creator_yellow_stack_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_keyword_v2; v2PresetControlMode=manual OR v2TemplateId=frank_yellow_italic_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; max length 40 |
| `activeColor` | string | v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; active Color |
| `activeBoxColor` | string | v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; active Box Color |
| `activeBoxPadding` | number | v2TemplateId=cta_product_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_ref_viktor_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_orange_active_strip_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_minimal_white_pill_v2; v2PresetControlMode=manual OR v2TemplateId=sufler_neon_banner_v2; v2PresetControlMode=manual OR v2TemplateId=frank_bold_orange_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_green_caption_box_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_green_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_red_white_active_v2; v2PresetControlMode=manual OR v2TemplateId=frank_soft_pill_v2; v2PresetControlMode=manual; min 4; max 48 |
| `qualityMode` | string | standard / pro; quality Mode |
| `emphasisMode` | string | semantic / manual / karaoke / none; emphasis Mode |
| `emphasisWords` | array | v2EmphasisMode=manual; max items 50; max length 40 |
| `emphasisWords[]` | string | required when v2EmphasisMode=manual; emphasis Words[] |
| `diagnosticsLevel` | string | basic / full; diagnostics Level |
| `visualQaMode` | string | off / contact_sheet; visual Qa Mode |
| `glossary` | array | max items 50 |
| `glossary[].from` | string | required (v2); glossary[].from |
| `glossary[].to` | string | required (v2); glossary[].to |
| `brandGlossary` | array | max items 50 |
| `brandGlossary[].from` | string | required (v2); brand Glossary[].from |
| `brandGlossary[].to` | string | required (v2); brand Glossary[].to |
| `taskId` | string | required (get_task); Path parameter: returned taskId, scoped to the same partner |
| `file` | binary | required (upload_source); multipart/form-data file; maximum 157286400 bytes |

### Make options and REST conversion

This is the Make selection reference; form names can differ from REST. Convert v1*/v2*, text* and sample* fields as described above. Nested conditions describe the Make form.

| Form field | When | Values |
| --- | --- | --- |
| `language` |  | auto / ru / en |
| `captionEngine` |  | v1 / v2 |
| `v1TemplateId` | captionEngine=v1 | clean-classic / clean-bold / podcast-lower-third / interview-soft-shadow / reels-punch / tiktok-bold-center / tiktok-keyword-highlight / viral-word-pop / clean-product-demo / boxed-active-word / karaoke-lite / karaoke-pop / gaming-outline / gaming-neon / education-marker / education-clean-center / minimal-modern / boxed-bold / emoji-accent / meme-caption / serif-cinematic / classic-subtitles / creator-hook / news-ticker / documentary-narration / sports-highlight / luxury-minimal / horror-crawl / children-playful / corporate-clean / vlog-casual / music-lyric / creative-handwritten / travel-explorer / tech-review / motivational-impact / cooking-recipe / fitness-energy / wedding-elegant / retro-display / academic-formal / brand-showcase / slavic-decorative |
| `v1HighlightMode` | captionEngine=v1 |  / none / keywords / karaoke / emoji |
| `v1PlacementMode` | captionEngine=v1 | tiktok_bottom_safe / bottom_center / center / top / exact_preset / exact_coordinates |
| `v1Platform` | captionEngine=v1; v1PlacementMode=exact_preset | rpc://getSafeZonePlatforms |
| `v1SafeZonePreset` | captionEngine=v1; v1PlacementMode=exact_preset | rpc://getSafeZonePlacements |
| `v1TextStyleMode` | captionEngine=v1 | template / custom |
| `v1Font` | captionEngine=v1; v1TextStyleMode=custom | rpc://getFonts |
| `v2TemplateId` | captionEngine=v2 | shorts_pro / creator_hook_v2 / product_demo_v2 / cta_product_v2 / sufler_bold_emoji_stack_v2 / sufler_ref_dan_v2 / sufler_ref_viktor_v2 / sufler_neon_outline_emoji_v2 / sufler_orange_active_strip_v2 / sufler_minimal_white_pill_v2 / sufler_black_shadow_keyword_v2 / sufler_neon_banner_v2 / sufler_clean_yellow_stack_v2 / sufler_compact_yellow_italic_v2 / sufler_orange_keyword_stack_v2 / frank_bold_orange_box_v2 / frank_green_caption_box_v2 / frank_bold_yellow_icon_v2 / frank_creator_yellow_stack_v2 / frank_red_green_active_v2 / frank_red_white_active_v2 / frank_yellow_keyword_v2 / frank_yellow_italic_v2 / frank_soft_pill_v2 |
| `v2QualityMode` | captionEngine=v2 | standard / pro |
| `v2EmphasisMode` | captionEngine=v2 | semantic / manual / karaoke / none |
| `v2DiagnosticsLevel` | captionEngine=v2 | basic / full |
| `v2VisualQaMode` | captionEngine=v2 | off / contact_sheet |
| `subtitleSourceMode` |  | auto / manual |
| `transcriptionEngine` | subtitleSourceMode=auto | whisper / xai_grok_transcribe / elevenlabs_scribe / local_whisper |
| `translationMode` |  | none / translate |
| `translateTo` | translationMode=translate | en / ru / de / fr / es / it / pt / zh / ja / ko / ar |
| `effectsMode` |  | none / custom |
| `videoEffects[].effectId` | effectsMode=custom | rpc://getVideoEffects |
| `videoEffects[].scope` | effectsMode=custom | clip / range |
| `outputMode` |  | burn / srt / vtt / ass / burn+srt / burn+vtt |
| `c2paSigningMode` |  | off / franklab / user_profile |
| `contentOrigin` | c2paSigningMode=franklab | not_declared / human_edited / ai_assisted / ai_generated |
| `c2paSignerProfileId` | c2paSigningMode=user_profile | rpc://getC2paSignerProfiles |
| `contentOrigin` | c2paSigningMode=user_profile | not_declared / human_edited / ai_assisted / ai_generated / human_created / camera_captured |

Shared v2 preset settings are listed once below. “All 24” means every `v2TemplateId` value in the table above; each row’s additional conditions also apply. `v2RevealBaseline` applies to 22 presets: all listed values except `shorts_pro` and `creator_hook_v2`.

| Form field | v2TemplateId presets | When | Values |
| --- | --- | --- | --- |
| `v2PresetControlMode` | All 24 | captionEngine=v2 | preset / manual |
| `v2Font` | All 24 | captionEngine=v2; v2PresetControlMode=manual | rpc://getFonts |
| `v2PlacementMode` | All 24 | captionEngine=v2; v2PresetControlMode=manual | / tiktok_bottom_safe / exact_preset / exact_coordinates |
| `v2Platform` | All 24 | captionEngine=v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset | rpc://getSafeZonePlatforms |
| `v2SafeZonePreset` | All 24 | captionEngine=v2; v2PresetControlMode=manual; v2PlacementMode=exact_preset | rpc://getSafeZonePlacements |
| `v2RenderMode` | All 24 | captionEngine=v2; v2PresetControlMode=manual | / static / phrase_pop / word_pop / active_word / word_reveal / active_box |
| `v2AnimationIntensity` | All 24 | captionEngine=v2; v2PresetControlMode=manual | low / medium / high |
| `v2RevealBaseline` | All except `shorts_pro`, `creator_hook_v2` | captionEngine=v2; v2PresetControlMode=manual | / none / dim / full |

### Response and verification limits

HTTP 200 {success:true,data:{taskId,status,final_cost_franks,cost_currency,cost_status,cost_unit}}; poll the returned taskId.

Results: downloadUrl/subtitleFileUrl, subtitleCount, transcribedText; v2 also reports qualityScore, qualityGateStatus, renderMode, animatedWordCount, highlightedWords, visualQaStatus/visualQaUrl and subtitleDiagnostics. Inspect captionWarnings, fontRenderWarning, requestedFont/resolvedAssFont, appliedVideoFilters and ignoredVideoEffects. Make cue normalization removes arbitrary fields; cueStyleOverrideMode=cue retains x/y/fontSize/font/color. For direct REST send DTO fields only.


REST `position`: top-left/top-center/top-right/center/bottom-left/bottom-center/bottom-right. v2 custom visual settings require `presetOverrideMode=manual`. Conditions using subtitleSourceMode/translationMode/effectsMode/v1*/v2* in the reference describe the Make form, not REST fields.

## Next step

Choose one operation, upload a small owned file, verify access and your customer tariff, then submit once and retain the taskId with its polling route. Blocked functions need a separate contract verification or fix first.
