clips_from_job
Cut one or more clips from any prior video job (find_clips, summarize, or video transcribe). Operates on a parent job — possessing the parent source_job_id is the capability, no upload step. Contrast with clips_from_video, which takes a local filename and uploads a video that has never been in Weftly before; use this tool whenever a video job already exists. Two choices are required on every new job, with no default — if the customer's intent is genuinely ambiguous, ask rather than guess: orientation (horizontal keeps the source framing; vertical crops to 9:16 for TikTok/Reels/Shorts) and output (files delivers one file per clip; reel concatenates every clip into a single file). Two-call flow: (1) call with source_job_id + clips (1+ objects {start, end, title?} in source seconds) + orientation + output to receive {job_id, payment_challenge}; (2) pay via MPP and call again with job_id + payment_credential to start processing. Price: output: "reel" bills a flat $0.50 regardless of segment count; output: "files" bills N × $0.50 for N clips, charged once for the whole batch (Stripe quantity). See /.well-known/mpp.json for the Tempo USDC rate. output: "files" caps a batch at 5 clips; output: "reel" concatenates every clip into one file, capped at 30 minutes of total output for orientation: "horizontal" or, for orientation: "vertical", the selected profile's cap: 240s for tiktok-primary and tiktok-primary-720p, 180s for instagram-reels, 60s for instagram-stories. The 240s ceiling is an encode limit (crop+scale cost per segment against the container's own timeout), not a platform rule; the shorter profile caps are the destination's own limit. orientation: "vertical" accepts profile (default tiktok-primary; also tiktok-primary-720p, instagram-reels, instagram-stories) and subject (center/auto/follow, default follow — switches crop between active speakers across clip and segment boundaries, the mode that makes multi-speaker interview clips usable; manual/subject_id need per-clip data this tool cannot supply — use the REST API's extract_vertical_clip job type directly for those); both are rejected for orientation: "horizontal", which keeps the source framing and has no crop to aim. include_transcript (default true) applies only to output: "reel" — mirrors extract_clip's clipped SRT + word-level transcript outputs — and is rejected for output: "files". Outputs: output: "files" writes roles clip-1-video through clip-N-video plus a clips-manifest (JSON) recording each clip's timing, output role, and any per-clip failure — a batch delivering fewer than N clips is not refunded, only one delivering zero is; output: "reel" writes role clip-video (frame-accurate boundaries, 15ms audio fades at segment joins) plus, when include_transcript is true, roles clip-srt + clip-words. Every output is audio loudness-normalized to -14 LUFS / -1.5 dBTP; vertical output is additionally cropped to the selected profile's dimensions (1080×1920 by default) and burned with word-level captions by default (center-third placement, uppercase, one short line per card) — pass captions: false to render vertical output without them; horizontal output never gets captions. Payment: pay by credit card via the Stripe Checkout link (open the returned payment_url in any browser) or Tempo USDC via mppx; the challenge's WWW-Authenticate header and /.well-known/mpp.json are authoritative for which methods are offered. Source must still be in storage (72h TTL for find_clips parents, 24h elsewhere — check expires_at from get_job_status on the parent). Multiple clips_from_job calls against one parent are independent paid jobs. Retrying with job_id alone recovers the current state. Failed jobs auto-refund.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| clips | No | ||
| job_id | No | ||
| output | No | ||
| profile | No | ||
| subject | No | ||
| captions | No | ||
| orientation | No | ||
| source_job_id | No | ||
| include_transcript | No | ||
| payment_credential | No |