# Analytics Model Source: https://docs.overlap.ai/api-reference/analytics-model Field reference for the Post and Analytics objects returned by the analytics endpoints Reference for the objects returned by [`GET /posts`](/api-reference/posts) and [`GET /post-analytics`](/api-reference/post-analytics). Fields are included when available — a response may omit values that have not been generated yet (for example, `engagementScore` before the first analytics refresh). ## Post object | Field | Type | Description | | --------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `id` | string | The post id. Use as `postId` for `GET /post-analytics`. | | `platform` | string | Platform the post was published to (`youtube`, `tiktok`, `instagram`, `twitter`, `linkedin`, `facebook`, `threads`, `snapchat`, `bluesky`). | | `text` | string | The caption/description that was published. | | `postUrl` | string \| null | Public URL of the live post on the platform. | | `nativeId` | string \| null | The platform's own id for the post (e.g. the YouTube video id). | | `clipId` | string \| null | The Overlap clip the post was created from. Use with `GET /clip`. | | `status` | string | Publish status (`success`, `error`, ...). | | `mediaUrl` | string \| null | The rendered video/image that was published. | | `thumbnailUrl` | string \| null | Thumbnail used for the post. | | `createdAt` | string (ISO-8601) | When the post was published. | | `analytics` | object | Current rolled-up counters — see below. In `GET /posts` responses this object sits on each post; in `GET /post-analytics` it is returned as the top-level `analytics` object instead. | | `engagementScore` | number | See [Engagement score](#engagement-score). | | `growthRate` | number | Percentage growth of the engagement score between the two most recent refreshes. | | `lastAnalyticsUpdate` | string (ISO-8601) | When the rollup was last refreshed from the platform. | ## Analytics rollup object | Field | Type | Description | | --------------------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `views` | number | Current view count. Impressions are used on platforms without a native view metric. Always `0` on Bluesky (no per-post views). | | `likes` | number | Current likes/favorites. | | `comments` | number | Current comments/replies. | | `shares` | number | Current shares/reposts/retweets. | | `engagementScore` | number | See [Engagement score](#engagement-score). | | `growthRate` | number | Engagement score growth (%) between the last two refreshes. | | `lastAnalyticsUpdate` | string (ISO-8601) | Last refresh time. | | `platformMetrics` | object | The platform's own advanced metrics from the most recent refresh, keyed by platform (e.g. `{"youtube": {"analytics": {"averageViewDuration": 21, ...}}}`). Includes whatever the platform reports — watch time, retention, impressions, subscriber deltas. Shapes mirror the platforms' APIs and may change without notice. Only on `GET /post-analytics`. | ## Engagement score A single number Overlap computes to compare posts across platforms: ``` engagementScore = (likes × 2) + (comments × 3) + (shares × 4) + max(5, views / 100) ``` Weighted toward high-intent actions (shares > comments > likes), with a views term so view-heavy posts still register. Use it for relative ranking; it has no absolute unit. Browse posts and rolled-up metrics. All current analytics for one post. # Clip Model Source: https://docs.overlap.ai/api-reference/clip-model Reference for Clip objects returned by workflow result and clip endpoints Clip objects are returned in the `clips` array when `GET /workflow-results/{triggerId}` finishes with `status: "Completed"` and in the `clip` field from `GET /clip`. Use `id` as `clipId` for update and render calls. Workflow result responses return the basic clip fields listed below. `GET /clip` returns the latest saved clip document and can include additional metadata, source URLs, subtitle configuration, and legacy aliases. Fields are included when available, so some values may be omitted on a given clip. Use `renderedUrl` as the preview video when present, then call `POST /render` when you need a finalized export. ## Basic Example ```json theme={null} { "id": "0e3b1690-3bad-42cc-810d-87fd433054b8", "title": "Startup Founder: You're Your Startup's Biggest Threat", "bio": "An experienced startup founder and investor explains a key startup risk.", "keywords": ["startup", "founder psychology", "self-awareness"], "people": ["Startup Founder"], "duration": 51.724999, "startTimestamp": 0.0, "endTimestamp": 51.724999, "timestampBoundary": { "start": 0.0, "end": 30.0 }, "aspectRatio": "16:9", "renderedUrl": "https://cdn.overlap.ai/fe249157-6be2-4fce-9aec-961f800604f1.mp4", "thumbnailURL": "https://cdn.overlap.ai/thumbnails/ce99b3c5-4d5d-4cc4-ae69-b835d23fe77a_thumb.jpg", "viralityScore": 89.5 } ``` ## Basic Properties These fields may appear in clips returned from workflow result endpoints and `GET /clip`. | Property | Type | Description | | ------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `id` | string | Unique identifier for the clip. Use this as `clipId` for `/update-clip` and `/render`. | | `title` | string | Clip title. | | `bio` | string | Short contextual description for the clip. | | `keywords` | string\[] | Keywords or tags associated with the clip. | | `people` | string\[] | People or speakers featured in the clip. | | `duration` | number | Total duration of the clip in seconds. | | `startTimestamp` | number | Timestamp, in seconds, where the clip starts in the source video. For livestream episodes the "source video" is the processing chunk, so this is chunk-relative — use `episodeOffsetSeconds` for the show-absolute position. | | `endTimestamp` | number | Timestamp, in seconds, where the clip ends in the source video. | | `segments` | Segment\[] | Keep-ranges when the clip has been trimmed, in clip-relative seconds: `{ "startSeconds": number, "endSeconds": number }` (0 = the clip's start). Absent or empty when untrimmed. Writable via update — see [Update clip](/api-reference/update-clip). | | `chunkIndex` | number | For livestream-episode clips: index of the processing chunk this clip came from. | | `episodeOffsetSeconds` | number | For livestream-episode clips (single-clip get only): absolute offset of the clip on the full episode timeline, reconstructed from the chunk index and chunk length. Approximate to within a few seconds. | | `timestampBoundary` | object | Object defining the clipping boundary. | | `timestampBoundary.start` | number | Start boundary, in seconds, for clip extraction. | | `timestampBoundary.end` | number | End boundary, in seconds, for clip extraction. | | `aspectRatio` | string | Clip aspect ratio, such as `"16:9"` or `"9:16"`. | | `renderedUrl` | string | Public preview video URL when available. May be omitted if the clip has not been rendered or does not have a preview URL yet. | | `rawUrl` | string | Raw clip URL when available. | | `thumbnailURL` | string | Thumbnail image URL. | | `transcriptUrl` | string | JSON transcript URL when available. | | `fps` | number | Frames per second when available. | | `videoHeight` | number | Video height in pixels when available. | | `videoResolution` | string | Video resolution when available, such as `"1920x1080"`. | | `viralityScore` | number | Score estimating predicted clip performance. | ## Additional `GET /clip` Properties These fields are returned only by `GET /clip` when they exist on the saved clip document. They are not part of the basic clip object returned by workflow result endpoints. ```json theme={null} { "companyId": "org_2yCncPJwBymLmSQlC9Vwk6rHG3e", "createdAt": "Tue, 09 Jun 2026 07:08:02 GMT", "sourceUrl": "https://storage.googleapis.com/overlap-source-videos/source.mp4", "subtitleConfig": { "fontSize": "28", "maxCharsPerLine": 20, "subtitleY": 50, "speakerStyles": { "0": { "fontColor": "#ffffff", "fontFamily": "TheBoldFont", "animationStyle": "spring-word" } } } } ``` | Property | Type | Description | | ---------------------- | --------- | ------------------------------------------------------------------------------------------- | | `url` | string | Public clip video URL when available. | | `publicURL` | string | Public clip video URL when available. Often the same asset as `url` or `extendedClipURL`. | | `extendedClipURL` | string | Public URL for the generated or extended clip media. | | `renderedThumbnailUrl` | string | Thumbnail image URL generated during rendering. | | `wordTranscriptJSON` | string | Word-level transcript JSON URL when available. Often the same asset as `transcriptUrl`. | | `companyId` | string | Company or organization id that owns the clip. | | `enterpriseId` | string | Enterprise organization id when the clip belongs to an enterprise account. | | `teamId` | string | Team identifier associated with the clip. | | `workflowId` | string | Workflow id that produced the clip when available. | | `runId` | string | Workflow run id or generation run id when available. | | `taskId` | string | Generation task id associated with the clip. | | `taskID` | string | Legacy uppercase alias for `taskId`. | | `sourceId` | string | Source media id associated with the clip. | | `sourceID` | string | Legacy uppercase alias for `sourceId`. | | `sourceInputId` | string | Source input id when the clip was produced from a workflow input. | | `clipHash` | string | Stable hash for the generated clip media or transcript source when available. | | `createdAt` | string | Creation timestamp for the saved clip document. | | `normalizedUrl` | string | Normalized or proxied source video URL when available. | | `originalUrl` | string | Original source media URL submitted to Overlap. | | `sourceUrl` | string | Source media URL associated with the clip. | | `speakers` | string\[] | Speaker names or identifiers when speaker data is available. | | `subtitleConfig` | object | Subtitle rendering configuration, including optional base style fields and `speakerStyles`. | | `subtitleId` | string | Identifier for the selected subtitle preset when available. | | `subtitleY` | number | Subtitle vertical position when stored separately from `subtitleConfig`. | Some clip responses include legacy aliases, such as `taskID` with `taskId` or `sourceID` with `sourceId`. Prefer the camelCase fields in new integrations. ## Related Endpoints Retrieve clips after a workflow completes Save editable fields before rendering Render a finalized export # Edit Transcript Source: https://docs.overlap.ai/api-reference/clip-transcript PATCH https://api.joinoverlap.com/clip-transcript Read a clip's word-level transcript and replace words or phrases (e.g. spelling and name fixes) Correct words in a clip's transcript — typically misspellings or names the speech-to-text got wrong (for example `Kaz Schwarz` → `Cozz`). Corrections flow into the clip's subtitles. Read the transcript first to find what you want to change, then send a patch. Transcript edits do not re-export the video. After patching, call [`POST /render`](/api-reference/render) to produce a clip with the corrected subtitles. The cached `renderedUrl` is cleared automatically on every patch. ### Authentication ```http theme={null} Authorization: Bearer YOUR_API_KEY Content-Type: application/json ``` *** ## Read the transcript ```http theme={null} GET https://api.joinoverlap.com/clip-transcript?companyId={companyId}&clipId={clipId} ``` Returns the word-level transcript. Use it to locate the words to fix and to read their `index` and timestamps for precise targeting. ### Query Parameters | Parameter | Required | Description | | ----------- | -------- | ------------------------------------------------------------ | | `companyId` | Yes | Your Overlap company or organization identifier. | | `clipId` | Yes | The clip id returned by `GET /workflow-results/{triggerId}`. | Also available at `GET /companies/{companyId}/clips/{clipId}/transcript`. ### Response ```json theme={null} { "clipId": "clip-id-from-results", "source": "wordTranscriptJSON", "wordCount": 312, "words": [ { "index": 86, "word": "Kaz", "start": 12.50, "end": 12.80, "speaker": 0, "isDeleted": false, "visible": true }, { "index": 87, "word": "Schwarz", "start": 12.80, "end": 13.20, "speaker": 0, "isDeleted": false, "visible": true }, { "index": 88, "word": "went", "start": 13.45, "end": 13.70, "speaker": 0, "isDeleted": false, "visible": true } ] } ``` | Field | Type | Description | | --------------- | ------- | ------------------------------------------------------------------------------ | | `index` | number | Stable position of the word in the transcript. Use it for `index` targeting. | | `word` | string | The word text (includes punctuation). | | `start` / `end` | number | Word timing in **source-video seconds**. Use these for time-range targeting. | | `speaker` | number | Diarized speaker index (0-based), when available. | | `isDeleted` | boolean | Whether the word has been removed from captions. | | `visible` | boolean | Whether the word falls inside the clip's currently visible region (see below). | *** ## Patch the transcript ```http theme={null} PATCH https://api.joinoverlap.com/clip-transcript ``` Send one or more **operations**. Each operation targets a span of words and replaces it with the `to` phrase. There are three ways to target a span — pick whichever is most convenient: | Target by | Fields | Use when | | -------------- | -------------------- | ------------------------------------------------------------------------------- | | **Text** | `from`, `to` | Fixing a known word/phrase everywhere it appears (best for spelling and names). | | **Time range** | `start`, `end`, `to` | You know the seconds of the span (from the `GET` response). | | **Index** | `index`, `to` | You want one specific word, by its `index` from the `GET` response. | ```json theme={null} { "companyId": "your-company-id", "clipId": "clip-id-from-results", "operations": [ { "from": "Kaz Schwarz", "to": "Cozz" }, { "start": 12.5, "end": 13.2, "to": "Cozz" }, { "index": 86, "to": "Cozz" } ] } ``` ### Operation fields | Field | Type | Notes | | --------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `to` | string | The replacement text. Required. (`replacement` is accepted as an alias.) | | `from` | string | Text to match. Whole-word, case-insensitive by default. Replaces **every** occurrence. May be multiple words (e.g. `"Kaz Schwarz"`). | | `matchCase` | boolean | Match `from` case-sensitively. Defaults to `false`. | | `start` / `end` | number | Source-video seconds. Selects words **overlapping** the range. Use the timestamps from the `GET` response. | | `index` | number | A single word's `index` from the `GET` response. | A span is collapsed into the replacement: the first word in the span becomes the new text spanning the original span's timing, and the rest of the span is removed from captions. Timing stays aligned to the audio, so the corrected text shows at the right moment. ### Response ```json theme={null} { "clipId": "clip-id-from-results", "status": "success", "applied": 3, "replaced": 4, "appliedToHiddenWords": 0, "warnings": [], "words": [ "...updated transcript..." ] } ``` | Field | Type | Description | | ---------------------- | --------- | -------------------------------------------------------------------------------------------------- | | `applied` | number | Operations processed. | | `replaced` | number | Spans actually replaced (an operation that matched nothing counts as applied with 0 replacements). | | `appliedToHiddenWords` | number | Replacements that landed on words outside the visible region (see below). | | `warnings` | string\[] | Non-fatal issues with individual operations. | | `words` | object\[] | The full updated transcript, in the same shape as the `GET` response. | *** ## Visible region vs extended region A clip is transcribed from the **full extended source**, so the transcript can include words in the padding that aren't shown in the current cut. The `visible` flag on each word tells you whether it currently renders: * Editing a **visible** word changes the subtitles as expected. * Editing a **hidden** word (outside the visible region) is saved, but it won't appear unless the clip is extended in the studio to include that word. These show up as `appliedToHiddenWords` in the patch response. For most spelling/name fixes you don't need to think about this — **text targeting (`from`/`to`) replaces every matching word regardless of region**, and the timestamps returned by `GET` already account for it. *** ## Errors | Code | Status | Meaning | | -------------------- | ------ | -------------------------------------------------------------- | | `INVALID_OPERATIONS` | 400 | `operations` is missing/empty, or every operation was invalid. | | `NO_TRANSCRIPT` | 409 | The clip has no transcript yet (it may still be generating). | | `CLIP_NOT_FOUND` | 404 | No clip for that `companyId` / `clipId`. | | `INVALID_API_KEY` | 401 | Missing or invalid API key. | ```bash cURL theme={null} # 1. Read the transcript curl "https://api.joinoverlap.com/clip-transcript?companyId=$OVERLAP_COMPANY_ID&clipId=clip-id-from-results" \ -H "Authorization: Bearer $OVERLAP_API_KEY" # 2. Fix a name everywhere it appears curl -X PATCH "https://api.joinoverlap.com/clip-transcript" \ -H "Authorization: Bearer $OVERLAP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "companyId": "'"$OVERLAP_COMPANY_ID"'", "clipId": "clip-id-from-results", "operations": [ { "from": "Kaz Schwarz", "to": "Cozz" } ] }' # 3. Re-render to bake the corrected subtitles into the export curl -X POST "https://api.joinoverlap.com/render" \ -H "Authorization: Bearer $OVERLAP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "companyId": "'"$OVERLAP_COMPANY_ID"'", "clipId": "clip-id-from-results" }' ``` ```javascript javascript theme={null} const base = "https://api.joinoverlap.com"; const headers = { "Authorization": `Bearer ${process.env.OVERLAP_API_KEY}`, "Content-Type": "application/json", }; const companyId = process.env.OVERLAP_COMPANY_ID; const clipId = "clip-id-from-results"; // Replace a misspelled name everywhere, then re-render. await fetch(`${base}/clip-transcript`, { method: "PATCH", headers, body: JSON.stringify({ companyId, clipId, operations: [{ from: "Kaz Schwarz", to: "Cozz" }], }), }); await fetch(`${base}/render`, { method: "POST", headers, body: JSON.stringify({ companyId, clipId }), }); ``` Export the clip with the corrected subtitles # Get Clip Source: https://docs.overlap.ai/api-reference/get-clip GET https://api.joinoverlap.com/clip Retrieve a saved clip document by company and clip id ### Endpoint ```http theme={null} GET https://api.joinoverlap.com/clip?companyId={companyId}&clipId={clipId} ``` Use this endpoint when you already have a `clipId` and need the latest saved clip document, including fields updated by `POST /update-clip`. ### Authentication ```http theme={null} Authorization: Bearer YOUR_API_KEY ``` ## Query Parameters | Parameter | Required | Description | | ----------- | -------- | ------------------------------------------------------------ | | `companyId` | Yes | Your Overlap company or organization identifier. | | `clipId` | Yes | The clip id returned by `GET /workflow-results/{triggerId}`. | The same lookup is also available at `GET /companies/{companyId}/clips/{clipId}`. ## Response Returns a [`Clip` object](/api-reference/clip-model). Clip fields are included when available, so a response may omit values that have not been generated or rendered yet. For example, `renderedUrl` may be absent. ```json theme={null} { "clip": { "id": "clip-id-from-results", "title": "Product Launch Highlights", "bio": "Key moments from the product launch webinar.", "duration": 45.2, "subtitleConfig": {} } } ``` The `clip` object is the saved clip document with `id` set to the Firestore document id. Review the fields that may appear on a clip response ```javascript javascript theme={null} const response = await fetch( `https://api.joinoverlap.com/clip?companyId=${process.env.OVERLAP_COMPANY_ID}&clipId=clip-id-from-results`, { headers: { "Authorization": `Bearer ${process.env.OVERLAP_API_KEY}` } } ); const data = await response.json(); ``` ```bash cURL theme={null} curl "https://api.joinoverlap.com/clip?companyId=$OVERLAP_COMPANY_ID&clipId=clip-id-from-results" \ -H "Authorization: Bearer $OVERLAP_API_KEY" ``` # Node Config Source: https://docs.overlap.ai/api-reference/node-config-overrides Override workflow action node settings when triggering a template Use node config overrides when a trigger needs to change the same settings a user can configure in the workflow builder. This is the most precise way to customize a run without editing the saved workflow template. This page documents frontend workflow-configurable fields only. Backend-only runtime fields are intentionally omitted. ## Where Overrides Go Add one of these fields to `POST /trigger-template`: * `nodeConfigs` * `nodeConfigOverrides` * `actionConfigs` They all behave the same way. Most integrations should use `nodeConfigs`. ```json theme={null} { "companyId": "company-id-from-your-overlap-account", "workflowId": "workflow-id-from-the-overlap-workflow-url", "url": "public-source-video-url", "nodeConfigs": { "add_broll": { "enable_ai_broll": true, "broll_frequency": "high" } } } ``` You can also send overrides as a list: ```json theme={null} { "nodeConfigs": [ { "nodeType": "add_broll", "config": { "enable_ai_broll": true, "broll_frequency": "high" } } ] } ``` ## How Overrides Apply * Overrides are keyed by workflow node type, such as `add_broll` or `add_subtitles`. * The public API resolves each node type to the matching node in the selected workflow. * If the workflow does not contain that node type, the override is skipped and the workflow still runs. * If the workflow contains the node but the config has invalid field names, invalid types, or invalid enum values, the request returns `INVALID_NODE_CONFIG`. * Structured overrides win over legacy flat fields when both set the same nested value. For example, if you send both `broll: true` and `nodeConfigs.add_broll.enabled: false`, the structured `nodeConfigs` value wins for `add_broll.enabled`. ## Quick Example This example changes clip length, b-roll, subtitles, and vertical reframe behavior for one trigger: ```json theme={null} { "nodeConfigs": { "find_clips": { "min_length": 30, "max_length": 90, "model_key": "multimodal", "prompt": "Find clips where the speaker explains a concrete product benefit." }, "add_broll": { "enable_ai_broll": true, "broll_frequency": "high", "allowed_methods": ["google_images", "youtube"] }, "add_subtitles": { "subtitle_config": { "speakerStyles": [ { "subtitleY": 50 } ] } }, "convert_to_vertical": { "style": "adaptive", "split_view": true, "force_split_view": true, "ignore_content_tiles": false } } } ``` ## Supported Node Types | Node type | Frontend-configurable fields | | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `find_clips` | `min_length`, `max_length`, `model_key`, `prompt`, `promptAdjustment`, `pinnedTimestamps`, `pinnedTimestampsOnly`, `pinnedTimestampMode` | | `convert_to_vertical` | `aspect_ratio`, `style`, `centerVertical`, `zoom` and `gaussian_blur` when `centerVertical` is `true`, `y_offset`, `split_view`, `force_split_view`, `ignore_content_tiles` | | `style_video` | `style_video_config` | | `add_broll` | `prompt`, `broll_frequency`, `allowed_methods`, `enable_ai_broll`, `use_broll_library`, `library_folder_ids` | | `add_subtitles` | `subtitle_config` | | `add_music` | `background_music_option`, `background_music_options` | | `add_watermark` | `watermark_config` | | `apply_branding` | `style`, `watermark_config`, `outro_music_url`, `outro_card_url`, `overlay_url`, `title_config` | | `add_title_overlay` | `title_config`, `titleConfig` | | `add_lower_thirds` | `lower_thirds_config`, `speaker_names` (API only) | | `filler_words` | `filler_words_config` | | `smart_zoom` | `smart_zoom_config` | | `add_outro` | `end_card_option`, `outro_music_option` | | `add_audiogram` | `template`, `audiogram_config` | | `remove_watermark` | `remove_watermark_config` | | `add_brainrot` | `brainrot_config` | | `media_overlay` | `media_overlay_config` | | `remove_curse_words` | `remove_curse_words_config` | `add_subtitles`, `add_title_overlay`, `add_watermark`, and `add_outro` are **deprecated but supported**. Use `style_video` for new workflows. Existing workflows and their standalone node overrides continue to work. ## Per-Node Examples ### `find_clips` Controls the clip discovery step. ```json theme={null} { "nodeConfigs": { "find_clips": { "min_length": 30, "max_length": 90, "model_key": "multimodal", "prompt": "Find clips with clear explanations, strong takeaways, and minimal setup.", "promptAdjustment": "Prioritize customer proof points for this run.", "pinnedTimestamps": [{ "start": 120, "end": 165 }], "pinnedTimestampsOnly": false, "pinnedTimestampMode": "search_within" } } } ``` Fields: | Field | Type | Notes | | ---------------------- | --------- | ------------------------------------------------------------------------------------------------------------------- | | `min_length` | number | Minimum target clip length in seconds. | | `max_length` | number | Maximum target clip length in seconds. | | `model_key` | string | `conversational` or `multimodal`. | | `prompt` | string | Replaces the node's clip-finding prompt for this run. | | `promptAdjustment` | string | Adds one-run guidance to the saved node prompt. | | `pinnedTimestamps` | object\[] | Source-video ranges such as `{ "start": 120, "end": 165 }` to include as clips. | | `pinnedTimestampsOnly` | boolean | When `true`, skip automatic discovery and return only `pinnedTimestamps` clips. Defaults to `false`. | | `pinnedTimestampMode` | string | Use `search_within` to discover individual clips inside `pinnedTimestamps`; omit it for guaranteed timestamp clips. | ### `convert_to_vertical` Controls the Reframe / Convert to Vertical node. ```json theme={null} { "nodeConfigs": { "convert_to_vertical": { "aspect_ratio": "9:16", "style": "style_three", "centerVertical": true, "zoom": 1, "gaussian_blur": false, "y_offset": 0.5, "split_view": true, "force_split_view": true, "ignore_content_tiles": false } } } ``` Fields: | Field | Type | Notes | | ---------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `aspect_ratio` | string | Usually `9:16` for vertical output. | | `style` | string | `style_one`, `style_two`, `style_three`, `style_four`, `style_none`, or `adaptive`. | | `centerVertical` | boolean | Enables centered vertical crop mode. `zoom` and `gaussian_blur` only apply when this is `true`. | | `zoom` | number | Zoom multiplier for centered vertical crop mode. Values below `1` are normalized to `1`. Only applies when `centerVertical` is `true`. | | `y_offset` | number | Vertical offset used by supported styles. | | `gaussian_blur` | boolean | Enables blurred background for centered vertical crop mode. Only applies when `centerVertical` is `true`. | | `split_view` | boolean | Enables split view when reframing. | | `force_split_view` | boolean | Forces split view for adaptive reframing. | | `ignore_content_tiles` | boolean | Ignores content tiles for adaptive reframing. | ### `add_broll` Controls B-roll generation and sourcing. ```json theme={null} { "nodeConfigs": { "add_broll": { "prompt": "Use product screenshots, event footage, and relevant visual metaphors. Avoid generic stock photos.", "broll_frequency": "high", "allowed_methods": ["google_images", "youtube"], "enable_ai_broll": false, "use_broll_library": true, "library_folder_ids": ["folder-id-from-your-overlap-library"] } } } ``` Fields: | Field | Type | Notes | | -------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------- | | `prompt` | string | Custom guidance for B-roll selection. | | `broll_frequency` | string | `low`, `medium`, `high`, or `always_on`. The `always_on` value continuously covers the complete visible video with B-roll. | | `allowed_methods` | string\[] | Any of `google_images`, `youtube`, `getty`. | | `enable_ai_broll` | boolean | Enables AI-generated B-roll. | | `use_broll_library` | boolean | Uses your uploaded B-roll library. | | `library_folder_ids` | string\[] | Folder IDs to search. Empty array means all folders. | ### `add_subtitles` Controls subtitle placement and styling. ```json theme={null} { "nodeConfigs": { "add_subtitles": { "subtitle_config": { "maxCharsPerLine": 28, "maxLines": 1, "wrapWidthPct": 80, "subtitleX": 50, "subtitleY": 50, "speakerStyles": [ { "styleId": "custom", "fontColor": "#FFFFFF", "fontFamily": "Forma-DJR", "fontSize": "42", "fontWeight": "900", "backgroundColor": "#000000", "backgroundOpacity": 0.85, "backgroundFillStyle": "block", "subtitleX": 50, "subtitleY": 50 } ] } } } } ``` Fields: | Field | Type | Notes | | ---------------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `subtitle_config` | object | Advanced subtitle configuration from the workflow subtitle editor. Send this as a JSON object, not a string. | | `subtitle_config.speakerStyles` | object\[] or object | Per-speaker subtitle styles. Prefer an array for API requests: index `0` is speaker 0, index `1` is speaker 1, and so on. An object map with numeric keys, such as `{ "0": { ... } }`, is also accepted. | | `subtitle_config.speakerStyles[0]` | object | Default style for the first speaker and the fallback style most subtitle renders inherit from. For most integrations, put subtitle styling and positioning fields here. If only `speakerStyles[0]` is defined, subtitles inherit that style unless a later speaker has its own entry. | | `subtitle_config.speakerStyles[n]` | object | Optional override for speaker `n`. Use this only when a specific speaker needs different styling from `speakerStyles[0]`. | | `subtitle_config.maxCharsPerLine` | number | Maximum characters per subtitle line. This can be set at the root because it controls line breaking for the subtitle layer. | | `subtitle_config.maxLines` | number | Maximum number of subtitle lines to display at once. | | `subtitle_config.wrapWidthPct` | number | Subtitle text wrapping width as a percentage of the video width. | | `subtitle_config.subtitleX` | number | Horizontal subtitle position as a percentage of video width, where `50` is centered. Set this in `speakerStyles[0]` for the usual one-style subtitle setup, or at the root when you intentionally need a layer default. | | `subtitle_config.subtitleY` | number | Vertical subtitle position as a percentage of video height. Set this in `speakerStyles[0]` for the usual one-style subtitle setup, or at the root when you intentionally need a layer default. | | `subtitle_config.selectedSpeaker` | number | Editor selection state. Usually omit this in API overrides. | | `subtitle_config.resolvedStyle` | object | Editor-resolved style metadata. Usually omit this in API overrides. | For most subtitle overrides, set style fields inside `subtitle_config.speakerStyles[0]`. For example, `subtitle_config.speakerStyles[0].subtitleY` sets the default subtitle Y position, and that value is inherited by subtitles when no more specific speaker style is present. `speakerStyles` array entry fields: | Field | Type | Notes | | ---------------------------------- | ---------------- | --------------------------------------------------------------------- | | `styleId` | string | Subtitle preset/style identifier. | | `name` | string | Display name for the subtitle style. | | `fontFamily` | string | Font family used for subtitle text. | | `fontUrl` | string | Optional font file URL used by the renderer. | | `fontSize` | string or number | Subtitle font size. | | `fontWeight` | string | CSS-style font weight such as `400`, `700`, or `900`. | | `fontColor` | string | Subtitle text color, usually a hex color. | | `isItalic` | boolean | Renders subtitle text in italic. | | `textCase` | string | Text case transform, such as `none`, `uppercase`, or `lowercase`. | | `textAlign` | string | `left`, `center`, or `right`. | | `textSpacing` | string or number | Letter spacing. | | `verticalStretch` | string or number | Vertical text stretch. | | `opacity` | number | Overall subtitle opacity, usually between `0` and `1`. | | `captionPosition` | string | `top`, `middle`, or `bottom`. | | `subtitleX` | number | Horizontal subtitle position as a percentage of video width. | | `subtitleY` | number | Vertical subtitle position as a percentage of video height. | | `maxCharsPerLine` | number | Maximum characters per subtitle line for this speaker style. | | `maxLines` | number | Maximum subtitle lines for this speaker style. | | `wrapWidthPct` | number | Wrapping width as a percentage of video width for this speaker style. | | `backgroundColor` | string | Subtitle background color. | | `backgroundOpacity` | number | Background opacity, usually between `0` and `1`. | | `backgroundFillStyle` | string | `wrap`, `block`, or `none`. | | `backgroundBorderRadius` | string or number | Subtitle background corner radius. | | `backgroundPadding` | string or number | Subtitle background padding. | | `backgroundPaddingX` | string | Horizontal background padding. | | `backgroundPaddingY` | string | Vertical background padding. | | `outlineColor` | string | Text outline color. | | `outlineStyle` | string | Text outline style. | | `outlineWidth` | string or number | Text outline width. | | `shadowEnabled` | boolean | Enables text shadow. | | `shadowColor` | string | Text shadow color. | | `shadowBlur` | string or number | Text shadow blur amount. | | `shadowOffsetX` | string or number | Text shadow horizontal offset. | | `shadowOffsetY` | string or number | Text shadow vertical offset. | | `shadowIntensity` | number | Shadow strength. | | `amplifySpokenWords` | boolean | Enables emphasized/current-word styling. | | `amplifiedColor` | string | Color used for amplified spoken words. | | `amplifiedColors` | object\[] | Optional multi-color or gradient amplified-word settings. | | `amplifiedOpacity` | number | Opacity for amplified spoken words. | | `amplifyOpacityTransitionDuration` | number | Transition duration for amplified-word opacity. | | `highlightWordsColor` | string | Color used for highlighted words. | | `highlightWordsBaseStyle` | object | Base style applied to highlighted words. | | `highlightKeywordStyles` | object | Per-keyword highlight style overrides. | | `textHighlightPersists` | boolean | Keeps highlighted-word styling after the word is spoken. | | `currentWordBlock` | boolean | Enables block styling for the current word. | | `currentWordBlockBackgroundColor` | string | Current-word block background color. | | `currentWordBlockBorderRadius` | string | Current-word block corner radius. | | `currentWordBlockOpacity` | number | Current-word block opacity. | | `currentWordBlockPadding` | string | Current-word block padding. | | `randomColors` | object | Random word-color settings. | | `shinySegmentHighlight` | boolean | Enables shiny segment highlighting. | | `shinyWordHighlight` | boolean | Enables shiny word highlighting. | | `animationStyle` | string | Subtitle animation style. | ### `style_video` Controls the complete visual treatment from the [Style Video](/nodes/style-video) node. All styling elements are optional; an empty `layers` array is a valid no-op. ```json theme={null} { "nodeConfigs": { "style_video": { "style_video_config": { "version": 1, "layers": [ { "id": "captions", "type": "subtitles", "enabled": true, "config": { "speakerStyles": [ { "styleId": "custom", "fontColor": "#FFFFFF", "subtitleY": 72 } ] } }, { "id": "logo", "type": "watermark", "enabled": true, "config": { "enabled": true, "url": "https://cdn.example.com/logo.png", "position": 2, "size": 12, "padding": 2 } } ], "outro": { "endCardOption": { "url": "https://cdn.example.com/end-card.png", "duration": 5, "secondsBeforeEnd": 0 } }, "colorGrading": { "exposure": 8, "contrast": 12, "vignette": 10, "grain": { "amount": 8, "animated": true } } } } } } ``` Top-level fields: | Field | Type | Notes | | --------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `style_video_config.version` | number | Required wrapper version. Use `1`. | | `style_video_config.layers` | object\[] | Required array of visual layers. It may be empty. | | `style_video_config.stepOrder` | string\[] | Optional authoring order containing each of `title_overlay`, `subtitles`, `graphics`, `outro`, and `color_grading` once. Usually omit it and use the default order. | | `style_video_config.template` | object | Optional selected-template reference with `id`, `name`, `previewUrl`, and `editConfig`. It is normally retained from the saved workflow instead of constructed in an override. | | `style_video_config.outro` | object | Optional `endCardOption`, `outroMusicOption`, or both. Each configured option requires a public `url`. | | `style_video_config.colorGrading` | object | Optional final grade for the base video. | Layer fields: | Field | Type | Notes | | ------------------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | `layers[].id` | string | Required stable ID that is unique within the Style Video node. | | `layers[].type` | string | `title`, `subtitles`, `watermark`, `media_overlay`, or `lower_thirds`. | | `layers[].enabled` | boolean | Disabled layers keep their configuration but are not applied. | | `layers[].config` | object | The corresponding title, subtitle, watermark, media-overlay, or lower-third configuration without the standalone node's outer field name. | Style Video supports multiple title, watermark, and media-overlay layers. It supports at most one subtitle layer and one lower-third layer. Watermark layers require `config.url`; media overlays require `config.mediaUrl`. Color grading fields: | Field | Type | Notes | | ------------------------------------------------------------- | ------- | --------------------------------------- | | `brightness`, `exposure`, `contrast`, `highlights`, `shadows` | number | Light adjustments. | | `saturation`, `vibrance`, `temperature`, `tint` | number | Color adjustments. | | `fade`, `vignette`, `blur` | number | Finishing adjustments. | | `grain.amount` | number | Film grain amount from `0` to `100`. | | `grain.size` | number | Film grain size from `0.5` to `8`. | | `grain.opacity` | number | Film grain opacity from `0` to `1`. | | `grain.animated` | boolean | Animates the grain pattern when `true`. | | `grain.seed` | number | Optional deterministic grain seed. | ### `add_music` Controls background music. ```json theme={null} { "nodeConfigs": { "add_music": { "background_music_options": [ { "id": "music-track-id", "name": "Selected music track", "url": "public-music-file-url", "thumbnailUrl": "public-thumbnail-url", "duration": 120, "volume": 0.35 } ] } } } ``` Fields: | Field | Type | Notes | | -------------------------- | --------- | --------------------------------------------------------- | | `background_music_option` | object | Legacy single-song option. | | `background_music_options` | object\[] | Multiple music options. The workflow can select per clip. | Music option fields: | Field | Type | Notes | | -------------- | ------ | ----------------------------------------------- | | `id` | string | Track ID. | | `name` | string | Display name. | | `url` | string | Public audio URL. | | `thumbnailUrl` | string | Optional thumbnail URL. | | `duration` | number | Track duration in seconds. | | `volume` | number | Volume multiplier, usually between `0` and `1`. | ### `add_watermark` Controls watermark rendering config. ```json theme={null} { "nodeConfigs": { "add_watermark": { "watermark_config": { "enabled": true, "url": "public-watermark-image-url", "position": 3, "size": 18, "padding": 24, "opacity": 0.9 } } } } ``` Fields: | Field | Type | Notes | | --------------------------- | ------- | ------------------------------------- | | `watermark_config.enabled` | boolean | Enables or disables the watermark. | | `watermark_config.url` | string | Public image URL. | | `watermark_config.position` | number | Position value used by the renderer. | | `watermark_config.size` | number | Watermark size. | | `watermark_config.padding` | number | Edge padding. | | `watermark_config.opacity` | number | Opacity, usually between `0` and `1`. | ### `apply_branding` Controls the Apply Branding node. ```json theme={null} { "nodeConfigs": { "apply_branding": { "style": "default", "watermark_config": { "enabled": true, "url": "public-watermark-image-url" }, "outro_music_url": "public-outro-music-url", "outro_card_url": "public-outro-card-image-url", "overlay_url": "public-overlay-media-url", "title_config": { "prompt": "Write a short hook for this clip.", "fontColor": "#FFFFFF", "backgroundColor": "#000000" } } } } ``` Fields: | Field | Type | Notes | | ------------------ | ------ | ------------------------------ | | `style` | string | Branding style name. | | `watermark_config` | object | Watermark config to apply. | | `outro_music_url` | string | Public outro music URL. | | `outro_card_url` | string | Public outro card image URL. | | `overlay_url` | string | Public overlay media URL. | | `title_config` | object | Title overlay config to apply. | ### `add_title_overlay` Controls the Title Overlay node. ```json theme={null} { "nodeConfigs": { "add_title_overlay": { "title_config": { "prompt": "Create a concise title that teases the main insight.", "fontFamily": "Roboto", "fontWeight": "500", "fontColor": "#000000", "backgroundColor": "#FFFFFF", "backgroundOpacity": 1, "backgroundStyle": "wrap", "textAlign": "center", "yPosition": 0.23, "duration": 4, "allCaps": false } } } } ``` Common `title_config` fields: | Field | Type | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `prompt` | string | | `text` | string (applied only when `generateTitle` is `false`; otherwise replaced by the AI-generated title) | | `generateTitle` | boolean (default `true`; set `false` to use `text` verbatim and skip AI title generation) | | `fontFamily` | string | | `fontWeight` | string | | `fontColor` | string | | `fontSize` | number | | `lineHeight` | number | | `characterSpacing` | number | | `padding` | number | | `verticalPadding` | number | | `borderRadius` | number | | `backgroundColor` | string | | `backgroundOpacity` | number | | `backgroundStyle` | string | | `boxShadow` | string | | `textShadow` | string | | `yPosition` | number | | `positionDynamically` | boolean (default `false`; anchors the title to a detected split-view seam) | | `avoidFaces` | boolean (default `false`; moves the title away from detected face and subject regions) | | `duration` | number | | `allCaps` | boolean | | `textAlign` | string | | `fontScale` | number | | `lineMargin` | number | | `titlePresetId` | string — apply a styled title template (see [Styled title templates](#styled-title-templates) below). When set, the template's design drives the look and the flat typography/background fields above are ignored. | | `titlePaletteId` | string — color palette for templates that define one | | `presetOverrides` | object — per-template style/position customizations layered on the template (see below) | | `presetTextOverrides` | object — fixed text for a template's non-primary lines, keyed by element id (e.g. `text-secondary`). Fixed text overrides generation for that block. | | `presetGenerationBlocks` | array — ordered semantic generation blocks carried by a preset. Each entry contains `elementId`, `kind` (`name` or `title`), and optional `primary`. | By default this node generates a title for each clip with AI and ignores `text`. To use your own fixed title instead, set `generateTitle` to `false` and provide `text`: ```json theme={null} { "nodeConfigs": { "add_title_overlay": { "title_config": { "text": "Our Exact Title", "generateTitle": false } } } } ``` The same title is applied to every clip in the run. For different per-clip titles, edit each clip after generation with [Update Clip](/api-reference/update-clip). #### Styled title templates Set `titlePresetId` to render one of the built-in styled title templates — the same templates available in the workflow editor's Text panel — instead of the flat title styling. The AI-generated title fills the template's primary line, and the template's design (fonts, colors, backplate, animation) is preserved. Supplying `titlePresetId` selects that template from a clean preset state for the run. Any palette, `presetOverrides`, `presetTextOverrides`, or `presetGenerationBlocks` stored on the workflow's previously selected template are cleared first. The API seeds the template's editor sample text and semantic generation blocks, then applies the fields in your request. This matches selecting a different template in the workflow editor and prevents customizations from the old template leaking into the new one. Available `titlePresetId` values: | `titlePresetId` | Description | | --------------------- | ------------------------------------------------------------- | | `cyan-block-title` | Bold headline on a solid color block (palettes available) | | `cyan-divider-title` | Headline with a colored left divider bar (palettes available) | | `context-caption` | Multi-line highlighted caption stack | | `cal-sans-pill-title` | Rounded black title card | | `tiktok-3d` | Offset 3D-border box, TikTok style (palettes available) | | `instagram-wrap` | Rounded per-line wrapped text | | `daily-vlog-title` | Handwritten title + subtitle (two lines) | | `vertical-video-hook` | Featured person name + per-clip editorial hook (two lines) | Optional customizations layered on the chosen template: * `titlePaletteId` — a palette id for templates that define palettes. `cyan-block-title` and `cyan-divider-title`: `breaking-news`, `national-news`, `politics`, `world-news`, `local-news`, `weather`, `entertainment`. `tiktok-3d`: `tiktok`, `grape-lime`, `sunset`. `instagram-wrap`: `clean`, `midnight`, `peach`. * `presetOverrides` — an object of style/position tweaks applied on top of the template. Supported keys include `fontColor`, `fontFamily`, `fontWeight`, `fontStyle` (`"italic"` / `"normal"`), `textAlign`, `textTransform`, `lineHeight`, `letterSpacing`, `wrapWidth`, `maxLines`, `backgroundColor`, `backgroundStyle`, `padding`, `borderRadius`, `textShadow`, `boxShadow`, and geometry (`xPosition`, `yPosition`, `scale`, `width`, `height`, `rotation`). Positions are `0`–`1` fractions of the frame. * `presetTextOverrides` — fixed text for a template's secondary line(s), keyed by element id (e.g. `{ "text-secondary": "Episode #4" }` for the Daily Vlog subtitle). The primary line is always replaced by the AI-generated title (or your `text` when `generateTitle` is `false`). Example — a Breaking News headline template, recolored and nudged higher: ```json theme={null} { "nodeConfigs": { "add_title_overlay": { "title_config": { "prompt": "Create a concise, punchy breaking-news headline.", "titlePresetId": "cyan-block-title", "titlePaletteId": "breaking-news", "presetOverrides": { "fontColor": "#FFFFFF", "textTransform": "uppercase", "yPosition": 0.18 } } } } } ``` When `titlePresetId` is set, the flat typography/background fields (`fontFamily`, `backgroundColor`, etc.) are ignored — adjust the template with `presetOverrides` instead. ### `add_lower_thirds` Adds a speaker-name lower-third card when each speaker first talks. Add the **Add Lower Thirds** node to your workflow in the portal and style it there (preset, colours, position). Then name the people in each video on the trigger call with `speaker_names` — the names change every run, the styling does not. ```json theme={null} { "nodeConfigs": { "add_lower_thirds": { "speaker_names": [ { "name": "Jamie O'Hara", "title": "Presenter" }, { "name": "Gabby Agbonlahor", "title": "Former Striker" } ] } } } ``` **`speaker_names` is positional, ordered by who speaks first.** The first entry names the first person heard in the video, the second entry the second, and so on — the same "Speaker 1 / Speaker 2" model used in the studio editor. `title` is optional; omit it for a name-only card. To leave one speaker unnamed while naming a later one, pass `null` (or `{}`) in their position so the remaining names stay aligned: ```json theme={null} { "speaker_names": [null, { "name": "Gabby Agbonlahor" }] } ``` Cards are timed from the transcript: each appears 1 second after that speaker's first word and runs for the preset's duration. A speaker who is never named, or who never speaks, simply gets no card. When two speakers talk at nearly the same moment, their cards play back to back rather than overlapping. `speaker_names` is available through the API only — there is no field for it in the workflow builder, because who appears in a video changes with every run. #### Overriding the styling `lower_thirds_config` overrides the styling set in the builder. It **merges**, so send only what you want to change and everything else is kept: ```json theme={null} { "nodeConfigs": { "add_lower_thirds": { "speaker_names": [{ "name": "Jamie O'Hara", "title": "Presenter" }], "lower_thirds_config": { "titlePresetId": "red-accent-lower-third", "titlePaletteId": "broadcast-blue", "presetOverrides": { "fontColor": "#FFFFFF", "secondaryTextColor": "#D0D0D0", "accentColor": "#0A84FF", "cardBackgroundColor": "#101010", "xPosition": 0.18, "yPosition": 0.74 } } } } } ``` | Field | Description | | ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | | `titlePresetId` | Card template. One of `red-accent-lower-third` (default) or `split-credit`. | | `titlePaletteId` | Colour palette for the chosen preset: `signal-red`, `broadcast-blue`, or `gold`. | | `presetOverrides.fontColor` | Name (primary) text colour. | | `presetOverrides.secondaryTextColor` | Title/role (secondary) text colour. | | `presetOverrides.accentColor` | Accent bar colour. | | `presetOverrides.cardBackgroundColor` | Background box behind the card. Omit for no box. | | `presetOverrides.xPosition` / `yPosition` | Card position as a fraction of the frame (`0`–`1`), measured to the card's top-left corner. Lower `yPosition` moves the card up. | | `presetOverrides.scale`, `width`, `height`, `rotation` | Fine placement adjustments. | Changing `titlePresetId` resets that preset's colours and palette to their defaults (a colour chosen for one template does not carry to another), but keeps your position. To change template *and* colours in one call, send both in the same request. If you send `speaker_names` to a workflow that has no **Add Lower Thirds** node, the request is rejected — add the node in the builder first. Everything else about the run is unchanged. ### `filler_words` Controls filler word, stutter, and silence cleanup. ```json theme={null} { "nodeConfigs": { "filler_words": { "filler_words_config": { "enabled": true, "stutteredWordsEnabled": true, "silencesEnabled": false, "minSilenceDuration": 1, "words": ["um", "uh", "like", "you know"] } } } } ``` Fields: | Field | Type | Notes | | ----------------------- | --------- | ------------------------------------ | | `enabled` | boolean | Enables filler word removal. | | `fromVideo` | boolean | Detects filler words from the video. | | `minRepetitions` | number | Repetition threshold. | | `stutteredFromVideo` | boolean | Detects stuttered words from video. | | `stutteredWordsEnabled` | boolean | Enables stuttered word removal. | | `silencesEnabled` | boolean | Enables silence removal. | | `minSilenceDuration` | number | Minimum silence duration to remove. | | `words` | string\[] | Words or phrases to remove. | ### `smart_zoom` Controls Smart Zoom. ```json theme={null} { "nodeConfigs": { "smart_zoom": { "smart_zoom_config": { "frequency": "MEDIUM", "transition_length": 0.1, "additional_instructions": "Prefer zooms when the speaker changes topics." } } } } ``` Fields: | Field | Type | Notes | | ------------------------- | ------ | --------------------------- | | `frequency` | string | Smart zoom frequency. | | `transition_length` | number | Transition length. | | `additional_instructions` | string | Additional prompt guidance. | ### `add_outro` Controls end card and outro music. ```json theme={null} { "nodeConfigs": { "add_outro": { "end_card_option": { "url": "public-end-card-image-url", "duration": 5, "secondsBeforeEnd": 2 }, "outro_music_option": { "url": "public-outro-music-url", "name": "Outro music", "secondStart": 0, "duration": 5, "secondsBeforeEnd": 2, "volume": 0.25 } } } } ``` Fields: | Field | Type | Notes | | ------------------------------------- | ------ | ---------------------------------------------- | | `end_card_option.url` | string | Public end card image URL. | | `end_card_option.duration` | number | End card duration in seconds. | | `end_card_option.secondsBeforeEnd` | number | When the end card starts relative to clip end. | | `outro_music_option.url` | string | Public audio URL. | | `outro_music_option.name` | string | Display name. | | `outro_music_option.secondStart` | number | Audio start offset in seconds. | | `outro_music_option.duration` | number | Audio duration in seconds. | | `outro_music_option.secondsBeforeEnd` | number | When outro music starts relative to clip end. | | `outro_music_option.volume` | number | Volume multiplier. | ### `add_audiogram` Controls audiogram display. ```json theme={null} { "nodeConfigs": { "add_audiogram": { "template": "farnam", "audiogram_config": { "frontend": true, "source": "custom", "orientation": "vertical", "audiogramY": 50, "audiogramColor": "#000000", "backgroundType": "color", "backgroundColor": "#000000", "backgroundImageUrl": "", "textColor": "#FFFFFF", "centerText": true, "blackBarEnabled": true, "subtextEnabled": false, "fontWeight": "700" } } } } ``` Fields: | Field | Type | Notes | | ------------------------------------- | ------- | ---------------------------------------------------- | | `template` | string | Audiogram template/source. | | `audiogram_config.frontend` | boolean | Keeps audiogram rendering in frontend metadata mode. | | `audiogram_config.source` | string | Template source. | | `audiogram_config.orientation` | string | `horizontal` or `vertical`. | | `audiogram_config.audiogramY` | number | Audiogram vertical position. | | `audiogram_config.audiogramColor` | string | Waveform color. | | `audiogram_config.backgroundType` | string | Background mode. | | `audiogram_config.backgroundColor` | string | Background color. | | `audiogram_config.backgroundImageUrl` | string | Optional background image URL. | | `audiogram_config.textColor` | string | Text color. | | `audiogram_config.centerText` | boolean | Centers title text. | | `audiogram_config.blackBarEnabled` | boolean | Enables black bar style. | | `audiogram_config.subtextEnabled` | boolean | Enables subtext. | | `audiogram_config.fontWeight` | string | Font weight. | ### `remove_watermark` Controls watermark removal. ```json theme={null} { "nodeConfigs": { "remove_watermark": { "remove_watermark_config": { "enabled": true } } } } ``` Fields: | Field | Type | Notes | | --------- | ------- | -------------------------------------- | | `enabled` | boolean | Enables or disables watermark removal. | ### `add_brainrot` Controls Brainrot split-screen style. ```json theme={null} { "nodeConfigs": { "add_brainrot": { "brainrot_config": { "category": "minecraft", "cropPosition": "bottom", "verticalY": 50, "videoUrl": "public-background-video-url" } } } } ``` Fields: | Field | Type | Notes | | ---------------- | ------ | -------------------------------------- | | `category` | string | Brainrot category. | | `cropPosition` | string | Background crop placement. | | `randomVideoUrl` | string | Optional randomly selected source URL. | | `verticalY` | number | Vertical placement. | | `videoUrl` | string | Public background video URL. | ### `media_overlay` Controls media overlays. ```json theme={null} { "nodeConfigs": { "media_overlay": { "media_overlay_config": { "mediaUrl": "public-overlay-media-url", "opacity": 1, "scale": 0.3, "xPosition": 50, "yPosition": 50, "startOffset": 0, "endOffset": 0, "animationDuration": 1, "introTransitionId": "none", "outroTransitionId": "fade" } } } } ``` Fields: | Field | Type | Notes | | ------------------- | ------ | --------------------------------------------------------- | | `mediaUrl` | string | Public image or video URL. | | `opacity` | number | Overlay opacity. | | `scale` | number | Overlay scale. | | `xPosition` | number | Horizontal position. | | `yPosition` | number | Vertical position. | | `startOffset` | number | Seconds after the clip starts before the overlay appears. | | `endOffset` | number | Seconds before the clip ends when the overlay disappears. | | `animationDuration` | number | Intro/outro transition duration in seconds. | | `introTransitionId` | string | Optional intro transition preset ID. | | `outroTransitionId` | string | Optional outro transition preset ID. | ### `remove_curse_words` Controls curse word handling. ```json theme={null} { "nodeConfigs": { "remove_curse_words": { "remove_curse_words_config": { "enabled": true, "mode": "silence", "words": ["damn", "hell"] } } } } ``` Fields: | Field | Type | Notes | | --------- | --------- | ---------------------------------- | | `enabled` | boolean | Enables curse word handling. | | `mode` | string | `silence`, `beep`, or `remove`. | | `words` | string\[] | Words to silence, beep, or remove. | ## Legacy Flat Fields These flat trigger fields still work and are converted into node configs internally: | Flat field | Equivalent node override | | ---------------------- | -------------------------------------------------------------------------------------- | | `minLengthTarget` | `find_clips.min_length` | | `maxLengthTarget` | `find_clips.max_length` | | `promptAdjustment` | `find_clips.promptAdjustment` | | `pinnedTimestamps` | `find_clips.pinnedTimestamps` | | `pinnedTimestampsOnly` | `find_clips.pinnedTimestampsOnly` | | `pinnedTimestampMode` | `find_clips.pinnedTimestampMode` | | `musicUrl` | `add_music.background_music_option.url` | | `broll: true` | `add_broll.enabled` | | `broll: { ... }` | Merged into `add_broll` | | `removeFillerWords` | `filler_words.filler_words_config.enabled` | | `removeStutteredWords` | `filler_words.filler_words_config.stutteredWordsEnabled` | | `removeSilences` | `filler_words.filler_words_config.silencesEnabled` | | `subtitleConfig` | `add_subtitles.subtitle_config` and `add_subtitles.subtitle_config.speakerStyles["0"]` | | `watermarkUrl` | `add_watermark.watermark_config.url` | | `titleConfig` | `add_title_overlay.title_config` | | `outroImageUrl` | `add_outro.end_card_option.url` | | `outroMusicUrl` | `add_music.outro_music_option.url` | Use node config overrides when triggering a workflow template # Post Analytics Source: https://docs.overlap.ai/api-reference/post-analytics GET https://api.joinoverlap.com/post-analytics Retrieve all current analytics for a published post in one call ### Endpoint ```http theme={null} GET https://api.joinoverlap.com/post-analytics?companyId={companyId}&postId={postId} ``` One call returns everything Overlap currently knows about a published post's performance: the post's identity, the normalized counters (views, likes, comments, shares, engagement score), and the platform's own advanced metrics from the latest refresh — the same data behind the post analytics page in the Overlap dashboard. Find `postId`s with [`GET /posts`](/api-reference/posts). ### Authentication ```http theme={null} Authorization: Bearer YOUR_API_KEY ``` ## Query Parameters | Parameter | Required | Description | | ----------- | -------- | ------------------------------------------------ | | `companyId` | Yes | Your Overlap company or organization identifier. | | `postId` | Yes | The post id from `GET /posts`. | The same lookup is also available at `GET /companies/{companyId}/posts/{postId}/analytics`. ```bash cURL theme={null} curl "https://api.joinoverlap.com/post-analytics?companyId=YOUR_COMPANY_ID&postId=POST_ID" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ```javascript JavaScript theme={null} const response = await fetch( 'https://api.joinoverlap.com/post-analytics?companyId=YOUR_COMPANY_ID&postId=POST_ID', { headers: { Authorization: 'Bearer YOUR_API_KEY' } } ); const { post, analytics } = await response.json(); ``` ```python Python theme={null} import requests response = requests.get( "https://api.joinoverlap.com/post-analytics", params={"companyId": "YOUR_COMPANY_ID", "postId": "POST_ID"}, headers={"Authorization": "Bearer YOUR_API_KEY"}, ) data = response.json() print(data["analytics"]["views"], data["analytics"]["likes"]) ``` ## Response ```json theme={null} { "post": { "id": "uV9LKKuVU2IiRcwv7UvY", "platform": "youtube", "text": "Top agent Jarred Arfa and promoter Danny Hayes say fans finally figured out the game...", "postUrl": "https://youtu.be/3j6-UUMa6WE", "nativeId": "3j6-UUMa6WE", "clipId": "6dd94ba0-908c-4489-897f-4bc02fe96650", "status": "success", "mediaUrl": "https://.../exported-6dd94ba0.mp4", "thumbnailUrl": "https://.../thumb.jpg", "createdAt": "2026-07-10T19:31:30+00:00" }, "analytics": { "views": 969, "likes": 9, "comments": 0, "shares": 0, "engagementScore": 27.69, "growthRate": 9.1, "lastAnalyticsUpdate": "2026-07-10T23:10:31+00:00", "platformMetrics": { "youtube": { "analytics": { "viewCount": 969, "likeCount": 9, "averageViewDuration": 21, "estimatedMinutesWatched": 346, "subscribersGained": 1 } } } } } ``` Field definitions live in the [Analytics Model reference](/api-reference/analytics-model). `analytics.platformMetrics` carries the platform's own advanced metrics from the most recent refresh — whatever the platform reports (e.g. YouTube `averageViewDuration` / `estimatedMinutesWatched`, TikTok watch time and retention, Facebook impression breakdowns, X organic metrics). Its shape mirrors the platform's analytics API and may change without notice; the normalized counters above are the stable contract. ## Data freshness Overlap refreshes post analytics from the social platforms on a rolling schedule: new posts are refreshed frequently in their first days, then roughly every 6 hours. `analytics.lastAnalyticsUpdate` tells you when the data was last refreshed. Platform caveats to be aware of: * **YouTube** analytics lag roughly 48 hours behind real time. * **X (Twitter)** exposes detailed metrics only for 30 days after posting; older posts stop receiving updates. * **Bluesky** does not report per-post view counts, so `views` stays `0` there. * Watch-time and other advanced fields in `platformMetrics` are only present on platforms that report them. Discover post ids and browse rolled-up metrics. Field-by-field response reference. # List Posts Source: https://docs.overlap.ai/api-reference/posts GET https://api.joinoverlap.com/posts List published social posts for a company, with rolled-up analytics ### Endpoint ```http theme={null} GET https://api.joinoverlap.com/posts?companyId={companyId} ``` Lists posts that Overlap has published to social platforms for your company, newest first, including each post's rolled-up analytics counters. Use it to discover `postId`s for [`GET /post-analytics`](/api-reference/post-analytics), or to find every post published from a specific clip via the `clipId` filter. ### Authentication ```http theme={null} Authorization: Bearer YOUR_API_KEY ``` ## Query Parameters | Parameter | Required | Description | | ----------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `companyId` | Yes | Your Overlap company or organization identifier. | | `clipId` | No | Return only the posts published from this clip (the clip id from `GET /workflow-results/{triggerId}`). Returns all matches in one response — `sortBy` and `cursor` are ignored on this path. | | `platform` | No | Filter by platform (`youtube`, `tiktok`, `instagram`, `twitter`, `linkedin`, `facebook`, `threads`, `snapchat`, `bluesky`). Applied per page, so a filtered page may contain fewer than `limit` items — keep paging until `cursor` is `null`. | | `sortBy` | No | `date` (default), `views`, `likes`, or `comments`. Metric sorts order by the post's current rollup, descending. | | `startDate` / `endDate` | No | ISO-8601 date or datetime bounds on the post's publish time. Only valid with `sortBy=date`. | | `limit` | No | Page size, 1–100. Defaults to `25`. | | `cursor` | No | Pagination cursor from the previous response. | The same listing is also available at `GET /companies/{companyId}/posts`. ```bash cURL theme={null} curl "https://api.joinoverlap.com/posts?companyId=YOUR_COMPANY_ID&sortBy=views&limit=25" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ```javascript JavaScript theme={null} const response = await fetch( 'https://api.joinoverlap.com/posts?companyId=YOUR_COMPANY_ID&sortBy=views&limit=25', { headers: { Authorization: 'Bearer YOUR_API_KEY' } } ); const { posts, cursor } = await response.json(); ``` ```python Python theme={null} import requests response = requests.get( "https://api.joinoverlap.com/posts", params={"companyId": "YOUR_COMPANY_ID", "sortBy": "views", "limit": 25}, headers={"Authorization": "Bearer YOUR_API_KEY"}, ) posts = response.json()["posts"] ``` ## Response Returns an array of [`Post` objects](/api-reference/analytics-model#post-object) and a pagination cursor. `cursor` is `null` when there are no more pages; otherwise pass it back as the `cursor` query parameter. ```json theme={null} { "posts": [ { "id": "uV9LKKuVU2IiRcwv7UvY", "platform": "youtube", "text": "Top agent Jarred Arfa and promoter Danny Hayes say fans finally figured out the game...", "postUrl": "https://youtu.be/3j6-UUMa6WE", "nativeId": "3j6-UUMa6WE", "clipId": "6dd94ba0-908c-4489-897f-4bc02fe96650", "status": "success", "mediaUrl": "https://.../exported-6dd94ba0.mp4", "thumbnailUrl": "https://.../thumb.jpg", "createdAt": "2026-07-10T19:31:30+00:00", "analytics": { "views": 969, "likes": 9, "comments": 0, "shares": 0 }, "engagementScore": 27.69, "growthRate": 9.1, "lastAnalyticsUpdate": "2026-07-10T23:10:31+00:00" } ], "cursor": "uV9LKKuVU2IiRcwv7UvY" } ``` All current analytics for a single post. Field-by-field response reference. # Render Clip Source: https://docs.overlap.ai/api-reference/render POST https://api.joinoverlap.com/render Render a clip after updates and receive a finalized video URL ### Endpoint ```http theme={null} POST https://api.joinoverlap.com/render ``` Use this endpoint after saving clip edits with `POST /update-clip`, or whenever you need a finalized export for an existing clip. Rendering runs synchronously, so the request stays open until the render finishes or fails. ### Authentication ```http theme={null} Authorization: Bearer YOUR_API_KEY Content-Type: application/json ``` ## Request Body ```json theme={null} { "companyId": "your-company-id", "clipId": "clip-id-from-results" } ``` | Field | Type | Required | Description | | ----------- | ------ | -------- | -------------------------------------------------------------- | | `companyId` | string | Yes | Your Overlap company or organization identifier. | | `clipId` | string | Yes | The clip `id` returned by `GET /workflow-results/{triggerId}`. | ```javascript javascript theme={null} const response = await fetch("https://api.joinoverlap.com/render", { method: "POST", headers: { "Authorization": `Bearer ${process.env.OVERLAP_API_KEY}`, "Content-Type": "application/json" }, body: JSON.stringify({ companyId: process.env.OVERLAP_COMPANY_ID, clipId: "clip-id-from-results" }) }); const data = await response.json(); ``` ```python python theme={null} import os import requests response = requests.post( "https://api.joinoverlap.com/render", headers={ "Authorization": f"Bearer {os.environ['OVERLAP_API_KEY']}", "Content-Type": "application/json", }, json={ "companyId": os.environ["OVERLAP_COMPANY_ID"], "clipId": "clip-id-from-results", }, ) print(response.json()) ``` ```bash cURL theme={null} curl -X POST "https://api.joinoverlap.com/render" \ -H "Authorization: Bearer $OVERLAP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "companyId": "'"$OVERLAP_COMPANY_ID"'", "clipId": "clip-id-from-results" }' ``` ## Response ```json theme={null} { "status": "finished", "renderUrl": "https://cdn.overlap.ai/rendered/final-clip.mp4" } ``` | Field | Type | Description | | ----------- | ------ | ------------------------------------------------------- | | `status` | string | `finished`, `failed`, or `rendering`. | | `renderUrl` | string | URL of the newly rendered clip when rendering succeeds. | | `error` | string | Error message when rendering fails. | | `code` | string | Specific error code when available. | ## Performance * Rendering runs synchronously. * Expected runtime is about `20 seconds + video_length_seconds * 0.5`. * Keep the connection open until the response returns. Review the clip fields returned by workflow results # Get Results Source: https://docs.overlap.ai/api-reference/results GET https://api.joinoverlap.com/workflow-results/{triggerId} Poll the status of a triggered workflow and retrieve generated clips ### Endpoint ```http theme={null} GET https://api.joinoverlap.com/workflow-results/{triggerId} ``` Poll this endpoint after `POST /trigger-template` returns a `triggerId`. We recommend polling every 5-10 seconds until the workflow reaches `Completed` or `Error`. Use `renderedUrl` as the editable preview video. Call `POST /render` when you need a finalized export after clip edits. ### Authentication ```http theme={null} Authorization: Bearer YOUR_API_KEY Content-Type: application/json ``` ## Path Parameters | Parameter | Description | | ----------- | -------------------------------------------------------------------- | | `triggerId` | Unique workflow run identifier returned by `POST /trigger-template`. | ## Response Format ```json theme={null} { "status": "Pending | Processing | Learning | Completed | Error", "clips": [], "error": "Error message when status is Error" } ``` Statuses can vary by workflow step, but successful runs finish with `Completed` and failed runs finish with `Error`. ## Completed Response ```json theme={null} { "clips": [ { "aspectRatio": "16:9", "bio": "An experienced startup founder and investor explains how founder psychology can make or break a company.", "duration": 51.724999, "endTimestamp": 51.724999, "id": "0e3b1690-3bad-42cc-810d-87fd433054b8", "keywords": ["startup", "founder psychology", "self-awareness"], "people": ["Startup Founder"], "renderedUrl": "https://cdn.overlap.ai/fe249157-6be2-4fce-9aec-961f800604f1.mp4", "startTimestamp": 0.0, "thumbnailURL": "https://cdn.overlap.ai/thumbnails/ce99b3c5-4d5d-4cc4-ae69-b835d23fe77a_thumb.jpg", "timestampBoundary": { "start": 0.0, "end": 30.0 }, "title": "Startup Founder: You're Your Startup's Biggest Threat", "viralityScore": 89.5 } ], "status": "Completed" } ``` ## Processing Response ```json theme={null} { "clips": [], "status": "Processing" } ``` ## Error Response ```json theme={null} { "clips": [], "status": "Error", "error": "Workflow failed while processing the source video." } ``` ## Recommended Polling Pattern ```javascript javascript theme={null} async function getWorkflowResults(triggerId) { const response = await fetch( `https://api.joinoverlap.com/workflow-results/${triggerId}`, { headers: { "Authorization": `Bearer ${process.env.OVERLAP_API_KEY}`, "Content-Type": "application/json" } } ); return response.json(); } ``` * Continue polling while `status` is `Pending`, `Processing`, `Learning`, or another in-progress workflow step. * Stop polling when `status` is `Completed` and use the returned `clips`. * Stop polling when `status` is `Error` and show or log the returned `error`. ## Clip Object | Property | Type | Description | | ------------------------- | ---------- | --------------------------------------------------------------------------------- | | `id` | `string` | Unique identifier for the clip. Use this as `clipId` for update and render calls. | | `title` | `string` | Title of the clip. | | `bio` | `string` | Short contextual description or bio for the clip. | | `keywords` | `string[]` | Array of relevant keywords or tags associated with the clip. | | `people` | `string[]` | Array of people (e.g., speakers) featured in the clip. | | `duration` | `number` | Total duration of the clip in seconds. | | `startTimestamp` | `number` | Timestamp (in seconds) where the clip starts in the source video. | | `endTimestamp` | `number` | Timestamp (in seconds) where the clip ends in the source video. | | `timestampBoundary` | `object` | Object defining the clipping boundary (see below). | | `timestampBoundary.start` | `number` | Start boundary (in seconds) for clip extraction. | | `timestampBoundary.end` | `number` | End boundary (in seconds) for clip extraction. | | `aspectRatio` | `string` | Aspect ratio of the clip, e.g., `"16:9"` or `"9:16"`. | | `renderedUrl` | `string` | Public preview video URL. Use `/render` for a finalized export after changes. | | `rawUrl` | `string` | Raw clip URL when available. | | `thumbnailURL` | `string` | URL to the thumbnail image for the clip. | | `viralityScore` | `number` | Numerical score indicating the clip's predicted virality potential. | Save edited clip fields before rendering Create a finalized clip export # Trigger Template Source: https://docs.overlap.ai/api-reference/trigger POST https://api.joinoverlap.com/trigger-template Start a clipping workflow from a saved template using a long-form video URL ### Endpoint ```http theme={null} POST https://api.joinoverlap.com/trigger-template ``` Use this endpoint to launch an Overlap clipping workflow from an existing template. Find `workflowId` in the workflow URL: `https://portal.overlap.ai/workflows/{workflowId}/trigger`. ### Authentication ```http theme={null} Authorization: Bearer YOUR_API_KEY Content-Type: application/json Overlap-Workflow-Channel: stable ``` Generate an API key from the workflow trigger screen in the Overlap portal. `Overlap-Workflow-Channel` is optional; omit it to use the current workflow runtime. ## Request Body Required fields are `companyId`, `workflowId`, and `url`. Every other field is optional and overrides the saved template only for this run. ```json theme={null} { "companyId": "your-company-id", "workflowId": "your-workflow-id", "url": "https://example.com/source-video.mp4", "broll": true, "subtitles": true, "promptAdjustment": "Prioritize clips about product announcements.", "pinnedTimestamps": [{ "start": 120, "end": 165 }], "pinnedTimestampsOnly": false, "pinnedTimestampMode": "search_within" } ``` ### Fields | Field | Type | Required | Description | | ------------------------------------- | --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `companyId` | string | Yes | Your Overlap company or organization identifier. | | `workflowId` | string | Yes | The workflow/template identifier to launch. | | `url` | string | Yes | Publicly accessible long-form video URL to process. | | `orientation` | string | No | Override output orientation, such as `horizontal` or `vertical`. | | `minLengthTarget` / `maxLengthTarget` | number | No | Override clip duration bounds in seconds. | | `broll` | boolean | No | Enable or disable automatic b-roll for this run. | | `subtitles` | boolean | No | Enable or disable subtitles for this run. | | `subtitleConfig` | object | No | Override subtitle styling when the workflow includes a subtitle node. | | `titleOverlay` | boolean | No | Enable or disable the title overlay when the workflow includes a title overlay node. | | `titleConfig` | object | No | Override title overlay prompt and styling. To set fixed title text instead of an AI-generated title, include `generateTitle: false` along with `text` (see [Node Config](/api-reference/node-config-overrides)). | | `watermarkUrl` | string | No | Override the watermark asset URL. | | `keywords` | string\[] | No | Transcription enrichment keywords. Maximum 150. | | `promptAdjustment` | string | No | Text appended to the workflow's clipping prompt. | | `pinnedTimestamps` | object\[] | No | Source-video timestamp ranges to include as clips for this run. | | `pinnedTimestampsOnly` | boolean | No | When `true`, return only the clips from `pinnedTimestamps`; defaults to also discovering clips. | | `pinnedTimestampMode` | string | No | Use `search_within` to find individual clips only inside `pinnedTimestamps`; omit it for guaranteed timestamp clips. | | `nodeConfigs` | object | No | Advanced node-level overrides keyed by workflow node type. | ## Workflow Runtime Channel By default, requests run on the current workflow service. To use the pinned stable service for a run, add: ```http theme={null} Overlap-Workflow-Channel: stable ``` Only `current` and `stable` are accepted. Any other value returns `INVALID_WORKFLOW_CHANNEL` without storing or dispatching the run. The response echoes the applied channel in the same header. The channel is routing metadata and is not passed to workflow nodes as input. See channel behavior, complete request examples, responses, and errors ## Google Drive Source URLs You can use a Google Drive video as the `url` value when triggering a workflow. Before sending the request, verify both of these requirements: 1. Use a direct Google Drive **file** link. The URL should include `/file/`, for example `https://drive.google.com/file/d/FILE_ID/view?usp=sharing`. Folder links, preview links, and other Drive URLs that do not include `/file/` are not supported source-file links. 2. Make the file accessible to Overlap. Either set the file to public access, or share it directly with the Overlap service account: `firebase-adminsdk-pnxcn@rizeo-40249.iam.gserviceaccount.com`. If the Drive file is private and is not shared with that service account, the workflow may trigger successfully but fail when Overlap tries to download the source video. ## Override Behavior Overrides only apply when the referenced workflow contains the matching node. For example, `subtitleConfig` is ignored if the workflow does not include a subtitles node. For advanced integrations, use `nodeConfigs`, `nodeConfigOverrides`, or `actionConfigs` to update action node configuration directly. Supported node keys include `find_clips`, `convert_to_vertical`, `style_video`, `add_broll`, `add_music`, and other workflow action nodes. If a workflow contains the target node but the override shape is invalid, the request returns an `INVALID_NODE_CONFIG` error. See frontend-configurable override fields and per-node examples ```javascript javascript theme={null} // Node.js (using fetch) const apiUrl = "https://api.joinoverlap.com/trigger-template"; const headers = { "Content-Type": "application/json", "Authorization": `Bearer ${process.env.OVERLAP_API_KEY}`, "Overlap-Workflow-Channel": "stable" }; const payload = { companyId: process.env.OVERLAP_COMPANY_ID, workflowId: process.env.OVERLAP_WORKFLOW_ID, url: "https://example.com/source-video.mp4", broll: true }; fetch(apiUrl, { method: "POST", headers, body: JSON.stringify(payload) }) .then(res => res.json()) .then(data => console.log(data)) .catch(err => console.error(err)); ``` ```python python theme={null} import requests import os api_url = "https://api.joinoverlap.com/trigger-template" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {os.environ['OVERLAP_API_KEY']}", "Overlap-Workflow-Channel": "stable" } payload = { "companyId": os.environ["OVERLAP_COMPANY_ID"], "workflowId": os.environ["OVERLAP_WORKFLOW_ID"], "url": "https://example.com/source-video.mp4", "broll": True } response = requests.post(api_url, json=payload, headers=headers) print(response.json()) ``` ```bash cURL theme={null} curl -X POST "https://api.joinoverlap.com/trigger-template" \ -H "Authorization: Bearer $OVERLAP_API_KEY" \ -H "Content-Type: application/json" \ -H "Overlap-Workflow-Channel: stable" \ -d '{ "companyId": "'"$OVERLAP_COMPANY_ID"'", "workflowId": "'"$OVERLAP_WORKFLOW_ID"'", "url": "https://example.com/source-video.mp4", "broll": true }' ``` ## Response ```json theme={null} { "triggerId": "c1a27b63-91d9-45fb-9c89-5f418442fb6e", "status": "pending", "message": "Workflow trigger initiated successfully" } ``` * `triggerId` - Save this value and poll `GET /workflow-results/{triggerId}`. * `status` - Usually `pending` immediately after triggering. * `message` - Human-readable confirmation or context. The `Overlap-Workflow-Channel` response header reports `current` or `stable`, matching the runtime selected for the run. ## Processing Time * Horizontal clips: about 3 minutes per hour of input video. * Vertical clips: about 10 minutes per hour of input video. * Actual runtime varies by workflow configuration, video length, and video complexity. Poll for status and retrieve generated clips with your triggerId # Update Clip Source: https://docs.overlap.ai/api-reference/update-clip POST https://api.joinoverlap.com/update-clip Save editable clip fields before rendering a finalized export ### Endpoint ```http theme={null} POST https://api.joinoverlap.com/update-clip ``` Use this endpoint after a user reviews or edits a clip. It updates the saved clip document only; it does not render a new video. ### Authentication ```http theme={null} Authorization: Bearer YOUR_API_KEY Content-Type: application/json ``` ## Request Body ```json theme={null} { "companyId": "your-company-id", "clipId": "clip-id-from-results", "updates": { "title": "Product Launch Highlights", "bio": "Key moments from the product launch webinar.", "subtitleConfig": { "subtitleY": 50 } }, "merge": true } ``` Send editable fields inside `updates`. For convenience, editable fields can also be sent at the top level beside `companyId` and `clipId`. When `merge` is `true` or omitted, nested config objects such as `subtitleConfig` and `titleConfig` are shallow-merged with the existing clip config. Set `merge` to `false` only when you want to replace those nested objects. ## Editable Fields | Field | Type | Description | | ----------------------------------- | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `title` | string | Clip title. | | `bio` | string | Clip description. | | `keywords` | string\[] | Clip keywords. | | `people` | string\[] | People or speakers associated with the clip. | | `segments` | Segment\[] | Keep-ranges that trim the clip, in **clip-relative seconds** (0 = the clip's start, not the source/episode timeline). Each entry is `{ "startSeconds": number, "endSeconds": number }` (`start`/`end` accepted as aliases). Example: `[{ "startSeconds": 12.5, "endSeconds": 94 }]` drops the first 12.5 seconds. Send `[]` to clear the trim. Values must satisfy `0 ≤ startSeconds < endSeconds ≤ clip duration`, and ranges must not overlap — out-of-range or malformed values are rejected with `400 INVALID_CLIP_UPDATE`. `duration` is kept in sync automatically. After patching, call render to produce the trimmed video. | | `duration` | number | Clip duration in seconds. | | `startTimestamp` / `endTimestamp` | number | Source video timestamps. | | `timestampBoundary` | TimestampBoundary | Clip extraction boundary. | | `subtitleConfig` | SubtitleConfig | Subtitle rendering configuration. | | `titleConfig` | TitleConfig | Title overlay configuration. | | `watermarkConfig` | WatermarkConfig | Single watermark configuration. | | `backgroundMusicOption` | BackgroundMusicOption | Background music configuration. | | `endCardOption` / `end_card_option` | EndCardOption | End card configuration. | Unsupported fields return `UNSUPPORTED_CLIP_FIELDS`. ## Field Shapes ### Segment ```json theme={null} { "start": 12.4, "end": 36.8, "playbackRate": 1 } ``` | Field | Type | Description | | -------------- | ------ | ----------------------------------------- | | `start` | number | Segment start time in source seconds. | | `end` | number | Segment end time in source seconds. | | `playbackRate` | number | Optional playback speed for this segment. | ### TimestampBoundary ```json theme={null} { "start": 10, "end": 45 } ``` | Field | Type | Description | | ------- | ------ | --------------------------------- | | `start` | number | Start boundary in source seconds. | | `end` | number | End boundary in source seconds. | ### SubtitleConfig `subtitleConfig` follows the frontend subtitle style schema. You can update the base subtitle style and optional per-speaker styles. ```json theme={null} { "fontColor": "#FFFFFF", "fontFamily": "Forma-DJR", "fontSize": "42", "fontWeight": "900", "backgroundColor": "transparent", "backgroundOpacity": 0, "maxCharsPerLine": 30, "subtitleX": 50, "subtitleY": 50, "speakerStyles": { "0": { "subtitleY": 50 } } } ``` Common fields include `fontColor`, `fontFamily`, `fontSize`, `fontWeight`, `backgroundColor`, `backgroundOpacity`, `backgroundFillStyle`, `backgroundPadding`, `captionPosition`, `textAlign`, `outlineColor`, `outlineWidth`, `shadowColor`, `shadowBlur`, `shadowEnabled`, `textCase`, `maxCharsPerLine`, `subtitleX`, `subtitleY`, and `speakerStyles`. `speakerStyles["0"]` represents the first speaker in the video. ### TitleConfig `titleConfig` controls generated or explicit title overlay styling. ```json theme={null} { "text": "Product Launch Highlights", "prompt": "Create a concise title for this clip", "fontFamily": "Roboto", "fontWeight": "500", "fontColor": "#000000", "fontSize": 64, "backgroundColor": "#FFFFFF", "backgroundOpacity": 1, "backgroundStyle": "wrap", "textAlign": "center", "yPosition": 0.23, "duration": 4, "allCaps": false } ``` Common fields include `text`, `prompt`, `fontFamily`, `fontUrl`, `fontWeight`, `fontColor`, `fontSize`, `lineHeight`, `characterSpacing`, `padding`, `verticalPadding`, `borderRadius`, `backgroundColor`, `backgroundOpacity`, `textShadow`, `boxShadow`, `xPosition`, `yPosition`, `positionDynamically`, `avoidFaces`, `maxWidthPercent`, `targetHeightPercent`, `duration`, `fadeDuration`, `allCaps`, `backgroundStyle`, `textAlign`, `fontScale`, and `lineMargin`. ### WatermarkConfig | Field | Type | Description | | ------------------- | ------- | --------------------------------------------------------------------- | | `enabled` | boolean | Shows or hides the watermark. | | `url` | string | Public watermark image URL. | | `position` | number | Grid position used by the renderer. | | `size` | number | Watermark size. | | `padding` | number | Padding from the frame edge. | | `opacity` | number | Watermark opacity from `0` to `1`. | | `x` / `y` | number | Optional custom position as a percentage of video width/height. | | `startOffset` | number | Seconds after the clip starts before the watermark appears. | | `endOffset` | number | Seconds before the clip ends when the watermark disappears. | | `animationDuration` | number | Intro/outro transition duration in seconds. | | `introTransitionId` | string | Optional intro transition preset ID, such as `fade` or `slideInLeft`. | | `outroTransitionId` | string | Optional outro transition preset ID, such as `fade` or `zoomOut`. | ### BackgroundMusicOption | Field | Type | Description | | -------------- | ------ | ----------------------------- | | `id` | string | Music asset identifier. | | `name` | string | Display name. | | `url` | string | Public audio URL. | | `thumbnailUrl` | string | Optional music thumbnail URL. | | `duration` | number | Track duration in seconds. | | `volume` | number | Volume from `0` to `1`. | ### EndCardOption | Field | Type | Description | | ------------------ | ------- | -------------------------------------------------- | | `url` | string | Public image or video URL for the end card. | | `duration` | number | End card duration in seconds. | | `secondsBeforeEnd` | number | When the end card starts relative to the clip end. | | `isVideo` | boolean | Whether the end card asset is a video. | | `opacity` | number | End card opacity from `0` to `1`. | | `videoDuration` | number | Source duration for video end cards. | | `volume` | number | Volume for video end cards. | ```javascript javascript theme={null} const response = await fetch("https://api.joinoverlap.com/update-clip", { method: "POST", headers: { "Authorization": `Bearer ${process.env.OVERLAP_API_KEY}`, "Content-Type": "application/json" }, body: JSON.stringify({ companyId: process.env.OVERLAP_COMPANY_ID, clipId: "clip-id-from-results", updates: { title: "Product Launch Highlights", subtitleConfig: { subtitleY: 50 } } }) }); const data = await response.json(); ``` ```bash cURL theme={null} curl -X POST "https://api.joinoverlap.com/update-clip" \ -H "Authorization: Bearer $OVERLAP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "companyId": "'"$OVERLAP_COMPANY_ID"'", "clipId": "clip-id-from-results", "updates": { "title": "Product Launch Highlights", "subtitleConfig": { "subtitleY": 50 } } }' ``` ## Response ```json theme={null} { "clipId": "clip-id-from-results", "status": "success", "updatedFields": ["title", "subtitleConfig"], "updates": { "title": "Product Launch Highlights", "subtitleConfig": { "subtitleY": 50 } } } ``` Render the updated clip into a finalized export # Workflow Runtime Channels Source: https://docs.overlap.ai/api-reference/workflow-runtime-channels Choose the current or pinned stable workflow runtime for an API-triggered run Workflow runtime channels let an integration choose which deployed workflow service executes a triggered run. The channel is transport-level routing metadata, so it is supplied as an HTTP header rather than as part of the workflow input. ## Available Channels | Channel | Behavior | | --------- | ---------------------------------------------------------------------------------- | | `current` | Uses the current workflow service. This is the default when the header is omitted. | | `stable` | Uses the most recent stable, major release service. | To select the stable channel: ```http theme={null} Overlap-Workflow-Channel: stable ``` Only the exact values `current` and `stable` are accepted. ## Trigger a Stable Run Add the channel header to `POST /trigger-template`. The JSON request body does not change. ```javascript javascript theme={null} const response = await fetch("https://api.joinoverlap.com/trigger-template", { method: "POST", headers: { "Authorization": `Bearer ${process.env.OVERLAP_API_KEY}`, "Content-Type": "application/json", "Overlap-Workflow-Channel": "stable" }, body: JSON.stringify({ companyId: process.env.OVERLAP_COMPANY_ID, workflowId: process.env.OVERLAP_WORKFLOW_ID, url: "https://example.com/source-video.mp4" }) }); console.log(response.headers.get("Overlap-Workflow-Channel")); console.log(await response.json()); ``` ```python python theme={null} import os import requests response = requests.post( "https://api.joinoverlap.com/trigger-template", headers={ "Authorization": f"Bearer {os.environ['OVERLAP_API_KEY']}", "Overlap-Workflow-Channel": "stable", }, json={ "companyId": os.environ["OVERLAP_COMPANY_ID"], "workflowId": os.environ["OVERLAP_WORKFLOW_ID"], "url": "https://example.com/source-video.mp4", }, ) print(response.headers["Overlap-Workflow-Channel"]) print(response.json()) ``` ```bash cURL theme={null} curl -X POST "https://api.joinoverlap.com/trigger-template" \ -H "Authorization: Bearer $OVERLAP_API_KEY" \ -H "Content-Type: application/json" \ -H "Overlap-Workflow-Channel: stable" \ -d '{ "companyId": "'"$OVERLAP_COMPANY_ID"'", "workflowId": "'"$OVERLAP_WORKFLOW_ID"'", "url": "https://example.com/source-video.mp4" }' ``` ## Response The response body retains the normal trigger contract: ```json theme={null} { "triggerId": "trigger_20260728123456_ab12cd34", "status": "pending", "message": "Workflow trigger initiated successfully" } ``` The response header reports the channel applied to the run: ```http theme={null} Overlap-Workflow-Channel: stable ``` The selected channel is stored with the trigger. You do not need to resend the channel header when polling `GET /workflow-results/{triggerId}`. ## Invalid Channels An unsupported or empty channel returns `400 Bad Request`. The run is not stored or dispatched. ```json theme={null} { "error": "Overlap-Workflow-Channel must be either 'current' or 'stable'", "status": "error", "code": "INVALID_WORKFLOW_CHANNEL" } ``` Do not send `workflowChannel` in the JSON body. Body fields are reserved for workflow input and per-run configuration; use the `Overlap-Workflow-Channel` header for routing. # Workflows Source: https://docs.overlap.ai/api-reference/workflows GET https://api.joinoverlap.com/workflows List workflow summaries and retrieve a saved workflow definition ## List Workflows ```http theme={null} GET https://api.joinoverlap.com/workflows?companyId={companyId} ``` Returns workflow summaries for a company. This list intentionally includes only `id`, `name`, and `description`. ### Authentication ```http theme={null} Authorization: Bearer YOUR_API_KEY ``` ### Query Parameters | Parameter | Required | Description | | ----------- | -------- | ------------------------------------------------ | | `companyId` | Yes | Your Overlap company or organization identifier. | The same lookup is also available at `GET /companies/{companyId}/workflows`. ### Response ```json theme={null} { "workflows": [ { "id": "workflow-id", "name": "Webinar Clips", "description": "Finds and formats highlights from webinar recordings." } ] } ``` ## Get Workflow ```http theme={null} GET https://api.joinoverlap.com/workflow?companyId={companyId}&workflowId={workflowId} ``` Returns the saved workflow document, including its nodes and configuration. ### Query Parameters | Parameter | Required | Description | | ------------ | -------- | ------------------------------------------------ | | `companyId` | Yes | Your Overlap company or organization identifier. | | `workflowId` | Yes | The saved workflow id. | The same lookup is also available at `GET /companies/{companyId}/workflows/{workflowId}`. ### Response ```json theme={null} { "workflow": { "id": "workflow-id", "name": "Webinar Clips", "description": "Finds and formats highlights from webinar recordings.", "nodes": [], "edges": [] } } ``` ```javascript javascript theme={null} const listResponse = await fetch( `https://api.joinoverlap.com/workflows?companyId=${process.env.OVERLAP_COMPANY_ID}`, { headers: { "Authorization": `Bearer ${process.env.OVERLAP_API_KEY}` } } ); const workflows = await listResponse.json(); ``` ```bash cURL theme={null} curl "https://api.joinoverlap.com/workflows?companyId=$OVERLAP_COMPANY_ID" \ -H "Authorization: Bearer $OVERLAP_API_KEY" curl "https://api.joinoverlap.com/workflow?companyId=$OVERLAP_COMPANY_ID&workflowId=$OVERLAP_WORKFLOW_ID" \ -H "Authorization: Bearer $OVERLAP_API_KEY" ``` # API Error Codes Source: https://docs.overlap.ai/error-codes ## Overview Overlap API endpoints return structured error responses when a request fails. This page lists common error codes you may receive across all integrations, what they mean, and the typical HTTP status codes/messages. ### Error response shape ```json theme={null} { "errorCode": "INVALID_REQUEST", "message": "Missing request body" } ``` **Notes** * `errorCode` is the stable, programmatic identifier to key off of. * `message` is human-readable and may change slightly over time. * HTTP status codes generally align with the category (4xx client errors, 5xx server errors). *** ## Error Code Reference ### Auth / API Key Missing or invalid `Authorization` header / API key for the endpoint or company.\ **Typical messages:** `"Missing API key"`, `"Invalid API key"`. *** ### Request Validation (Generic) Missing request body or required parameters (varies by endpoint).\ **Typical messages:** `"Missing request body"`, `"Missing companyId parameter"`, `"Missing clipId parameter"`. *** ### URL / Time Validation (Clip Generation) Missing or invalid URL parameter.\ **Typical messages:** `"Missing URL parameter"`. URL appears to be YouTube but fails format validation.\ **Typical messages:** `"Invalid YouTube URL format"`. `minimumTime` / `maximumTime` out of allowed range. Video is shorter than the requested minimum clip length. Couldn’t fetch or compute video length.\ **Typical messages:** contains provider-specific detail about the failure. Team/company doesn’t have enough quota hours to process the request.\ **Typical messages:** includes quota detail in the message. *** ### Task / Workflow Lookup + Authorization Task ID doesn’t exist. Task exists but belongs to a different team/company. Workflow trigger ID not found. *** ### Workflow Validation / Quotas Company hit workflow trigger quota limit. Workflow/company validation failed (validator returns the details).\ **Typical messages:** depends on the specific validation failure. Workflow document not found for the company. *** ### Render Endpoint `/render` missing `companyId`. `/render` missing `clipId`. Too many in-flight render jobs for the company.\ **Typical messages:** `"Render job limit reached..."`. Clip doc not found under `companies/{companyId}/clips/{clipId}`. Rendering returned no URL.\ **Typical messages:** `"Failed to render video..."`. *** ### Analytics Endpoints `/post-analytics` missing `postId`. Post doc not found under `companies/{companyId}/posts/{postId}`. Invalid query parameter combination on `/posts` or `/post-analytics` — e.g. an unsupported `sortBy` value, a non-integer `limit`, or `startDate`/`endDate` combined with a metric sort. `/posts` received a `cursor` that doesn't reference a known post. Cursors come from the previous page's response and shouldn't be constructed by hand. *** ### Playback Helper Playback API returned 200 but no `replayHLSURL`. Playback API returned a non-200 response.\ **Typical messages:** `"Failed to fetch playback data"`. Exception while calling the Playback API.\ **Typical messages:** `"Internal server error"`. *** ### Subtitles Endpoints Clip exists but has no `subtitleConfig`. `subtitleConfig.styleId` exists but isn’t a string. `subtitleConfig` in the request is not a JSON object (dict). Clip not found when fetching or updating subtitles. Failure retrieving/updating subtitle configuration.\ **Typical messages:** `"Failed to retrieve/update subtitle configuration: ..."`. *** ### Server / Processing Failures Unhandled exception in an endpoint.\ **Typical messages:** often the exception string. Exception while processing a workflow trigger request.\ **Typical messages:** `"Failed to process workflow trigger: ..."`. Failure generating an API key.\ **Typical messages:** `"Failed to generate API key: ..."`. *** ## Recommended Client Handling ### Retryable (usually) * `SERVER_ERROR`, `TRIGGER_ERROR`, `INTERNAL_ERROR` * `PLAYBACK_API_ERROR` when the HTTP status is 5xx Use exponential backoff and cap retries. ### Fix request and retry * `INVALID_REQUEST`, `INVALID_URL`, `INVALID_YOUTUBE_URL`, `INVALID_TIME`, `INVALID_SUBTITLE_CONFIG` ### Auth / permissions * `INVALID_API_KEY`, `UNAUTHORIZED_ACCESS` ### Quotas / throttling * `INSUFFICIENT_HOURS`, `WORKFLOW_TRIGGER_LIMIT_REACHED`, `EXCEEDED_RATE_LIMIT` Avoid retries until quota resets or concurrency drops. # Agents Source: https://docs.overlap.ai/essentials/agents > Automated your posting across socials ## What is a posting persona? Think of a **posting persona** as the social media manager you would hire. You give them a personality, calls-to-action, accounts to mention, restrictions, and more. These posting personas become the engine of your social media auto-posting and suggested post copy. You can even add language instructions to control the style or key points of each post. This means you can keep your social channels active and consistent, without manual effort for every post. ## Creating your First Persona To find your personas, go to *Posting Personas* in the left sidebar. Once here, press "Create New Persona" As you'll see, you now have the ability to specify a name, a prompt, target platforms, and more. When drafting your prompt, consider who you would want to hire to be your social media manager: would you want a satirical, Gen-Z college student who specializes in TikTok content, or would you want an industry veteran who focuses on professional, enterprise marketing? After entering a prompt, use **Enhance with AI** to improve it while preserving your original direction. Example Agent Mode toggle icons highlighted in the Mintlify web editor *Click "Generate Avatar" if you wish to generate a headshot for your new social media manager!* ## Previewing your Persona As you're building out your prompt, it's good practice to preview your post content to ensure it aligns with what you want. Click *Preview Content* in the top right to see what your agent would produce for a given clip. If your profile already has clips, then we will take the most recent clip as an example. If your account does *not* have clips, then we will select a boilerplate public Overlap clip to see the example output. We recommend building out a [Clipping Agent](/essentials/workflows) first, so you can generate clips and test on your own content! Nodes The unfurled component menu emphasized in the Mintlify web editor ## # Billing Source: https://docs.overlap.ai/essentials/billing The **Billing and usage** page is where you manage your subscription and keep track of the resources your workspace is using. Billing and usage page ## What you can do here From this page, you can: * Review your current subscription status * See your renewal information * Monitor your `Processing Hours` usage * Monitor how many `Active Workflows` are currently in use * Review and download past receipts * Open plan and pricing information * Cancel your subscription ## Subscription overview The default **Subscription** tab gives you a quick snapshot of your current plan. It includes: * Your current plan name and active status * Renewal details for the plan * A usage bar for `Processing Hours` * A usage bar for `Active Workflows` * Quick actions for plan questions and billing changes ## Receipts Use the **Receipts** tab to review paid invoices from your Overlap subscription and download receipt PDFs. ## Pricing and plan changes The billing page also includes a **Pricing** tab alongside the subscription overview. If you need more capacity, want to compare plans, or need help choosing the right setup for your team, start from this page. # Brand kits Source: https://docs.overlap.ai/essentials/brand-kits > Keep your workspace's reusable creative assets and default brand identity in one place. ## My Brand Open **Brand Kits** from the sidebar, then choose **My Brand**. Use this tab to save the defaults Overlap should use when a workflow or creative tool needs brand context: * **Brand name** * **Favicon** * **Logos** * **Primary logo** * **Description** * **Brand style** * **Brand voice** * **Default font** * **Color palette** * **Motion templates** You can fill these fields manually, upload brand images, choose the primary logo, or import a starting point by entering the company's website domain. When brand data is available, Overlap can populate the brand name, description, favicon, logos, palette, suggested font, brand style, and brand voice. Click **Save** after editing the brand profile so the defaults are available to the workspace. The **Motion** section stores reusable motion graphics saved from chat, such as lower thirds, logo reveals, headline cards, and keyword animations. These templates keep their live `overlap-composite-scene` manifests so future creative tools can reuse the motion design without requiring a source video. ## Brand Assets Use **Brand Assets** for reusable media files such as logos, overlays, prompt documents, and uploaded fonts. Fonts uploaded here are also available in the **My Brand** default font picker. ## B-Roll Libraries Use **B Roll Libraries** for reusable clips and reference media that workflows can draw from when producing new edits. ## Thumbnail Presets A thumbnail preset is a reusable, layered thumbnail template: a background, the speaker (optionally cut out of the frame), a fade, your logo, and headline text. Once saved, a preset can be picked in any [Post to Social](/nodes/post-to-social) node, and Overlap fills it in for every post it schedules — choosing a frame from the clip, cutting out the subject, and writing the headline — so each scheduled post gets its own branded thumbnail. Open **Brand Kits → Thumbnail Presets** to see your presets as cards. **Create New** asks which shape the preset is for — vertical (9:16) for branches that convert to vertical, or landscape (16:9) for branches that stay horizontal — then opens the preset creator, which looks and works like the Thumbnail Editor in Studio. The shape is fixed once the preset is created, so make a separate preset for each format you post in. ### Building a preset * **Frame** — the canvas shows a frame from one of your recent clips (pick another clip from the list, or **Browse library…** for the full picker, then scrub to the frame you want as the sample). The picker opens filtered to the preset's own shape, but any clip works — it is only the sample — so change the **Aspect Ratio** filter to browse the rest. Choose what happens for each post: let AI pick the strongest frame, use a fixed time into the clip, or use the clip's existing thumbnail frame. When you have no clips yet, a placeholder picture stands in. * **Background & subject** — keep the frame as the picture, or place the speaker over a blurred and darkened copy of the frame, a solid colour, or a brand image. Turn on **Cut out the subject** to remove the background around the person so they sit on top of the plate. You can move and scale the cutout like any layer. * **Fade overlay** — add a subtle gradient from any edge so text stays readable. * **Text** — add headings, body text, or any of the rich-text presets. With a text layer selected, choose whether it always says the same thing, is **written by AI from the clip** (give it an instruction, a word limit, a style, and whether it should be ALL CAPS), or shows a clip field such as the title or speaker name. AI text layers can add an **emphasis line** — a second, styled layer for the boxed or highlighted word — and **Generate sample from this clip** shows real output on the sample frame. * **Media & logo** — upload images or pick from Brand Assets, then drag them into place. Layers stack in this order: background, subject, overlays, logo, text. **Save preset** captures the canvas as the card preview and stores the template. Presets have one aspect ratio, chosen when you create them; the Post to Social node only offers the presets matching the shape its route produces, so make a 9:16 preset for branches that convert to vertical and a 16:9 one for branches that stay horizontal. Overlap also provides a few starter presets. They open read-only — use **Duplicate to my Brand Kit** on the card to make an editable copy. ### Editing a generated thumbnail Every post scheduled with a preset stores its own thumbnail. From a post's card on the [Social Calendar](/essentials/social-calendar), use **Edit thumbnail** to open it in the same editor the preset uses — background, subject cut-out, fade and text controls included. Because the thumbnail belongs to the post, the editor also loads the post's actual clip: choose **Change frame** to scrub the footage and pick a different frame. Edits apply to that post only; the clip's own thumbnail is unchanged. # Editing Source: https://docs.overlap.ai/essentials/editing > Open a clip in Studio to refine timing, text, subtitles, and finishing touches before you export or share it. ## Opening Studio There are two common ways to open Studio, depending on whether you are editing an existing clip or starting a brand-new project. ### Option 1: Edit an existing clip Open a clip and click `Edit Clip`. That takes you directly into `Studio`. You will typically do this from the clip detail page after Overlap has already generated or surfaced a clip for review. A good mental model is: * automation and workflows generate or queue the clip * the clip detail page gives you a focused view of the selected clip * `Edit Clip` opens the manual editor for that specific output * `Studio` is where you make the final hands-on changes before exporting or sharing Clip detail page with Edit Clip ### Option 2: Start a video from scratch From the `Home` page, use `New` in the `Projects` section, then choose `Edit a video from scratch`. New menu with Edit a video from scratch That opens a blank project where you can upload a source file and jump straight into editing in Studio. Blank project upload screen ## Understanding the Studio layout Studio brings the clip preview, playback controls, timeline, and editing tools into one screen. Overlap Studio editor The main areas of the editor are: * The top bar, where you can go back, see the clip title, and access `Export` and `Share` * The preview canvas in the center, which shows the current frame of the clip * The `Reframe` control beside the preview for adjusting composition * The `Thumbnail Editor` control beside `Reframe`, which opens a dedicated thumbnail design surface * The playback controls below the preview, including the play button, current time, total duration, speed control, and fit/zoom controls * The timeline at the bottom, where Overlap shows each visual or text layer over time * The right-side tool rail, which opens different editing panels ## Color grading a clip Open `Color` in the right-side tool rail to apply a finishing grade to the current clip. The `Looks` tab compares the current video frame across reusable presets, while `Adjustments` provides grouped Light, Color, and Finishing controls with a live RGB histogram. Drag horizontally across a value to tune exposure, brightness, contrast, highlights, shadows, saturation, vibrance, temperature, tint, fade, vignette, blur, and animated film grain. Changes update the Studio preview immediately and save with the edited clip. The grade affects the base video while subtitles, titles, watermarks, and other authored graphics retain their original colors. ## Editing with the transcript Open `Transcript` in the right-side tool rail to work on the spoken content directly. Studio transcript editor In the current `Transcript Editor`, Overlap shows: * speaker-grouped transcript blocks; click a speaker's name or portrait to identify that speaker across every matching section and every clip made from the same source input, or use the adjacent dropdown to move only the current section to a different speaker track. While either menu is open, the transcript softly previews exactly which sections will be affected. Existing People names and portraits appear automatically when the speaker is already known * markers like `Video start` and `Video end` so you can see what portion of the source is currently inside the clip * a transcript-focused toolbar above the text for quick edit operations This is the fastest place to make content-aware edits because you can work from the words instead of hunting visually through the timeline. ## Highlighting transcript sections To edit a specific moment, highlight the exact word, phrase, sentence, or paragraph you want to change in the transcript. From there, use transcript actions such as: * `Cut from Video` to remove the selected spoken portion from the clip itself * `Mute` to silence the selected section when you want to keep the visuals but remove the audio * `Edit Captions` to change what appears on screen without treating it as a full video cut This distinction matters: * use `Cut from Video` when the pacing or content of the clip should change * use `Mute` when the shot should stay but the audio should drop out * use `Edit Captions` when the video timing is fine and only the on-screen text needs adjustment A practical way to use the transcript editor is: 1. Read through the clip from top to bottom in `Transcript`. 2. Highlight the exact section that feels off. 3. Decide whether the problem is the spoken content, the audio, or only the captions. 4. Apply the corresponding action. 5. Scrub the timeline and preview the result before moving on. ## Working with the timeline The timeline is the fastest way to understand how the clip is assembled over time. In the current studio view, the clip is split into separate tracks such as: * `Rich Text` * `Subtitles` * `Watermark` * `Video` This layered view helps you see what is happening at each moment in the clip. Use the timeline when you want to: * Check when subtitle segments begin and end * See how long a text overlay remains on screen * Confirm whether the watermark spans the full clip * Scrub through the video before exporting * Jump back to the saved thumbnail frame from the thumbnail marker In the normal timeline editor, click a video segment to select it. Use `Command+C` and `Command+V` on Mac, or `Ctrl+C` and `Ctrl+V` on Windows, to copy and paste the segment after the selected position. Use `Command+D` or `Ctrl+D` to duplicate the selected segment in one step. These shortcuts are scoped to the timeline and are not available in Reframe editing mode. The ruler across the top of the timeline shows time markers in seconds, which makes it easier to inspect short-form clips precisely. The saved thumbnail frame appears on the ruler as a small black-and-white marker. Hover the marker to see `Thumbnail`, or click it to scrub the preview back to that frame. ## Designing the clip thumbnail By default, Overlap uses the first frame as the clip thumbnail. To create a designed cover, scrub to the frame you want and click `Thumbnail Editor` beside `Reframe`. The thumbnail editor starts from the clip exactly as it appears at that frame. Inside it, you can: * scrub to a different frame * add and style text with the Studio text presets * upload an image or choose one from the company media library * move, resize, replace, or delete thumbnail layers * remove clip overlays such as subtitles, titles, watermarks, and b-roll from the thumbnail without removing them from the video * adjust exposure, contrast, saturation, vibrance, warmth, and tint Click `Save thumbnail` when the design is ready. Overlap composites the selected frame and thumbnail-only layers at the clip's full output resolution, saves the result as the clip thumbnail, and keeps the editable design so it reopens on the same frame with the same layers and colour settings. Thumbnail edits are independent from the video timeline. Removing or restyling a layer in the thumbnail editor does not change the clip itself, and later Studio saves do not replace a designed thumbnail automatically. You can also open the same editor from a scheduled clip in [`Social Calendar`](/essentials/social-calendar): open the post and click `Design` in its cover controls. ### Creating a thumbnail in chat The editing agent can create a polished thumbnail from the current clip, uploaded PNG/JPEG/WebP images, or a mix of both. Ask it to create a thumbnail and describe the headline, subject, and visual direction you want. It samples candidate moments from the clip, uses the company colors, fonts, voice, and logos saved under **Brand Kits → My Brand**, and returns the generated image in chat. You can also request square or vertical artwork when the destination is not a standard 16:9 thumbnail. Clip sampling compares nine moments in a 3×3 grid. It renders the actual video with the clip's reframe crop applied and defaults to clean video-only frames. Ask to include the existing title, subtitle, and graphic layers when you want the full clip composition represented in those samples. Continue in the same conversation to revise the result. Feedback such as “make the headline larger,” “use the other speaker,” “remove the logo,” or “go back to the first version” creates a new version without overwriting the earlier image. Generated and revised thumbnails are never saved to the clip automatically. Review any draft, then click **Apply to Clip** on that thumbnail to save it as the clip thumbnail. You can also explicitly ask the agent to apply a specific version. Each successful generation appears in chat immediately. If visual review calls for another pass, the previous draft stays visible while the next aspect-ratio-matched placeholder renders, and up to three successful attempts are shown together in a wrapping grid. Thumbnail text is kept fully inside safe margins; the composition can zoom out or reflow when needed to prevent clipped letters. The same conversation memory applies to generated files from every editing-agent skill, not just thumbnails. Overlap keeps compact references to earlier images and files with the chat, so follow-up requests such as “move the text up,” “use the latest image,” or “go back to the first version” can resolve the earlier output after a reload. Relevant prior images are shown to the agent again for visual inspection; file metadata and stable references remain available without storing image bytes or private provider responses in the conversation. When the editing agent needs a clip before it can continue, chat shows a compact clip chooser above the message box. Select an existing clip from the Library modal, upload a video to ingest it as a clip, or paste an Overlap clip link. Chat sends the selected clip back to the agent and continues the request; no command or placeholder text needs to be typed manually. Local videos stream directly from the browser into the ingestion pipeline in small, acknowledged chunks; the original video is not first copied into Firebase Storage. After normalization, Overlap saves the video as a regular company clip with its duration, dimensions, thumbnail, transcript, and source metadata. Remote HTTP video links use the same normalization contract. When the agent needs a long-form video, chat presents an inline chooser where you can select a saved source, drag or upload a video file, or enter an HTTP(S) video URL. YouTube watch, share, Shorts, embed, and live URLs are downloaded through the same normalizer and returned to chat as an Overlap source clip. For longer videos, ask chat to find highlights or viral moments. Chat first asks whether you want to run Find Clips directly or send the same video through one of your saved workflows. The workflow list is scoped to your organization; selecting one starts that configured workflow, while workflows that can publish externally still require their normal confirmation. Choose **Find clips here** to use the chat selector without a workflow. If your request includes timestamp ranges, the workflow receives them as absolute source seconds. Asking to use exactly those passages marks the ranges as guaranteed-only; asking to find moments within them uses the workflow's search-within timestamp mode. This runtime guidance applies only to that run and does not change the saved workflow. For a general direct search, the editing agent reads every window of the normalized transcript, uses your direction to prioritize moments, and checks representative source frames for the finalists. If you identify one passage with timestamps, it reads that passage plus nearby context instead of rescanning the entire recording. Both paths finalize transcript-verified source-time boundaries within exact duration requests such as “45 to 90 seconds” and create the clip records directly. The normalized source video is stored once and reused by every clip in the batch. Each result keeps the source's native aspect ratio and stores its selected source-time ranges in an editable `segments` array. A result may contain one continuous range or multiple ranges that omit an internal digression or form a coherent montage. Montage ranges are stored in intended playback order, so a strong hook found later in the source can play first when the resulting progression still makes conceptual sense. Overlap does not make a trimmed, reframed, or rendered video copy for each result, and you can continue refining those segments later in Studio. The compact Activity indicator appears only when preparation or transcript scanning takes long enough to be useful, and you can expand it for the current phase. Leaving the conversation does not cancel work still running on the editing server. Completed clip records and their shared normalized source remain available when you reopen the chat. When an editing skill fans work out across background agents, each active agent appears immediately in the conversation as its own pill with a distinct icon and color. Select a pill to follow that agent's live milestones and the functions it calls, including which function is still running, which completed or failed, and how long completed calls took. For a Video Motion Graphics pass, parallel semantic scenes appear as numbered scene-agent pills so you can inspect each scene independently while the batch continues. The compact token counter under the conversation reports new, uncached model input plus model output. Cached input is excluded, while reasoning tokens are already included in output and are not added a second time. Hover the counter for the input/output breakdown and an indication when a provider could not return complete usage for an interrupted or direct model call. ## Using the right-side tools The right rail is where you switch between different editing tasks. In the current studio UI, the tool groups are: * `Transcript` * `Subtitles` * `Media` * `Text` * `AI Tools` * `Transitions` A good way to think about them is: * Use `Transcript` and `Subtitles` when the spoken words or on-screen captions need refinement * Use `Media` when you want to work with supporting visual assets * Use `Text` when you want to manage overlays such as headline or supporting copy. For title-style text fields, click `Generate` to create a short AI title. You can optionally prompt the generator with a preferred angle, tone, or emphasis; leave the prompt blank to generate from the clip context and existing title settings * Use `AI Tools` when you want Overlap to apply a broader cleanup or packaging step for you * Use `Transitions` when you want to adjust how the clip moves between visual states ## AI-assisted cleanup and finishing `AI Tools` collects several of the fastest cleanup and packaging actions in one panel. Studio AI tools panel In the current editor, Overlap groups these actions into two sections: * `Transcript Tools` * `Video Edits` Verified options shown in `Transcript Tools` include: * `Filler Words` * `Stutter Words` * `Curse Words` * `Remove Silences` * `Remove Punctuation` * `Keyword Highlights` Verified options shown in `Video Edits` include: * `End Card` * `Intro Music` * `Outro Music` * `Add Speaker Cards` This makes Studio useful for both cleanup and packaging. You can remove distracting speech patterns, tighten pacing, highlight important language, and add finishing elements without leaving the editor. The editing agent's **Video Motion Graphics** skill can generate motion videos for the semantic scenes in the current edit. It grounds one storyboard in the requested creative direction, the edited-timeline transcript, and scene-specific visual evidence, then splits any scene that exceeds the video provider's 15-second limit or the stricter foreground-subject analysis budget before running bounded generation, CPU-only portrait alpha matting, source treatment, and composited-review tasks. Every animation follows one of three speaker-safe composition contracts: it is placed behind a verified foreground subject, constrained to an explicit safe animation area that avoids the speaker, or rendered as an opaque full-screen animation. Transparent overlays require an exact flat `#00FF00` generation background and become transparent WebM files; opaque full-screen scenes remain MP4. Each review uses a request-scoped Studio preview rather than saving temporary timeline items. The first composite review can compare against the source planning sheet; later reviews receive only the newest edited composite. Behind-subject text may be occluded, but the complete message must remain immediately readable without guessing; otherwise the composition changes instead of repeatedly forcing the effect. Reviews use two bounded parallel browser slots so scene generation does not collapse into a single queue, while identical composites cannot repeatedly consume the full timeout after a deterministic Engine-readiness failure. Over-budget overlays must prove a bounded safe animation area before video generation; required behind-subject scenes must be split. The batch lets every scene finish, then publishes all valid scenes together as native Video Overlay timeline items and reports how many were published or skipped. One failed scene no longer cancels its siblings; if none succeeds, or if the edit changed while generation was running, the previously published edit stays unchanged. Video Motion Graphics runs through the chat's live socket session; the retired HTML Motion Graphics approval flow and workflow/headless endpoint are no longer available. Caption identities give captions a designed voice in one step: ask for a quiet lowercase serif (**Editorial Whisper**), tall condensed documentary type (**Condensed Cut**), or a wrapped modern grotesk (**Grounded Grotesk**), then tweak individual fields on top. An identity applies through the same subtitle styling pipeline as manual changes, so it merges with and can be overridden by any existing caption settings. ## A practical editing flow If you are editing a clip manually, a good default flow is: 1. Click `Edit Clip` to open the clip in Studio. 2. Review the preview and scrub the timeline so you understand the current cut. 3. Start in `Transcript` if the issue is driven by the spoken content. 4. Highlight sections to `Cut from Video`, `Mute`, or `Edit Captions` as needed. 5. Check `Subtitles`, `Text`, and `Rich Text` timing so the on-screen messaging still matches the video. 6. Use `AI Tools` for broader cleanup passes such as silence removal or filler-word cleanup. 7. Use `Reframe` if the subject needs better positioning in the final composition. 8. Scrub to the frame you want people to see first, open `Thumbnail Editor`, and save the designed cover. 9. Finish with `Export` or `Share` once the clip looks right. ## How this relates to workflows [`Workflows`](/essentials/workflows) are still where you build repeatable automation for generating clips at scale. `Studio` is where you manually polish a specific output after it has been created. Use workflows when you want the same editing logic to run automatically across incoming content. Use Studio when you want hands-on control over one clip before publishing. # Enterprise organizations Source: https://docs.overlap.ai/essentials/enterprise-organizations The **Organizations** page gives enterprise parent workspaces one place to review and manage every organization in their account. ## Export usage trends Enterprise parent administrators can download a monthly usage trend report for the parent organization and all of its child organizations. To export a report: 1. Open **Enterprise > Organizations**. 2. Select **Export Usage**. 3. Choose how far back the report should go: `30D`, `90D`, `6M`, or `1Y`. 4. Select **Download CSV**. `6M` is selected by default. The report ends at the time it is generated and groups activity into UTC calendar months. | Lookback | Included period | | -------- | ---------------------------------------------------------- | | `30D` | The current UTC calendar day and the previous 29 days. | | `90D` | The current UTC calendar day and the previous 89 days. | | `6M` | The current UTC calendar month and the previous 5 months. | | `1Y` | The current UTC calendar month and the previous 11 months. | The first and current month can be partial. The CSV includes exact period-start and exclusive period-end timestamps, plus a `Partial Month` field, so partial periods are explicit when comparing trends. ## What's included The CSV contains one row for each organization in every represented UTC month. An **All Organizations** subtotal follows each month, and `Row Type` distinguishes organization rows from subtotal rows. | Field | Definition | | ------------------------------- | ------------------------------------------------------------------------------------------------- | | `Lookback` | The selected `30D`, `90D`, `6M`, or `1Y` range. | | `Month (UTC)` | The UTC calendar month for the row. | | `Period Start (UTC)` | The inclusive start of the month's represented period. | | `Period End (UTC, Exclusive)` | The exclusive end of the month's represented period. | | `Partial Month` | Whether the represented period contains only part of that UTC month. | | `Row Type` | Either an individual `Organization` or a `Monthly Enterprise Total`. | | `Organization ID` | The Clerk and Overlap identifier for the organization. Blank on monthly enterprise subtotal rows. | | `Organization Name` | The organization name, or `All Organizations` on a monthly enterprise subtotal row. | | `Workflow Runs` | Workflow runs started during that row's represented monthly period. | | `Processing Hours (Recorded)` | The sum of the recorded `cost` value for those runs, expressed in hours. | | `Processing Minutes (Recorded)` | The same recorded processing total expressed in minutes. | | `Runs Missing Cost` | Runs that did not contain a numeric processing-cost value. | | `Clips Generated` | Clip records created in the organization's clip library during that monthly period. | | `Posts Created` | Post records created in the organization's posts collection during that monthly period. | Recorded processing is a gross run total. A failed or cancelled run can retain its recorded processing value after processing hours are refunded, so this export is an operational usage report rather than a net billing ledger. If `Runs Missing Cost` is greater than zero, those runs are counted in `Workflow Runs` but excluded from the recorded hour and minute totals. Every represented month includes every organization, using zero totals when an organization was inactive. This keeps organization series continuous when building monthly charts or pivot tables. # FAQ Source: https://docs.overlap.ai/essentials/faq Answers to common posting and account health questions. > Start with a sustainable posting rhythm, then scale after the account proves it can handle consistent publishing. ## How Often should I post? For a new account, start with **one post per day** or **one post every other day**. The first goal is to build a reliable publishing history before increasing volume. Once posts are publishing cleanly, analytics are showing impressions, and the account is getting normal distribution, add more posts slowly. A practical starting cadence: | Platform | New account cadence | Scale toward | | --------------- | --------------------------------- | ---------------------------------------------------------------------------- | | TikTok | 1 post per day or every other day | 2-4 posts per day once distribution is steady | | Instagram Reels | 1 Reel per day or every other day | 1-2 Reels per day | | YouTube Shorts | 3-5 Shorts per week or 1 per day | 1-2 Shorts per day | | Facebook Reels | 3-5 Reels per week or 1 per day | 1-2 Reels per day | | LinkedIn | 2-5 posts per week | 1 post per weekday | | X / Twitter | 1-3 posts per day | Multiple posts per day if the account is active and engagement stays healthy | Use [`Social Calendar`](/essentials/social-calendar) to space posts across the week instead of publishing a large batch at once. If a new account jumps from no activity to high-volume posting overnight, platforms may slow distribution while they learn whether the account is trustworthy. What matters more than volume: * staying consistent inside one topic or audience * testing different hooks, formats, and lengths * spacing posts apart instead of stacking them back-to-back * avoiding duplicate videos and repeated captions * staying below each platform's hard posting limits Platform hard limits are not posting targets. Treat the numbers in [`Posting Limits & Best Practices`](/essentials/limits) as safety ceilings, then choose a cadence your audience can actually absorb. ## My TikToks are getting 0 views. Why? When a TikTok has **exactly 0 views**, distribution usually has not started yet. That is different from a video that gets 20, 50, or 100 views and then stops. Exact zero often points to review, processing, account trust, or visibility issues. Check the basics first: 1. Wait up to 24 hours in case TikTok is still reviewing or processing the upload. 2. Confirm the post is public, not saved as a draft or set to private. 3. Check TikTok notifications for account warnings, verification prompts, or posting restrictions. 4. Make sure the connected TikTok account is fully set up and in good standing. 5. Try one simple original test post directly in TikTok. If that also gets 0 views, the issue is probably account-level. Common causes include: * posting too much too soon on a new or inactive account * repeatedly uploading the same clip with only small changes * using clips with visible watermarks from other platforms * copyrighted audio, policy-sensitive footage, or content TikTok holds for review * spammy captions, too many hashtags, or captions that look copied across posts * account restrictions, incomplete account setup, or unusual login behavior * a video that is still processing or failed after upload If this happens, slow the account back down to one original post per day or every other day for a few days. Use a fresh 9:16 video, clear audio, a strong opening frame, and a natural caption with a few relevant hashtags. Avoid deleting and reuploading the same video repeatedly, because that can make the account look less trustworthy. If multiple posts stay at 0 views for more than 48 hours, compare an Overlap-posted video against a manual TikTok upload. If both stay at 0, check the TikTok account directly. If manual uploads get views but Overlap-posted videos do not, contact Overlap support with the affected post URLs and TikTok account name. # YouTube Channels Not Showing Source: https://docs.overlap.ai/essentials/faq/youtube-channels-not-showing Troubleshoot why a YouTube channel is missing during account linking. > If a YouTube channel is missing during linking, start by checking the Google account, channel permissions, and channel visibility. When you connect YouTube to Overlap, Google asks you to choose a Google account and then select the specific YouTube channel that Overlap can post to. If one of your channels does not appear in the selection list, Google is controlling that list. The missing channel is usually tied to the Google account being used, that account's role on the channel, privacy settings, or account restrictions. ## What to check ### 1. Make sure the account has a YouTube channel YouTube posting requires the Google account to have at least one YouTube channel and to be an owner of that channel. If the account does not have a channel yet, open YouTube, click your profile, and choose **Create a Channel**. You can also use YouTube's direct channel creation link: [Create a YouTube channel](http://m.youtube.com/create_channel) ### 2. Confirm owner or admin access The Google account you use during linking must have owner, admin, or manager-level access to the channel. Check your Google Brand Account permissions to confirm the channel appears for the signed-in account: [Check Brand Account permissions](https://myaccount.google.com/brandaccounts) If the channel is not listed there, ask the channel owner to add the Google account as a manager or owner, then try linking again. ### 3. Check channel privacy settings Private or unlisted channel settings can keep the channel or its content from being available through the API. To test visibility, open an incognito browser window and search for the channel. If the channel does not appear in search, Google may also hide it from the account linking flow. Private channels are only visible to the owner and authorized users. Unlisted channels usually require the direct channel URL. ### 4. Review age or region restrictions Channels with age-restricted content or regional restrictions may not appear for every signed-in user or location. Age-restricted channels require the viewer to be signed in with an account that meets YouTube's age requirements. ### 5. Check for deleted or suspended channels If a channel was deleted by its owner or suspended by YouTube, it will not be available through the API. Deleted channels are permanently removed. Suspended channels may become available again only if YouTube lifts the suspension. ## Try linking again After changing permissions or visibility, go back to **Linked Accounts** and repeat the YouTube linking flow. Make sure the browser is signed into the Google account that owns or manages the channel before accepting Google's prompts. If the channel still does not appear, contact support with the Google email used for linking, the expected YouTube channel URL, and a screenshot of the Google channel selection screen. # Posting Limits & Best Practices Source: https://docs.overlap.ai/essentials/limits > Posting too much or at the wrong times can *hurt* your profile. # Consider the time If posting manually, consider the behavior of your audience. If you're based on the east coast of the US, then it would make the most sense to post before bed (7-10PM EST), before work (5-8AM EST), or at lunch time (12-2PM EST). Posts are prioritized in social algorithms based on the initial interaction they receive on the for-you algorithm. Give yourself a better chance by posting at peak times. # TikTok * TikTok does not currently support line breaks in the post text. Included line breaks will be ignored. * 20 videos per day (with a rate limit of 2 videos per minute). This is a hard limit. > ### **Video Limits** * Max video size: 1 GB. * Max Duration: 600 seconds. * Min Duration: 3 seconds. # YouTube YouTube posting requires your YouTube account to have at least one Channel and be an owner on the Channel. To create a YouTube Channel, click on your profile in the YouTube Dashboard and choose “Create a Channel”. You may also use this direct link to create a YouTube Channel: [**http://m.youtube.com/create\_channel**](http://m.youtube.com/create_channel) If your channel does not appear during account linking, see [YouTube Channels Not Showing](/essentials/faq/youtube-channels-not-showing). * Max video size: 4 GB. * Shorts must be less than 3 minutes The `title` must be 100 characters or less. The `post` must be 5,000 characters or less. The `post` and `title` may contain any characters except \< and >. > ### Video Limits: * Depending on a creator’s location, a channel might be able to increase their daily limit by getting access to advanced features. To learn more visit this [**article**](https://notifications.google.com/g/p/ACnX6LbjUElgT-OfRLVjenkpdldv6pIJ5JYGZyPGTdJwRYmo3fXFkfXJsPGnswgns0BjJ6Bjxn2bqpqfBt6gBdkLoqESKA7mqLNllzcR2qnYUJn5KlJN5jPqCWl6DGr58cZEt94mMvxXATN6_PaBR1RYEpNMTYWN). * We recommend limiting videos to a maximum of **6 posts per day on new accounts** or **20 posts per day on old accounts** # Instagram * Must be a Business or Creator Instagram Account connected with a Facebook Page * 30 Reels per connected Facebook Page within any 24-hour period. This is a hard limit. * Maximum 2,200 post characters and up to 30 hashtags. * Meta occasionally has issues processing Facebook Reels for some accounts. Even though an error response may be returned, the Reel might still have been published. If you encounter errors for Facebook Reels, we recommend checking the Reel status. > ### Video Limits * Max video size: 300 MB. * Max Duration: 15 minutes. * Min Duration: 3 seconds. # X / Twitter We recommend upgrading X accounts to premium. Otherwise, X will de-prioritize your videos in their algorithm. * Free users may include up to 280 characters per post * Premium X users may include up to 25,000 characters per post * Maximum of 100 posts per day. We recommend you stay well below this limit and post no more than 20 videos per day > ### Video Limits X videos have a maximum length of 2 minutes and 20 seconds. However, if you have been approved by X to upload longer videos, you can post videos up to 10 minutes in length. # Facebook Posting using the Facebook API requires connecting a Facebook Page. Facebook does not allow personal accounts to be connected. * 25 Posts per connected Facebook Page within any 24-hour period. This is a hard limit. > ### Video Limits * Max video size: 2 GB. * Min Duration: 3 seconds * Max Duration: 4 hours. # LinkedIn * The `post` field accepts up to 3,000 characters. * LinkedIn limits 150 posts per day per LinkedIn account. This is a hard limit. * LinkedIn must be reauthorized *every year* via the Social Accounts page. > ### Video Limits * Max video size: 200 MB * Max Duration: 30 minutes. * Min Duration: 3 seconds. # Linking Source: https://docs.overlap.ai/essentials/linking > Link your socials to setup posting from your dashboard Mintlify Web Editor interface in dark mode Postinglink Pn To link your account, press on *Linked Accounts* in the left sidebar and select the desired platform. You will be rerouted to a third party account linking service and once your account is linked, you may return to this page. You can also start onboarding from chat. When the assistant asks you to link social accounts, use the platform buttons above the chat input to open the same account-linking flow. You can choose *Skip for now* or tell the assistant to skip, and onboarding will continue without linked accounts. If linking an Instagram account, it must be a business or creator account and linked to a Facebook page. If your YouTube channel does not appear during the Google account selection step, see [YouTube Channels Not Showing](/essentials/faq/youtube-channels-not-showing). # Livestreams Source: https://docs.overlap.ai/essentials/livestreams Ingest an RTMP broadcast or public HLS live URL, record it in chunks, and trigger workflows automatically. > Use `Livestreams` when your content arrives as a live RTMP broadcast or a public HLS live URL and you want tracked sessions, a timeline, replays, and automatic workflow outputs. ## What Livestreams is for Open **Livestreams** from the left sidebar, under **Media**, to manage RTMP and HLS sources that feed your workflows. Choose **RTMP push** when you control an encoder such as OBS. Choose **HLS URL** when a provider already exposes a public live playlist and you want Overlap to pull it continuously. The [Audio Livestream](/nodes/audio) trigger remains the simpler choice for an audio URL that does not need the Livestream Tracker's episode and timeline experience. Livestreams page with a configured livestream ## How it works Each livestream you create has three parts: * **Input** — either an RTMP server/key or a public HLS live URL * **Ingestion interval** — how often the incoming stream is cut into a recorded chunk, from every 5 minutes up to every hour * **Workflows to trigger** — one or more workflows that run automatically on every chunk While an RTMP encoder is publishing or an HLS listening policy is active, Overlap records the stream continuously and, at the end of each interval, uploads the finished chunk and triggers every workflow you selected with that chunk as the input. RTMP follows the encoder connection; HLS can remain On, stop at a deadline, follow a recurring schedule, or remain Off. ### Schema * **Input**: An RTMP publish or public HTTP(S) HLS live playlist * **Output**: One recorded MP4 per ingestion interval, sent into each selected workflow as its trigger input. Audio-only inputs are normalized to H.264/AAC ## Create a livestream Open **New Livestream**, then choose **RTMP push** or **HLS URL** to open the setup dialog with that input type selected. New Livestream dialog Fill in: * **Input type** — choose **RTMP push** or **HLS URL** * **HLS source URL** — required for HLS. Public URLs, embedded Basic Auth, and fixed query-string tokens are supported. The full URL is stored server-side; the portal shows only its hostname * **Start listening** — HLS only; create the source as On, On Until, Scheduled For, or Off. Scheduled For can be configured before the livestream is created * **Name** — a label to identify this livestream, such as `Morning Show` * **Workflows to run in the background** — check every workflow that should run on each chunk. Only workflows that contain a trigger node are listed. Livestreams automatically use the first trigger node in the workflow * **Ingestion interval** — under **Advanced settings**, how long each recorded chunk should be. Shorter intervals get content into your workflows faster; longer intervals mean fewer, longer chunks. Defaults to 5 minutes if you leave it collapsed Click **Create Livestream** when you're done. RTMP sources receive a unique server URL and stream key. HLS sources begin in the listening mode you selected. ## Connect an RTMP encoder Once a livestream is created, its card shows the **Server URL** and a masked **Stream Key**, each with its own copy button. Click the eye icon to reveal the key before copying it. In your broadcasting software, set: * **Server** (sometimes called **Stream URL**) to the livestream's Server URL * **Stream Key** to the livestream's Stream Key For example, in OBS this is under **Settings → Stream → Service: Custom...**. Once you start streaming from your encoder, the livestream's status switches to `Live`, and it switches back to `Idle` when the encoder disconnects. Anyone with the stream key can publish to that livestream. Treat it like a password — use **Regenerate Key** from the card's menu if it's ever exposed, and update your encoder with the new key afterward. ## Connect an HLS source For an HLS livestream, paste its public HTTP(S) live playlist URL during creation. Overlap shows the sanitized source hostname and a connection status: `Connecting`, `Connected`, or `Unavailable`. To rotate a fixed token or change providers, open **Settings**, enter a replacement URL, and save. Leaving the replacement field blank keeps the current URL. Switching input type or replacing an active URL closes the current episode and starts a new one when the new source connects. Audio-only radio playlists that use packed AAC segments are supported and follow the same listening controls and tracker behavior. If the card reports an upstream HTTP status such as `404`, the root playlist or one of the playlists, renditions, or segments it references is unavailable. Replace it with a working live playlist URL; Overlap validates every nested HLS resource rather than treating a reachable master playlist as a connected feed. ### Control when HLS listens Open the HLS card's `⋮` menu and choose **Listening**: * **On** listens continuously * **On Until** starts now and turns Off at the date and time you choose * **Scheduled For** listens during one-time, daily, weekly, or monthly windows * **Off** disconnects without deleting the source URL, schedule, episodes, or outputs Scheduled For supports a timezone, one-time windows, start and optional end dates for recurring rules, repeat intervals, weekly day selection, monthly day or ordinal-weekday selection, multiple daily time windows, and windows that run past midnight. Start and end times can be entered to the exact minute. A completed one-time window remains saved and shows **Schedule ended**. Moving to On, On Until, or Off keeps the recurring schedule so it can be resumed later. Changes normally apply within 30 seconds; the card shows **Pending** until the ingest service has applied a manual change. Each later reconnect begins a new tracked episode, while a stop still processes MediaMTX's final partial chunk. HLS v1 does not support VOD playlists, custom request headers, cookies, or tokens that must be refreshed. It supports public URLs, embedded Basic Auth, and fixed query-string tokens. Source URLs must resolve only to public internet addresses. ## Audio-only sessions Audio-only RTMP and HLS feeds are detected automatically. The tracker presents an audio-focused player and thumbnail while keeping the same episode timeline, replays, clips, and workflow outputs. Recorded chunks are normalized to a black 1280×720 H.264/AAC MP4, so existing workflows run normally; `mediaKind` remains attached to the session as provenance. ## Managing a livestream Use the `⋮` menu on a livestream's card to: * **Edit** — change the name, ingestion interval, or selected workflows * **Listening** — HLS only; choose On, On Until, Scheduled For, or Off * **Disable** / **Enable** — RTMP only; reject new publishes without deleting the livestream or losing its configuration * **Regenerate key** — RTMP only; issue a new stream key and invalidate the old one immediately * **Source details** — HLS only; view the hostname and current connection status without exposing the complete URL * **Delete** — remove the livestream and its stream key permanently ## How this fits with workflows `Livestreams` doesn't add node-level skips to the workflow builder — it drives whatever trigger node your workflow already starts with, the same way a manual upload or another trigger would. Audio-only chunks arrive as normalized black-screen video, so the configured workflow and its existing safeguards run normally. Build the rest of the workflow as described in [Workflows](/essentials/workflows) and [Nodes](/nodes/overview). # Prompting for Clips Source: https://docs.overlap.ai/essentials/prompting > English isn't an LLMs first language ## Choose a Format Structure When writing your prompt, you can structure your text in different ways to help the LLM interpret it. We *strongly* recommend choosing to use either **Markdown** or **XML** structure. **Markdown** is a lightweight markup language that you can use to add formatting elements to plaintext text documents. [You can learn how to use Markdown here](https://www.markdownguide.org/basic-syntax/). XML is a different, more complex markup language designed to store and transport data in a structured format, commonly used by engineers. [You learn how to use XML for prompting here.](https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/use-xml-tags) We recommend Markdown for simplicity. ## (1) Assign a Identity Clearly define the AI’s role and the target channel identity before prompting, providing context and mentioning tone ```markdown theme={null} ## Overview You are an AI content editor for **GaryVee YouTube channel** dedicated to helping entrepreneurs, creators, and marketers master the art of digital growth. The channel delivers high-value insights on topics such as content strategy, brand storytelling, SEO, paid media, and audience development. Your mission is to identify **short-form vertical video moments** from long-form content that are **insightful, actionable, and attention-grabbing**—the kind of clips that stop the scroll and provide immediate value on platforms like TikTok, Instagram Reels, and YouTube Shorts. ``` ``` You are an AI content editor for the GaryVee YouTube channel dedicated to helping entrepreneurs, creators, and marketers master the art of digital growth. The channel delivers high-value insights on topics such as content strategy, brand storytelling, SEO, paid media, and audience development. ``` ```markdown theme={null} Overview You are an AI content editor for GaryVee YouTube channel dedicated to helping entrepreneurs, creators, and marketers master the art of digital growth. The channel delivers high-value insights on topics such as content strategy, brand storytelling, SEO, paid media, and audience development. ``` ## (2) Add Context Including information that is constant throughout the show will help the agent decipher good vs. bad content. Here you can add information about the hosts, topics that will always do well, or clips to stay aware from. ```markdown theme={null} ### Context: Who is GaryVee and What is the Channel? GaryVee (Gary Vaynerchuk) is a serial entrepreneur, author, and motivational speaker known for his expertise in digital marketing, social media, and personal branding. His YouTube channel focuses on providing practical advice, inspiration, and strategies to entrepreneurs, creators, and marketers looking to grow their businesses and personal brands in the digital age. The channel features a mix of keynote speeches, interviews, behind-the-scenes content, and day-in-the-life videos that emphasize hustle, mindset, and actionable marketing tactics. ``` ``` GaryVee (Gary Vaynerchuk) is a serial entrepreneur, author, and motivational speaker known for his expertise in digital marketing, social media, and personal branding. His YouTube channel focuses on providing practical advice, inspiration, and strategies to entrepreneurs, creators, and marketers looking to grow their businesses and personal brands in the digital age. The channel features a mix of keynote speeches, interviews, behind-the-scenes content, and day-in-the-life videos that emphasize hustle, mindset, and actionable marketing tactics. ``` ```markdown theme={null} Context: Who is GaryVee and What is the Channel? GaryVee (Gary Vaynerchuk) is a serial entrepreneur, author, and motivational speaker known for his expertise in digital marketing, social media, and personal branding. His YouTube channel focuses on providing practical advice, inspiration, and strategies to entrepreneurs, creators, and marketers looking to grow their businesses and personal brands in the digital age. The channel features a mix of keynote speeches, interviews, behind-the-scenes content, and day-in-the-life videos that emphasize hustle, mindset, and actionable marketing tactics. ``` ## (3) Clearly Define the Goal Explicitly declare the agent's goal and what success looks like ```markdown theme={null} Your task is to identify **short-form video moments** from long-form content that are **insightful, actionable, and attention-grabbing**—the kind of clips that stop the scroll and provide immediate value on platforms like TikTok, Instagram Reels, and YouTube Shorts. ``` ``` Your task is to identify short-form video moments from long-form content that are insightful, actionable, and attention-grabbing—the kind of clips that stop the scroll and provide immediate value on platforms like TikTok, Instagram Reels, and YouTube Shorts. ``` ```markdown theme={null} Your task is to identify short-form video moments from long-form content that are insightful, actionable, and attention-grabbing—the kind of clips that stop the scroll and provide immediate value on platforms like TikTok, Instagram Reels, and YouTube Shorts. ``` ## (4) Provide Rules Constrain the agent's behavior by providing comprehensive rules. Focus on high-level behavior which will elicit proper behavior downstream. For the purpose of finding clips, provide rules that clearly outline what makes a good clip vs. a bad clip. ```markdown theme={null} ## Rules ### Content Guidelines: - **Focus on moments that are:** * Counterintuitive insights that challenge common marketing beliefs * Actionable tips or frameworks that viewers can implement immediately * Engaging stories or case studies that illustrate a marketing principle * Bold statements or hot takes that provoke thought and discussion - **Clips must be self-contained:** * The viewer should grasp the context and takeaway without needing additional information * Avoid clips that rely heavily on prior segments or external references - **Prioritize:** * High-quality audio with clear speech * Content that reflects the channel's commitment to providing valuable marketing insights * Moments that showcase the unique perspectives of the host and guests ### Technical Guidelines: - **NEVER clip:** * Commercials, sponsorships, or ad reads - **Formatting:** * Ensure the clip starts with a strong hook—a question, bold statement, or intriguing fact—to capture attention within the first 3 seconds * End with a clear takeaway or call-to-action that encourages further engagement or reflection ``` ``` insights that challenge common marketing beliefs Actionable tips or frameworks that viewers can implement immediately Engaging stories or case studies that illustrate a marketing principle Bold statements or hot takes that provoke thought and discussion The viewer should grasp the context and takeaway without needing additional information Avoid clips that rely heavily on prior segments or external references High-quality audio with clear speech Content that reflects the channel's commitment to providing valuable marketing insights Moments that showcase the unique perspectives of the host and guests Commercials, sponsorships, or ad reads Ensure the clip starts with a strong hook—a question, bold statement, or intriguing fact—to capture attention within the first 3 seconds End with a clear takeaway or call-to-action that encourages further engagement or reflection ``` ```markdown theme={null} Rules Content Guidelines: - Focus on moments that are: * Counterintuitive insights that challenge common marketing beliefs * Actionable tips or frameworks that viewers can implement immediately * Engaging stories or case studies that illustrate a marketing principle * Bold statements or hot takes that provoke thought and discussion - Clips must be self-contained: * The viewer should grasp the context and takeaway without needing additional information * Avoid clips that rely heavily on prior segments or external references - Prioritize: * High-quality audio with clear speech * Content that reflects the channel's commitment to providing valuable marketing insights * Moments that showcase the unique perspectives of the host and guests Technical Guidelines: - NEVER clip: * Commercials, sponsorships, or ad reads - Formatting: * Ensure the clip starts with a strong hook—a question, bold statement, or intriguing fact—to capture attention within the first 3 seconds * End with a clear takeaway or call-to-action that encourages further engagement or reflection ``` ## (5) Finish with a Reminder Like humans, LLMs tend to have a slight preference towards what comes at the beginning and end of their prompt. So, just as you start with the goal, you should end with it too. ```markdown theme={null} ## Conclusion By adhering to these guidelines, you'll help amplify the channel's reach and impact through engaging short-form content that provides valuable marketing insights to a broader audience. ``` ``` By adhering to these guidelines, you'll help amplify the channel's reach and impact through engaging short-form content that provides valuable marketing insights to a broader audience. ``` ``` By adhering to these guidelines, you'll help amplify the channel's reach and impact through engaging short-form content that provides valuable marketing insights to a broader audience. ``` # Putting it all Together Combine all of the above sections for a singular prompt ```markdown theme={null} ## Overview You are an AI content editor for **GaryVee YouTube channel** dedicated to helping entrepreneurs, creators, and marketers master the art of digital growth. The channel delivers high-value insights on topics such as content strategy, brand storytelling, SEO, paid media, and audience development. Your mission is to identify **short-form vertical video moments** from long-form content that are **insightful, actionable, and attention-grabbing**—the kind of clips that stop the scroll and provide immediate value on platforms like TikTok, Instagram Reels, and YouTube Shorts. --- ### Context: Who is GaryVee and What is the Channel? GaryVee (Gary Vaynerchuk) is a serial entrepreneur, author, and motivational speaker known for his expertise in digital marketing, social media, and personal branding. His YouTube channel focuses on providing practical advice, inspiration, and strategies to entrepreneurs, creators, and marketers looking to grow their businesses and personal brands in the digital age. The channel features a mix of keynote speeches, interviews, behind-the-scenes content, and day-in-the-life videos that emphasize hustle, mindset, and actionable marketing tactics. --- ## Rules ### Content Guidelines: - **Focus on moments that are:** * Counterintuitive insights that challenge common marketing beliefs * Actionable tips or frameworks that viewers can implement immediately * Engaging stories or case studies that illustrate a marketing principle * Bold statements or hot takes that provoke thought and discussion - **Clips must be self-contained:** * The viewer should grasp the context and takeaway without needing additional information * Avoid clips that rely heavily on prior segments or external references - **Prioritize:** * High-quality audio with clear speech * Content that reflects the channel's commitment to providing valuable marketing insights * Moments that showcase the unique perspectives of the host and guests ### Technical Guidelines: - **NEVER clip:** * Any music segments — even brief background music (due to copyright restrictions) * Commercials, sponsorships, or ad reads - **Formatting:** * Ensure the clip starts with a strong hook—a question, bold statement, or intriguing fact—to capture attention within the first 3 seconds * End with a clear takeaway or call-to-action that encourages further engagement or reflection --- ## Additional Notes - **Be highly selective:** It's better to have one exceptional clip than multiple mediocre ones - **Monitor episodes for spontaneous moments** that align with the content guidelines - **Collaborate with the editorial team** to ensure clips align with the channel's brand and audience expectations --- By adhering to these guidelines, you'll help amplify the channel's reach and impact through engaging short-form content that provides valuable marketing insights to a broader audience. ``` ``` You are an AI content editor for the GaryVee YouTube channel dedicated to helping entrepreneurs, creators, and marketers master the art of digital growth. The channel delivers high-value insights on topics such as content strategy, brand storytelling, SEO, paid media, and audience development. Your mission is to identify short-form vertical video moments from long-form content that are insightful, actionable, and attention-grabbing—the kind of clips that stop the scroll and provide immediate value on platforms like TikTok, Instagram Reels, and YouTube Shorts. GaryVee (Gary Vaynerchuk) is a serial entrepreneur, author, and motivational speaker known for his expertise in digital marketing, social media, and personal branding. His YouTube channel focuses on providing practical advice, inspiration, and strategies to entrepreneurs, creators, and marketers looking to grow their businesses and personal brands in the digital age. The channel features a mix of keynote speeches, interviews, behind-the-scenes content, and day-in-the-life videos that emphasize hustle, mindset, and actionable marketing tactics. Counterintuitive insights that challenge common marketing beliefs Actionable tips or frameworks that viewers can implement immediately Engaging stories or case studies that illustrate a marketing principle Bold statements or hot takes that provoke thought and discussion The viewer should grasp the context and takeaway without needing additional information Avoid clips that rely heavily on prior segments or external references High-quality audio with clear speech Content that reflects the channel's commitment to providing valuable marketing insights Moments that showcase the unique perspectives of the host and guests Any music segments — even brief background music (due to copyright restrictions) Commercials, sponsorships, or ad reads Ensure the clip starts with a strong hook—a question, bold statement, or intriguing fact—to capture attention within the first 3 seconds End with a clear takeaway or call-to-action that encourages further engagement or reflection Be highly selective: It's better to have one exceptional clip than multiple mediocre ones Monitor episodes for spontaneous moments that align with the content guidelines Collaborate with the editorial team to ensure clips align with the channel's brand and audience expectations By adhering to these guidelines, you'll help amplify the channel's reach and impact through engaging short-form content that provides valuable marketing insights to a broader audience. ``` ``` Overview You are an AI content editor for GaryVee YouTube channel dedicated to helping entrepreneurs, creators, and marketers master the art of digital growth. The channel delivers high-value insights on topics such as content strategy, brand storytelling, SEO, paid media, and audience development. Your mission is to identify short-form vertical video moments from long-form content that are insightful, actionable, and attention-grabbing—the kind of clips that stop the scroll and provide immediate value on platforms like TikTok, Instagram Reels, and YouTube Shorts. --- Context: Who is GaryVee and What is the Channel? GaryVee (Gary Vaynerchuk) is a serial entrepreneur, author, and motivational speaker known for his expertise in digital marketing, social media, and personal branding. His YouTube channel focuses on providing practical advice, inspiration, and strategies to entrepreneurs, creators, and marketers looking to grow their businesses and personal brands in the digital age. The channel features a mix of keynote speeches, interviews, behind-the-scenes content, and day-in-the-life videos that emphasize hustle, mindset, and actionable marketing tactics. --- Rules Content Guidelines: Focus on moments that are: * Counterintuitive insights that challenge common marketing beliefs * Actionable tips or frameworks that viewers can implement immediately * Engaging stories or case studies that illustrate a marketing principle * Bold statements or hot takes that provoke thought and discussion Clips must be self-contained: * The viewer should grasp the context and takeaway without needing additional information * Avoid clips that rely heavily on prior segments or external references Prioritize: * High-quality audio with clear speech * Content that reflects the channel's commitment to providing valuable marketing insights * Moments that showcase the unique perspectives of the host and guests Technical Guidelines: NEVER clip: * Any music segments — even brief background music (due to copyright restrictions) * Commercials, sponsorships, or ad reads Formatting: * Ensure the clip starts with a strong hook—a question, bold statement, or intriguing fact—to capture attention within the first 3 seconds * End with a clear takeaway or call-to-action that encourages further engagement or reflection --- Additional Notes - Be highly selective: It's better to have one exceptional clip than multiple mediocre ones - Monitor episodes for spontaneous moments that align with the content guidelines - Collaborate with the editorial team to ensure clips align with the channel's brand and audience expectations --- By adhering to these guidelines, you'll help amplify the channel's reach and impact through engaging short-form content that provides valuable marketing insights to a broader audience. ``` ## Frequently asked questions Many of the popular LLMs were trained using structured markup languages such as Markdown, XML, or in a JSON structure. Using this same format helps the AI decipher meaning and focus on particular sections. No. The prompt in the [**Find Clips**](/nodes/findclips) node is purely for *finding* the best moments. You should only include information about how to clip the content. You'll assign your own editing style via the [**Workflows**](/essentials/workflows) Yes!! The more example clips, the better. If you are going to include examples, however, be sure to include as much information about it as possible. This may be the title, the description, the transcript, etc. # Reframe editor Source: https://docs.overlap.ai/essentials/reframe-editor > Use the Reframe editor in Studio to control how each scene is cropped into vertical, either as a fixed crop or an animated camera move. ## Opening the Reframe editor The Reframe editor lives inside [Studio](/essentials/editing). Open a clip and click `Reframe` beside the preview to enter `Edit Mode`. Reframe editor in Studio showing the preview, timeline, and Scene Mode panel The clip is split into **scenes**, and each is reframed independently. Whatever scene the playhead is in is the scene the right-side panel edits, so move the playhead to switch scenes. ## Static vs. Pan `Scene Mode` at the top of the panel decides how the current scene's crop behaves over time. Scene Mode toggle set to Pan, with scene info, Add keyframe, and Properties * **Static** — one fixed crop for the whole scene. Set **Position X**, **Position Y**, and **Zoom** once. Best for steady shots; there are no keyframes in this mode. * **Pan** — an animated camera move driven by **keyframes**, which Overlap smoothly interpolates between. Best when the subject moves or you want a push-in. The `Add keyframe` and keyframe-navigation controls only appear here. Switching a scene from Pan to Static collapses its movement into a fixed crop. Switching back re-enables keyframe editing. The scene info below the toggle shows **Scene** (current / total), **Duration** (seconds), and **Tile** (the scene's output region as a percentage of the frame). ## Scene layouts Drag across the scene strip in the timeline to select one or more scenes, then pick a layout from the menu in the timeline controls. It applies to every selected scene at once — including when you pick the layout the selection is already showing, which is how you re-fit scenes that are in the right layout but not filling the frame. | Layout | What it does | | ----------------- | ----------------------------------------------------------------------------- | | **Single** | One crop filling the whole vertical frame. | | **Split** | Two stacked crops — the usual two-person setup. | | **Tri Split** | Three evenly stacked crops. | | **Dual Reaction** | Two crops on top, one across the bottom. | | **Quad Split** | Four crops in a 2×2 grid. | | **Padded** | The entire horizontal frame, letterboxed, with blurred bars filling the gaps. | Changing layout keeps each scene's framing: the crop stays on whoever it was pointed at and is resized to fit its new slot. Some scenes sit in a short band with blurred bars above and below instead of filling the frame. To clear them, select those scenes and pick `Single` — even though the menu already says `Single`. Each crop stays on its subject and expands to fill the full vertical frame. ### Wide shots turned into Single Some scenes are **Padded** because the original is a wide or panel shot with several people in it — no single vertical crop can hold them all, so Overlap shows the whole frame instead. Those scenes have no subject to crop towards, so when you convert them to a cropped layout Overlap looks at the video itself: it finds whoever is speaking in each scene and frames the crop on them. You'll see `Finding speakers` beside the save indicator while it works, then a summary of how many scenes were reframed. Only scenes that actually need it are moved. A padded close-up already fills the frame with its subject, so it's left exactly as it is — the crop is only repositioned when the speaker sits well off-centre, which in practice means the wide shots with people to either side. Scenes where no one could be found also stay centred; drag those crops in the preview to place them yourself. The whole pass is a single undo step, so `⌘Z` puts everything back. ## Keyframes Each keyframe pins a crop **Position X**, **Position Y**, and **Zoom** to a single frame. As the clip plays, Overlap animates the crop between them. A scene needs at least two keyframes to move. **Add a keyframe:** in `Pan` mode, scrub to the frame you want, reframe the crop, and click **Add keyframe** (it's created at the playhead). **Edit a keyframe:** move the playhead onto it — the `Properties` header then shows which keyframe you're on (e.g. `Keyframe 3 of 6 in scene`). If the playhead isn't on a keyframe, the panel prompts you to move onto one. Adjust each value by **dragging** to scrub or **clicking** to type: | Property | What it controls | | -------------- | ---------------------------------------------------------------------- | | **Position X** | Horizontal center of the crop (source pixels). Higher moves right. | | **Position Y** | Vertical center of the crop (source pixels). Higher moves down. | | **Zoom** | How tight the crop is. `1×` is widest; larger pushes in. Minimum `1×`. | Read-only details below show the keyframe's **Frame**, the scene's **Interpolation** (e.g. `Linear`), and **Total keyframes** for the clip. **Navigate and delete:** use the `‹` / `›` arrows in the `Properties` header to jump between keyframes. Select keyframes to reveal the **Delete** bar at the bottom of the panel. ## Reading the keyframe timeline The timeline under the preview stacks the scene strip on top and **keyframe diamonds** below. Reframe timeline with scene tiles on top and keyframe diamonds below * Each **tile** in the top row is one scene. * Each **diamond** below is a keyframe; clusters mean several close together. * The **playhead** selects the scene the panel edits. Use the zoom / `Fit` control (top right) to spread out tightly packed keyframes. * Right-click a scene tile and choose **Copy Reframe Layout**, then right-click another tile and choose **Paste Reframe Layout** to reuse crop positions, layout, and pan keyframes across that scene's duration. * When two crop regions touch in the preview, click the small swap arrow between them to switch their positions in the current scene. ## A practical reframing flow 1. Click `Reframe` to enter Edit Mode. 2. For each scene, choose `Static` (fixed crop) or `Pan` (camera move). 3. For Static, set position and zoom once. 4. For Pan, scrub to each key moment, reframe, and click **Add keyframe**. 5. Step through with `‹` / `›` to check the move, then play the clip before exporting. # Settings Source: https://docs.overlap.ai/essentials/settings Manage your Overlap profile, account security, AI agent and MCP connections, team, and organization defaults. Overlap Settings is a dedicated workspace for personal account controls and organization-wide configuration. Open your profile menu in the app and select **Settings**, **Profile**, or **Organization**. Use **Back to app** to return to your workspace. On smaller screens, open the menu in the Settings header. ## Find a setting The Settings sidebar is divided into two groups: * **Profile** settings belong to your user and follow you across every organization. * **Organization** settings apply to the organization selected at the bottom of the sidebar. Use **Search settings** to filter the navigation by a setting name or related term. ## Profile settings ### Profile Update your name and profile photo, then review the email addresses attached to your sign-in identity. You can add and verify an email address, choose a primary address, and remove an address you no longer use. ### Security Manage your password and active browser sessions. You can sign an individual session out without affecting the device you are currently using. Password, authentication, and session changes affect your Overlap user across every organization. ### Connected accounts Connect, retry, or disconnect identity providers used for your Overlap sign-in. Overlap may ask you to verify your identity before changing a sign-in method. Product integrations used by workflows are managed separately from the organization’s Integrations page. ### Notifications Choose which organizations can email you when clips are created. You can manage notification preferences across all of your current organization memberships from one page. ### AI Agents & MCP Connect Overlap to supported desktop AI clients through MCP. The page leads with the recommended desktop-app setup for Codex and Claude, including the exact settings and connector buttons to use. Terminal commands remain available as a secondary Codex fallback. The connection belongs to your user, so one connection can access every organization you currently belong to. Overlap rechecks your live membership before each organization-scoped action. See [Connect an AI client](/mcp/connect) for setup instructions. ## Organization settings Switch organizations from the control at the bottom of the Settings sidebar. The page updates to show the selected organization’s values and permissions. ### General Organization admins can update the organization name, workspace URL, and logo. The page also displays the organization ID and a shortcut to member management. ### Members Review current members and pending invitations. Organization admins can invite people, change roles, revoke invitations, and remove members. Other members receive a read-only view. ### Content & AI Configure the organization context, keywords, and other guidance that Overlap uses when creating content. ### Video & export Set shared video, caption, transcription, and export defaults for the organization. The **Clip Edge Buffer** setting controls how much extra footage (30, 60, or 90 seconds) is kept on each side of every new clip. This buffer lets you extend a clip past its original boundaries in the Studio transcript editor using the Video Start and Video End markers. Longer buffers give more room to extend but increase processing time and storage. The setting applies to clips created after it is changed; existing clips keep the buffer they were cut with. ### Additional organization settings Email delivery, Dropbox, and partner-specific settings appear only for accounts and organizations with access to those features. If a setting is missing, first confirm that the correct organization is selected. Some settings also require organization-admin or Overlap-admin access. # Social calendar Source: https://docs.overlap.ai/essentials/social-calendar Review, edit, approve, create, and reschedule outgoing social posts. > Use `Social Calendar` to manage everything that is already scheduled, waiting for approval, or ready to be created from scratch. ## What Social Calendar is for Open **Social Calendar** from the left sidebar when you want one place to manage outgoing posts across your connected accounts. This is the final publishing layer in Overlap. Workflows and posting setups can generate post-ready drafts for you, but `Social Calendar` is where you review the schedule, make last-mile edits, approve posts when needed, and manually add new posts. ### Shuffle an existing schedule Use **Shuffle Posts** to randomize the order of upcoming posts. You can include or exclude each platform and choose **Current cadence** to keep that platform in its existing slots, or schedule up to one, two, or three posts per day. A daily cadence creates as many future calendar dates as the selected posts require while preserving each post's local time of day. The date range chooses which posts are reorganized; it does not prevent the new cadence from extending beyond that range. The server validates and applies the same shuffle shown in the preview. Social Calendar week view ## Understanding the calendar view In the current live calendar view, Overlap gives you a few top-level controls for managing the schedule: * `Today` jumps you back to the current week * `Filters` narrows the set of posts you are looking at * `Manage` opens bulk schedule actions * `Week` and `Month` change the calendar layout * the grid and list toggles switch between calendar and list-style management * `Create Post` starts a brand-new post manually Each day groups posts by status and scheduled time, which makes it easy to see what has already gone out and what is still upcoming. ## Editing an existing post Click any post card to open its details. Social Calendar post detail panel From the post view, you can use `Social Calendar` to make the final changes before something goes live: * update the post copy * preview the clip from its saved cover, select `Cover` to pause and return to the beginning, select `Replace` to upload a cover, or select `Design` to open the Thumbnail Editor * open and revise the clip * change the scheduled time * switch the destination account * approve the post if your workflow requires user approval before publishing This makes `Social Calendar` useful for both automated and manual workflows. Even if a workflow created the draft, you still have a clean place to review the exact post that is queued to publish. When you choose `Design`, the editor loads the clip's current cut and authored layers. Pick a frame, add or restyle text and images, remove unwanted overlays from the cover only, and adjust the colour treatment. `Save thumbnail` stores the composited image on the clip and preserves the editable design so reopening it restores the same frame and layers. Thumbnail-only changes do not alter the video timeline. If you use approval-required posting, `Social Calendar` becomes the handoff point between automation and final human review. ## Creating a post from scratch Click `Create Post` in the top-right corner when you want to add something manually instead of waiting for a workflow to generate it. Social Calendar create post modal The current creation flow supports starting new posts as: * clip posts * carousel posts * text posts From the current modal, you can choose the platform and account, set the scheduled date and time, upload media when needed, and write the exact post copy you want stored with the scheduled post. Use this flow when you want to write a post directly in Overlap, add a fresh clip to the schedule, or fill gaps in the calendar with content that did not come from an automated run. ## Approving and adjusting scheduled posts As posts move toward publishing, `Social Calendar` gives you one place to confirm the final version. A practical review pass is: 1. Open the post from the calendar. 2. Check the account and scheduled time. 3. Review or refine the copy. 4. Update the clip if the creative needs changes. 5. Approve the post if approval is required. Any edits you make here become part of the version that is scheduled to publish. Approving a post whose scheduled time has already passed publishes it within a few minutes rather than instantly. Overlap gives the post a fresh slot a short way out, so approving a backlog fans the posts out instead of firing them all on the same minute. A post far past its scheduled time — roughly two days or more — is published straight away when you approve it instead. ## Mass rescheduling future posts Use `Manage`, then `Reschedule`, when you need to move a whole set of upcoming posts at once. `Reschedule` applies to the future posts that are currently visible in the calendar based on your active filters. A good pattern is: In cadence mode, all available platform icons are selected by default. Toggle platforms on or off to choose which schedules are affected, then apply one shared posts-per-day amount, repeat interval, and start date to those platforms. The cadence is calculated independently for each selected platform, while unselected platforms remain unchanged. 1. Filter down to the accounts or posts you want to change. 2. Confirm you are looking at the right future posts. 3. Open `Manage`. 4. Choose `Reschedule` to shift that visible set together. This is the fastest way to rebalance a publishing week without editing each post one by one. ## Switching to List view The list toggle is helpful when you want broader schedule management instead of a calendar scan. Use `List view` when you want to: * review many upcoming posts in one pass * compare timing, account, and status more quickly * make bulk management decisions without moving day by day Use the calendar view when you want to reason about spacing across the week. Use the list view when you want a denser operational view of the queue. ## How this fits with workflows [`Workflows`](/essentials/workflows) and posting setups decide how content gets generated and scheduled. `Social Calendar` is where you manage the outgoing result. That division is useful: * use workflows to automate clip creation and draft scheduling * use `Social Calendar` to review, edit, approve, create, and reschedule posts before they publish # Team Source: https://docs.overlap.ai/essentials/team > Organizations on the *team* susbcription or higher, may invite people to join their workspace Manage Pn Find these settings under "Organization" in the User Profile in the bottom left of the sidebar ## How do I upgrade? Go to [billing](https://portal.overlap.ai/billing) in your dashboard to upgrade to the team plan. Teams receive up to 10 seats, and higher usage to account for the users. # Workflows Source: https://docs.overlap.ai/essentials/workflows > Build, organize, and publish the workflows that power your clip creation ## What is a workflow? A **workflow** is the automation you use to turn source content into publish-ready outputs inside Overlap. Each workflow combines three layers: * A **trigger** that tells Overlap when to start * **Editing** logic that shapes the clip * An **export** step that defines what gets produced You can keep multiple workflows in the same workspace, turn them on only when you are ready, and use different workflows for different shows, formats, or channels. ## Managing your workflows Open **Workflows** from the left sidebar to see every workflow in your workspace. From this screen you can: * Search for a workflow by name * Create a new workflow with **New** * Switch between **List** and **Cards** views * Use **Select** for bulk actions * Review each workflow's **status**, **last run**, **triggers**, and **exports** In the current workflow list, a workflow marked **Listening** is active and waiting for its trigger. A workflow marked **Off** is saved but not actively listening for new inputs. If you created workflows before the newer product naming, you may still see older workflow names that include **Clipping Agent**. Those are still managed from the same workflows screen. Current workflows list Use **List** view when you want to compare run state, triggers, and exports quickly across multiple workflows. Switch to **Cards** when you want a higher-level visual scan of what is in the workspace. ## Creating a workflow Click **New** in the top-right corner of the workflows page to open the workflow builder. The builder is organized into three core stages: 1. **Trigger** 2. **Editing** 3. **Export** This gives you a simple way to think about every workflow: * How does it start? * What should happen to the content? * What should Overlap produce at the end? For a first build, start with the empty canvas, then click **Manual Trigger** to place the starting node on the canvas. After that, move into **Editing** to add the next step, such as **Find Clips**. Empty workflow builder Workflow builder with a trigger node added ## Choosing how the workflow starts The first step is your **trigger**. This determines what wakes the workflow up. In the current builder, the trigger panel includes options such as: * **Manual Trigger** * **Audio Livestream** * **New Dropbox Video** * **New YouTube Video** * **RSS Feed** Use a manual trigger when you want to launch the workflow yourself. Use an automatic trigger when you want Overlap to watch a source and begin processing as soon as new content appears. ## Building the flow After choosing a trigger, move through the **Editing** and **Export** stages to shape the final result. You can build from scratch or use the canvas helpers already in the builder: * **Double Click** anywhere on the canvas to add a new node * **Explore Templates** if you want to start from a prebuilt structure Think of each node as one piece of the job. Together, those nodes define how the workflow processes content from input to output. When a node includes a video preview, the builder uses a recent clip from your workspace that matches the preview orientation. It starts from that clip's base video and reframing only, so saved subtitles, titles, watermarks, music, and other prior edits do not carry into the workflow preview. Use the swap button in the preview to choose a different orientation-matched clip from your Library. This changes only the temporary builder preview; it does not modify the workflow or the selected clip. ## Connecting nodes together Once you add nodes to the canvas, connect them in the order you want Overlap to run them. A good way to think about it is: * The trigger starts the workflow * Each downstream node performs the next step * The final connected nodes define what gets exported at the end If you want one workflow to create multiple outputs, you can branch the flow and connect different downstream paths to different export outcomes. Branched connected workflow example ## Saving and publishing In the top-right corner of the builder, you can save the workflow in different states: * **Save as Draft** keeps your progress without turning the workflow on * **Publish** makes the workflow live so it can begin listening for its trigger Drafts are useful while you are still refining the flow. Publish when the workflow is ready to run on real content. ## A practical workflow setup A common pattern is to create separate workflows for different content goals, for example: * One workflow for long-form episode clipping * One workflow for short-form social content * One workflow for a specific ingestion source like YouTube, Dropbox, or RSS This keeps each workflow focused and makes it easier to understand what is active, what is still in draft, and what is producing results. See how Overlap can turn your content pipeline into a repeatable workflow. # System Requirements Source: https://docs.overlap.ai/guides/get-started/system-requirements ## Introduction Overlap is an AI video marketing agent that can completely automate your video clipping and social media posting. Our agent understands your style and will learn what's performing well on socials, improving itself over time. ## System Requirements Overlap runs **entirely in the browser** and relies on **Web Codecs** for smooth, low-latency video playback and editing. That means you must use a **browser + version that supports Web Codecs**, on a device that can handle hardware-accelerated video decoding. ### Browser Requirements (Web Codecs support) We recommend **Chrome** (or **Edge**) for the most consistent experience. | Browser | Web Codecs Support | Minimum Version | | ------------------------- | ------------------ | --------------- | | Google Chrome | ✅ Supported | **94+** | | Microsoft Edge (Chromium) | ✅ Supported | **94+** | | Mozilla Firefox | ✅ Supported | **130+** | | Opera | ✅ Supported | **80+** | | Safari (macOS / iOS) | ✅ Supported | **26.0+** | > Notes: > > * Ensure your browser version is at least what is defined above. **References:** WebCodecs compatibility tables and notes: MDN + Can I use.\ (See: [https://developer.mozilla.org/en-US/docs/Web/API/VideoDecoder](https://developer.mozilla.org/en-US/docs/Web/API/VideoDecoder) and [https://caniuse.com/webcodecs](https://caniuse.com/webcodecs)) ### Download Links (Supported Browsers) * **Google Chrome (recommended)**: [https://www.google.com/chrome/](https://www.google.com/chrome/) * **Microsoft Edge**: [https://www.microsoft.com/edge/download](https://www.microsoft.com/edge/download) * **Mozilla Firefox**: [https://www.firefox.com/](https://www.firefox.com/) * **Opera**: [https://www.opera.com/download](https://www.opera.com/download) * **Safari (update via macOS update)**: [https://support.apple.com/en-us/102665](https://support.apple.com/en-us/102665) * **Safari Technology Preview (optional, for newest WebKit features)**: [https://developer.apple.com/safari/technology-preview/](https://developer.apple.com/safari/technology-preview/) ### Operating System Requirements Your OS must support hardware-accelerated video decoding. **Supported** * **macOS**: 11 (Big Sur) or newer * **Windows**: Windows 10 or newer (64-bit) * **Linux**: Modern distributions with GPU acceleration enabled **Not supported** * ❌ iOS / iPadOS browsers for production workflows (may work on newer versions, but not recommended for editing) * ❌ Android browsers for production workflows * ❌ Older/unsupported OS versions without modern GPU decode ### Hardware Requirements Because video decoding and rendering happen locally, your device must be capable of handling modern codecs efficiently. **Minimum** * **CPU**: Intel i5 / Apple Silicon M1 / AMD Ryzen 5 (or equivalent) * **RAM**: 8 GB * **GPU**: Integrated GPU with hardware video decode support **Recommended** * **CPU**: Apple Silicon (M1/M2/M3) or modern Intel i7 / Ryzen 7 * **RAM**: 16 GB * **GPU**: Dedicated GPU or Apple Silicon media engine > If your machine is below minimum specs, you may see choppy playback, lag when scrubbing, or export instability. ### Network Requirements * **Stable broadband connection** * Recommended: **25 Mbps down / 10 Mbps up** * Wired or strong Wi-Fi preferred during editing sessions Uploads, downloads, and AI processing all rely on a consistent connection. ### Quick Checks **Check your browser version** * Chrome: `chrome://version` * Edge: `edge://version` * Firefox: Menu → Help → About Firefox * Safari: Safari → About Safari **Ensure hardware acceleration is enabled (Chrome/Edge)** * Settings → System → **Use hardware acceleration when available** # Source: https://docs.overlap.ai/index Hero Light ## Jump in Let's get you creating and sharing clips Onboard and start making clips right away! Workflows help you create clips and apply your brand templates Automate social posting and receive millions of new impressions ## Dive in Learn more about how Overlap works under the hood! Learn to leverage the full power of the workflow builder Discover and edit your clips as they're produced A guide to effective clip creation # Confirmations and operations Source: https://docs.overlap.ai/mcp/confirmations-and-operations Approve external effects and track long-running Overlap work safely. ## When confirmation is required Overlap requires explicit written consent in the current MCP conversation for: * publishing immediately * cancelling authorized social work * running a workflow with supported social external effects The tool first prepares an immutable preview. The assistant shows that preview and asks you to approve or decline it in chat. It does not open a browser. If you approve in writing, the assistant passes your response verbatim to the MCP write tool, and Overlap records that consent before performing the action. Confirmations are bound to the signed-in user, organization, OAuth client, action, target version, content, account, and time. They expire after ten minutes and can be used once. When an action targets an organization other than the OAuth default, its organization ID remains a selector rather than a credential. Overlap rechecks that the signed-in user is still a member before preparing the preview, recording consent, and performing the action. You do not need to reconnect or change the portal's active organization. If a post or workflow changes after preparation, the confirmation is rejected and a new preview is required. Future scheduled publishing is fail-closed during the beta. You can create and edit a future calendar draft, but it cannot be authorized for publication yet. To publish it now, first update `scheduledAt` to `null`, review the immediate-publish preview, and provide new written consent. ## Long-running operations Workflow runs and publishing may return before work finishes. The result includes an operation or workflow-run ID and a suggested polling interval. Use: * `overlap_runs_get` for workflow execution * `overlap_operations_get` for social operations Common operation states include: ```text theme={null} queued running awaiting_approval completed partial_success failed cancelled reconciliation_required ``` `reconciliation_required` means the external provider may have accepted an action but did not return a definitive response. Overlap will not blindly retry because doing so could publish twice. ## Safe retry behavior Each mutation has a durable idempotency receipt. Retrying the same completed request returns its original response. Reusing the same idempotency key for different input is rejected. Clip rendering is synchronous and returns its completed `renderUrl`; it does not create an operation to poll. ## Example > Publish this YouTube draft now. Show me the exact title, description, account, and media, then wait for my confirmation. The assistant may prepare the action, but publishing cannot proceed until you explicitly approve the exact preview in writing in the conversation. # Connect an MCP client Source: https://docs.overlap.ai/mcp/connect Connect a supported AI client once for all of your Overlap organizations. ## Before you connect You need: * an active Overlap account * membership in at least one organization shown by Overlap's OAuth picker * any organization selected as the initial default during OAuth Your connection follows your current organization memberships. The selected organization is only the default, and you do not reconnect for every organization. Your role in each organization still controls what you can do there; publishing is organization-admin only by default. ## Connect Codex desktop **Desktop app setup** is recommended and is the fastest way to connect: 1. In Overlap, open **Settings → AI Agents & MCP** and click **Copy MCP URL** beside **Codex desktop**. 2. Open the Codex desktop app, click **Settings**, and turn on **Developer mode**. 3. Open **Plugins**, select **MCP**, then click **Add MCP server**. 4. Enter exactly these values: ```text theme={null} Name: Overlap Server type: Streamable HTTP MCP URL: https://mcp.overlap.ai/mcp OAuth Client ID: leave empty OAuth Client Secret: leave empty ``` No API key or other value is required. 5. Click **Add** or **Save**. If Codex offers **Restart**, click it. Then click **Authenticate** beside Overlap and finish signing in. 6. Start a new conversation and enter `/mcp` to confirm that Overlap is connected. ### Codex CLI fallback Use Terminal only if **Developer mode** or **Plugins → MCP** is unavailable, or if you need to reset an existing saved connection. In Overlap **Settings → AI Agents & MCP**, click **Copy commands**, then run all four commands: ```bash theme={null} codex mcp logout overlap codex mcp remove overlap codex mcp add overlap --url https://mcp.overlap.ai/mcp --oauth-resource https://mcp.overlap.ai/mcp codex mcp login overlap --scopes openid,offline_access,user:org:read ``` The first two commands clear only the saved Overlap MCP credentials and configuration. A “not found” message is harmless on first setup; the following commands still run. Keep Terminal open until browser authentication finishes, then restart the desktop app. For ordinary reauthentication, run `codex mcp login overlap --scopes openid,offline_access,user:org:read`. If the command fails immediately without opening a browser, run the complete four-command reset above instead. ## Connect Claude Desktop Claude cannot add account-level connectors from inside a conversation. Add Overlap from Claude Desktop's connector settings first. ### Free, Pro, or Max 1. In Overlap **Settings → AI Agents & MCP**, click **Copy MCP URL** beside **Claude Desktop**. 2. Open Claude Desktop and click **Customize → Connectors**. 3. Click **+**, then click **Add custom connector**. 4. Enter `Overlap` as the name and paste `https://mcp.overlap.ai/mcp` as the URL. 5. Leave **Advanced settings** empty. No OAuth Client ID or Client Secret is needed. 6. Click **Add**, then click **Connect** and complete OAuth. 7. In each conversation, click **+** beside the composer, click **Connectors**, and enable **Overlap**. ### Team or Enterprise An Owner or Primary Owner must first: 1. Open **Organization settings → Connectors**. 2. Click **Add**. 3. Hover over **Custom**, then click **Web**. 4. Paste `https://mcp.overlap.ai/mcp`, leave the advanced OAuth fields empty, and click **Add**. Members can then open **Customize → Connectors**, find Overlap, and click **Connect**. They still enable Overlap per conversation with **+ → Connectors** beside the composer. ## Verify the connection Only after installation, open Overlap **Settings → AI Agents & MCP** and click **Copy test prompt**. Start a new conversation and paste it: Try: > Use the Overlap MCP connection that is already installed. Call overlap\_organizations\_list, show every organization available to me, then call overlap\_context\_get for my default organization and summarize my capabilities. Do not add or reconfigure the MCP server, and do not make any changes. To inspect and use another membership without reconnecting, ask: > Call overlap\_organizations\_list, find Casey 3, then use its organization ID to show that organization's Social Calendar for the next 30 days. Do not make changes. ## Permission groups | Permission | Allows | | ------------------------ | -------------------------------------------------------------- | | `overlap:read` | Workflows, clips, documentation, calendar, and analytics reads | | `overlap:workflows:run` | Starting and cancelling workflow runs | | `overlap:clips:write` | Updating allowed clip metadata or transcripts | | `overlap:renders:create` | Rendering clips and returning completed exports | | `overlap:calendar:write` | Creating and editing unapproved calendar drafts | | `overlap:social:publish` | Publishing immediate drafts and cancelling authorized posts | Publishing permission is restricted to organization admins by default. ## Disconnect Revoke the OAuth connection from your MCP client. This disconnects that client from all of your Overlap organizations. It does not change your memberships or existing REST API keys. ## Troubleshooting * **No organization appears:** confirm that you are a current Clerk organization member. * **The selected organization is rejected:** confirm that your membership is still active. A global organization allowlist is used only as an emergency incident-control setting. * **Codex does not show MCP:** confirm that **Developer mode** is enabled, then reopen **Plugins → MCP**. * **Codex does not show Overlap:** confirm that you clicked **Add** or **Save**, restarted if prompted, and then clicked **Authenticate** beside Overlap. * **Codex OAuth times out:** use the CLI fallback, run `codex mcp login overlap --scopes openid,offline_access,user:org:read`, and keep Terminal open until browser approval finishes. * **Claude says it cannot add a connector:** use **Customize → Connectors**; connector installation is not available from chat. * **A token is rejected after OAuth:** confirm that the MCP resource is exactly `https://mcp.overlap.ai/mcp` and reconnect. * **The server reports `DecodeError`:** the deployed MCP revision is JWT-only. Deploy a revision that supports Clerk's revocable opaque OAuth tokens, then reconnect. * **A tool is missing:** your OAuth scopes, current organization role, or an MCP safety kill switch may not permit it. * **Publishing is blocked:** switch to an organization where you are an admin, or ask an organization admin to perform the publish action. * **A confirmation expired:** retry the original action. Confirmation requests expire after ten minutes and cannot be replayed. # Overlap MCP Source: https://docs.overlap.ai/mcp/overview Use Overlap workflows, clips, Social Calendar, and analytics from an MCP-compatible AI client. Overlap MCP is a user-level connection between Overlap and compatible AI clients. Connect once to use your current role across every Overlap organization you belong to. It lets an assistant discover and run workflows, find clips, make guarded clip or transcript changes, start renders, review the Social Calendar, and analyze published content. Supported clients register automatically, so you do not copy OAuth client IDs or secrets. There is no per-organization AI Agents activation and no subscription-plan requirement. ## Server address Use the remote Streamable HTTP server: ```text theme={null} https://mcp.overlap.ai/mcp ``` The MCP connection uses Clerk OAuth. Existing Overlap REST API keys continue to work with the existing REST API, but they are not used to authenticate MCP clients. ## What it can access The organization selected during OAuth becomes the default, not the access boundary. `overlap_organizations_list` shows all current Overlap memberships and their organization IDs. Organization-scoped tools accept `organization_id` to target another membership without reconnecting. An organization ID only selects where a tool should run; it does not grant access. Overlap rechecks the signed-in user's current Clerk membership and role before targeting another organization, so removing a membership or changing a role takes effect without reconnecting. Depending on your role and the permissions approved during connection, you can: * search workflows, clips, posts, and product documentation * run workflows and follow their progress * read and update clips or transcripts, then request a render * inspect connected social accounts and the Social Calendar * create or edit unapproved social drafts * publish an immediate draft after explicit written consent in the conversation * compare social performance and identify trending posts ## Safety model Read operations happen immediately. Workflow launches require explicit written consent. External actions such as publishing immediately, cancelling authorized work, or running a workflow that creates Social Calendar drafts also require an immutable preview before that consent is accepted. The assistant shows the exact action, destination, copy, media, time, and relevant effects in chat and waits for your written response. It never opens a browser for action confirmation. The write tool requires the matching one-use confirmation ID and your consent text together; a standalone model-generated value such as `confirmed: true` is not accepted. ## Current boundaries Catalog groups can be rolled out or disabled with service-wide kill switches, but customers do not activate MCP separately for each organization. Once a user connects MCP, every current Overlap membership is available subject to that user's role and the tool's normal permission requirements. When workflow access is enabled, social Share nodes can create approval-required drafts only and require both workflow-run and calendar-write scopes. Email, iHeart, BrandLive, and unknown external-effect nodes remain unavailable through MCP. Future scheduled publishing is intentionally unavailable until Overlap can revalidate the exact account and media revision at provider time; scheduled drafts remain unapproved planning items. The beta also does not expose raw internal media workers, API-key management, social-provider credentials, arbitrary binary uploads, bulk calendar clearing, live analytics refreshes, or iHeart mutations. Editing-agent commands will be added after their durable HTTP operation interface completes beta validation. # Resources and prompts Source: https://docs.overlap.ai/mcp/resources-and-prompts Reusable Overlap context and guided prompt templates exposed by the MCP server. ## Resources Resources let a client attach current Overlap context without copying entire collections into a conversation. ```text theme={null} overlap://organization/current overlap://capabilities overlap://docs/index overlap://docs/{slug} overlap://workflow-node-types/{type} overlap://workflows/{workflowId} overlap://runs/{workflowRunId} overlap://clips/{clipId} overlap://clips/{clipId}/transcript overlap://social/posts/{postId} overlap://analytics/posts/{postId} overlap://operations/{operationId} ``` Large collections use paginated tools instead of being enumerated as resources. Sensitive storage fields, embeddings, provider credentials, and internal account configuration are removed. ## Prompt templates * `repurpose_video` — run a selected clipping workflow for a source and target platforms * `find_best_moments` — search or generate focused clip candidates * `fix_transcript_and_render` — correct a transcript using version protection and request a new render * `analyze_performance` — compare a date range and explain notable posts * `review_social_calendar` — find gaps, collisions, failures, and approval needs * `build_content_calendar` — create unapproved drafts from existing Overlap assets ## Example requests > Run my Podcast Shorts workflow on this YouTube URL. Find five 45–75 second vertical clips about AI agents, add captions, and skip sponsor segments. > What is scheduled across all accounts next week? Group it by day and flag gaps, collisions, failures, and anything needing approval. > Move the LinkedIn draft about the launch from Tuesday to Thursday at 9:30 AM Pacific. Do not authorize it to publish. > Publish the approved launch draft now. First show me the exact account, full copy, and bound media revision, then wait for my written approval in this conversation. Do not open a browser. > Compare the last seven days with the previous week and explain which posts are beating the account baseline. > Fix “Air Table” to “Airtable” in this clip, then create a new render. Do not overwrite the transcript if someone changed it after you loaded it. # Tools Source: https://docs.overlap.ai/mcp/tools The workflow, clip, Social Calendar, and analytics actions available through Overlap MCP. Overlap MCP tools are grouped by user goal. The client supplies typed inputs, while the server verifies the signed-in user's live membership in the requested organization and enforces roles, revisions, and confirmation requirements. Tool IDs use underscores so they remain compatible with Claude and other clients that accept only letters, numbers, underscores, and hyphens in tool names. ## Context and discovery * `overlap_organizations_list` — list all current Overlap memberships and their organization IDs * `overlap_context_get` — target organization, current role, and available capabilities * `overlap_search` — paginated search across supported Overlap entities * `overlap_docs_search` — search the current Overlap documentation catalog Organization listing makes one user-scoped Clerk membership request and does not fan out into one API request per organization. It returns an `organizationId`, display name, current role, and available tools. Pass that value as `organization_id` to any organization-scoped tool. If omitted, the tool uses the organization selected during OAuth as the default. Organization IDs are selectors, not credentials; Overlap rechecks membership and validates the company when an organization is actually used. ## Workflows and runs * `overlap_workflows_list` * `overlap_workflows_get` * `overlap_workflows_preflight` — freezes the workflow revision and reports external effects * `overlap_workflows_run` * `overlap_runs_get` * `overlap_runs_cancel` At the start of a fresh conversation, the assistant lists your current organizations before its first organization-scoped action unless you have already named and resolved an exact organization. If multiple organizations are available and the target is uncertain, it asks you to choose before continuing. Before preflight or execution, the assistant resolves the request to exactly one workflow. If no workflow or multiple plausible workflows match what you asked for, it lists the candidates and asks you to choose instead of guessing. It also asks for a required source URL or other runtime input when that information is missing, and obtains explicit written consent before starting the run. Workflow execution is available anywhere the connected user has a current organization membership; it does not require MCP to be activated separately for each organization. Every MCP run still uses a one-use start proof bound to the exact organization, workflow revision, and input. A supported workflow with external effects requires confirmation before it runs. Social workflow nodes can create reviewable drafts but cannot authorize publishing. Email, partner-export, and unknown external-effect nodes remain unavailable through MCP until they have equivalent durable dispatch protection. ## Clips, transcripts, and renders * `overlap_clips_search` * `overlap_clips_get` * `overlap_clips_update` * `overlap_transcripts_get` * `overlap_transcripts_replace` * `overlap_clips_render` * `overlap_operations_get` `overlap_clips_search` uses the Clips page's library search model. It supports text search plus tag, status-tag, people (`any` or `all`), keyword, workflow, aspect-ratio, duration, and modified-date filters. Set `include_facets` to return available tag, status, people, keyword, workflow, and aspect-ratio counts. Search results are compact summaries and omit editing configuration such as `subtitleConfig`, `titleConfig`, and watermark settings; use `overlap_clips_get` when those details are needed. To enumerate one episode, pass the exact `live_...` value from its portal URL as `episode_id`, request up to 100 clips, and continue with `meta.cursor` until it is absent. Episode and workflow-run filters read the matching clip lineage directly from the organization's Clips collection, so they are not limited to the first page of the general library index. General text and facet searches use the same Algolia indices and replica sorts as the Clips page. When only the number of matching clips is needed, set `count_only: true`. The response contains no clip objects and returns the count in `meta.total`, which avoids loading an episode's full result set into the conversation. Clip and transcript writes use an expected version. If someone edits the clip after it was read, the server returns a conflict instead of overwriting the newer version. Renders are synchronous: the tool waits for rendering to finish and returns the completed `renderUrl`. ## Social Calendar * `overlap_social_accounts_list` * `overlap_social_calendar_list` * `overlap_social_posts_get` * `overlap_social_posts_create_draft` * `overlap_social_posts_update` * `overlap_social_posts_authorize` — confirm and publish an immediate draft * `overlap_social_posts_cancel` Draft creation never authorizes publication. Future times may be used for calendar planning, but future scheduled publishing is unavailable during the beta. Set `scheduledAt` to `null` before requesting immediate-publish confirmation. The assistant shows the immutable preview and asks for explicit written consent in chat; it never opens a browser for action confirmation. Once a post is scheduled or publishing, cancel its existing work before making a material edit; Overlap will not replace authorized copy in place. Calendar queries are limited to a 93-day range. Times are returned as RFC3339 values and natural-language scheduling uses the organization timezone. ## Analytics * `overlap_analytics_summary` * `overlap_analytics_posts_list` * `overlap_analytics_posts_get` * `overlap_analytics_trending` Analytics tools use cached Overlap data and report freshness and platform coverage. They do not trigger live provider refreshes. ## Pagination and retries List tools return opaque cursors and at most 100 records per page. Mutations use idempotency receipts so a network retry returns the original response instead of repeating a workflow, render, or publish action. # Add motion graphics Source: https://docs.overlap.ai/nodes/add-motion-graphics Generate editable, brand-aware motion graphics for every incoming clip. > Add Motion Graphics sends each saved clip to Overlap's editing agent, which analyzes the footage, plans a storyboard at your requested frequency, reviews each scene, and attaches the approved results as editable layers. ### Schema * **Input**: Clips from an upstream workflow node * **Output**: The same clips with editable motion-graphic scenes ## Add the node Add a clip-producing step first, such as [Manual Trigger](/nodes/manual-trigger) -> [Find Clips](/nodes/findclips). Then choose **Add Motion Graphics** from the Editing stage. Workflows containing Add Motion Graphics use **2× processing minutes** for each run. The node and the Get Clips action on the workflow trigger page both show this multiplier before you launch the workflow. ## Choose a style source Choose **Write a prompt** to describe the graphics system you want across the clip. Include visual tone, pacing, typography, useful graphic moments, or concepts to avoid. For example: “Restrained documentary graphics with clean source cards, subtle map beats, and kinetic type only for key phrases.” Choose **Choose a template** to use one of the active generation templates and preview its reference video. The workflow saves only the template ID; it never stores or trusts a browser-supplied template prompt. When the workflow runs, the editing agent reads the current root `/generation-templates/{templateId}` document and applies its authoritative `examplePrompt` to the storyboard and every generated scene. The example's style and construction are preserved while its subject, text, duration, timing, and scene mode are adapted to the current clip. Prompt and template modes are mutually exclusive. Changing modes clears the previous selection so a stale prompt cannot override a template. ## Prompting motion graphics Motion graphics prompts should be descriptive and explicit. Tell Overlap what the graphics should look like, where they should appear, when they should be used, and which types of graphics you prefer. * **Style**: Describe the visual language, mood, colors, typography, shapes, texture, animation energy, and pacing. Include anything to avoid, such as 3D effects, neon colors, or playful illustration. * **Placement**: Say whether graphics should sit beside the speaker, stay in a clear area of the frame, appear behind the speaker, or use a particular part of the screen. Mention anything that must remain unobstructed. * **When to use them**: Explain which moments deserve graphics, such as the opening hook, topic changes, statistics, names, locations, short quotes, or abstract ideas that benefit from explanation. * **Format**: State whether you prefer transparent overlays, kinetic text, icons, diagrams, or full-screen scenes. Describe how these formats should be mixed if you want more than one. * **Text**: If exact wording matters, put it in quotation marks. Otherwise, describe the kind of short on-screen copy the agent should derive from the clip. **Example prompt:** “Use restrained editorial motion with warm brand colors, clean sans-serif type, and subtle geometric line work. Place transparent overlays in open space beside the speaker and keep faces and captions clear. Use kinetic text only for short key phrases and statistics. Use a full-screen scene for major topic transitions or abstract concepts. Avoid 3D, neon, and playful cartoon effects.” The frequency setting controls how often motion graphics appear. Your prompt controls what the agent prioritizes at those moments. Overlap may adapt exact placement to the footage so the speaker and important content remain visible. ## Set the frequency Use **Motion graphics frequency** to control how often graphics appear: * **Low** keeps the edit sparse and reserves graphics for the strongest moments. * **Medium** adds regular but selective motion throughout the video. * **High** creates frequent motion moments with short unadorned gaps. * **Constant** targets continuous coverage wherever the footage and speaker-safe composition allow it. Frequency is sent to the editing agent as part of the generation context. It controls storyboard coverage and remains attached to every scene task. Separate scenes are either back-to-back or at least one second apart. If a generated storyboard contains a shorter gap, Overlap rejects the draft and gives the storyboard agent one correction attempt before any scenes are generated. If motion generation fails for one clip, that clip continues through the workflow unchanged while the other clips keep their successfully generated motion graphics. The node fails only if motion generation fails for every input clip. ## Brand context The editing agent reads the latest saved company brand as supporting context when the workflow runs. Your custom direction or selected template remains the primary visual instruction. Use **Brand website** inside the node to add a company domain. Overlap imports any available brand name, logos, palette, typeface, style, and voice into the same My Brand profile used elsewhere in the product. If Brandfetch has no matching profile or is temporarily unavailable, the validated domain is still saved and included in the agent context. When My Brand already has a domain, the node shows only a compact summary with the brand name, domain, logo, palette, and default typeface. Choose **Change** to update the domain or **Open My Brand** for the complete brand editor. ## Continue adding layers The node preserves the clip ID and attaches motion graphics as editable scenes rather than flattening them into a rendered video. Put [Subtitles](/nodes/subtitles), [Title Overlay](/nodes/title-overlay), [Add Watermark](/nodes/add-watermark), music, and other layer nodes after it. The final render composes those later layers with the generated scenes. Generated scenes and their source-subject cutouts render above subtitles but below title and watermark layers, so captions remain legible without covering intentional foreground branding. For best results, place Add Motion Graphics after operations that change clip timing or canvas dimensions, such as trimming and reframing. # Add music Source: https://docs.overlap.ai/nodes/add-music Add background music to clips in a workflow. > Add background music to every clip that reaches this node. ### Schema * **Input**: Video or clips from an upstream trigger or editing node * **Output**: Video or clips with background music applied ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger first, then continue in the **Editing** stage. Choose **Add Music** from the editing node panel. Overlap adds an action node to the canvas. Click **No music selected** inside the node to open the music picker on the right side. Add Music node settings panel ## Choose music The music picker opens with a clip preview and three tabs: * **Search** * **Previous** * **Upload** Use **Search** to find a track by style or mood. The current search field suggests examples such as `Lofi` and `Chillhop`, and the panel also lists **Popular Tracks**. Click the play button on a track to preview it. Click the plus button to add that track to the node. ## Upload music Use **Upload** when you want to use your own music instead of a track from the picker. After music is selected, the node updates from **No music selected** to the chosen music, and downstream nodes receive clips with the background music applied. ## Build the rest of the workflow Use **Add Music** after the workflow has a video or clip source. A common flow is [Manual Trigger](/nodes/manual-trigger) -> [Find Clips](/nodes/findclips) -> **Add Music** -> [Style Video](/nodes/style-video) -> **Post to Social**. Finish the workflow with an export node, then click **Publish** when the workflow is ready. # Add outro Source: https://docs.overlap.ai/nodes/add-outro Deprecated but supported standalone node for end cards and outro audio. **Deprecated but supported:** Existing Add Outro nodes remain editable and executable. For new workflows, configure the **Outro End Card** section in [Style Video](/nodes/style-video). > Add finishing outro elements to each clip before the workflow exports it. The **Add Outro** node is an editing action for adding an end card, outro music, or both. Use it near the end of the editing stage when clips should include a branded closing moment before they are sent to an export node. ### Schema * **Input**: Video or clips from an upstream trigger or editing node * **Output**: Clips with outro elements applied ## Open an existing node Open a workflow that already contains **Add Outro**, then click the node on the canvas to check its current state. The node is no longer available as a new palette addition; use [Style Video](/nodes/style-video) in new workflows. Add Outro node selected in the workflow builder ## Configure the outro The default node state is **No outro elements**. Add an end card, outro music, or both when the finished clips should include a closing visual or audio cue. The node describes its action as **Add endcard and outro music to videos** and shows **Clips Output** on the canvas, so place it after the part of the workflow that creates or edits the clips you want to finish. ## Build the rest of the workflow When maintaining an existing workflow, keep **Add Outro** after the clip-producing and finishing nodes and before the export node. Finish the workflow with an export node, then click **Publish** when the workflow is ready. # Add watermark Source: https://docs.overlap.ai/nodes/add-watermark Deprecated but supported standalone node for applying a watermark. **Deprecated but supported:** Existing Add Watermark nodes remain editable and executable. For new workflows, add one or more watermark layers in [Style Video](/nodes/style-video). > Add a watermark to every video or clip that reaches this node. The **Add Watermark** node is an editing action for applying a brand mark, logo, or other watermark asset before export. ### Schema * **Input**: Video or clips from an upstream trigger or editing node * **Output**: Video or clips with a watermark applied ## Open an existing node Open a workflow that already contains **Add Watermark**, then click the node on the canvas to reopen its settings. The node is no longer available as a new palette addition; use [Style Video](/nodes/style-video) in new workflows. The node starts in an **Incomplete** state until a watermark is selected. The default card shows **No watermark set**. Add Watermark node default state ## Choose the watermark Click **No watermark set** on the node to choose the watermark asset for the workflow. Use a clean brand image that is ready to be layered on top of the video. Transparent PNG files work best when you want only the logo or mark to appear over the clip. If the image has a solid background, that background will appear in the finished video. ## Build the rest of the workflow When maintaining an existing workflow, keep **Add Watermark** after the node that provides the clips to brand. A common legacy flow is [Manual Trigger](/nodes/manual-trigger) -> [Find Clips](/nodes/findclips) -> **Add Watermark** -> **Post to Social**. Finish the workflow with an export node, then click **Publish** when the workflow is ready. # Ask ai Source: https://docs.overlap.ai/nodes/ask-ai Classify each incoming clip and route it into an answer branch. > Ask AI answers one finite-choice question for every incoming clip, then sends each clip through the branch that matches its answer. Use the **Ask AI** node when the next workflow step depends on what a clip contains. For example, you can separate sports clips from business clips, route clips with a visible product into a review path, or send clips that meet an editorial rule to a different export. ### Schema * **Input**: Clips from an upstream workflow node * **Output**: Two to four answer branches containing the classified clips ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger and a clip-producing node first, such as [Manual Trigger](/nodes/manual-trigger) -> [Find Clips](/nodes/findclips). In the **Editing** stage, choose **Ask AI**. Overlap adds the action node to the canvas. ## Ask a question In **Question**, enter the finite-choice question that should be answered for every clip. Write the question so each answer outcome is clear and mutually exclusive. For example: * Is this clip about sports? * Does this clip show the product? * Which audience is this clip best suited for? Ask AI evaluates each incoming clip independently. It starts with relevant clip metadata, reads transcript words within the clip's playable segments when spoken content matters, and can sample rendered video frames or search public sources when the question requires more evidence. ## Define answer outcomes The node starts with **Yes** and **No** outcomes. Rename either outcome to match your question, or click **Add outcome** to create a third or fourth answer. You can remove outcomes as long as at least two remain. Each outcome must have a non-empty label that is unique regardless of capitalization. Each outcome becomes a separate output handle on the right side of the node. Renaming an outcome keeps its existing workflow connection. ## Connect answer branches Connect every answer output to the editing or export path that should handle those clips. Each clip is sent to exactly one answer branch. If no clip selects an outcome during a run, that empty branch stops while populated branches continue. ## Build the rest of the workflow A common flow is [Manual Trigger](/nodes/manual-trigger) -> [Find Clips](/nodes/findclips) -> **Ask AI**. From there, a sports branch might add [Smart Zoom](/nodes/smart-zoom), a business branch might add [Style Video](/nodes/style-video) with subtitles enabled, and each path can finish with its own export. Choose outcomes that fully cover the possible answers so every clip has an appropriate path. # Audio Source: https://docs.overlap.ai/nodes/audio Start a workflow from a continuous audio livestream. > Record an audio livestream while the workflow is active and send the recording into the rest of your workflow. The **Audio Livestream** trigger is for workflows that should listen to a live audio source instead of waiting for an uploaded file or a published feed item. Use it for always-on streams, live radio, Icecast/Shoutcast sources, direct audio URLs, or playlist-based streams. ### Schema * **Input**: A livestream URL * **Output**: Recorded livestream content for downstream workflow nodes If no recording schedule is set, the workflow records continuously whenever it is active. Add a schedule when you only need specific live windows. ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. In the **Trigger** stage, choose **Audio Livestream**. Overlap adds the trigger node to the canvas, selects it, and moves the left panel forward to **Editing** so you can continue building the workflow. Click the **Audio Livestream** field inside the node on the canvas whenever you need to reopen its settings on the right side. Audio Livestream node settings panel ## Configure the livestream In the right-side settings panel, fill in **Livestream URL**. The current settings panel lists these supported livestream formats: * HLS streams, such as `.m3u8` * Live radio stations * Icecast/Shoutcast streams * Direct audio streams, such as `.mp3`, `.aac`, or `.ogg` * Streaming playlists, such as `.m3u` or `.pls` Until the URL is added, the node shows **Incomplete** on the canvas. ## Set a recording schedule By default, the settings panel shows **No schedules defined. Records continuously.** It also estimates about `720 hours/month` for continuous recording and recommends adding a schedule to avoid recording all the time. Click **Create Schedule** when the stream should only record during planned windows. Audio Livestream recording schedule settings The schedule form lets you define the recording cadence with fields such as **Frequency**, **Timezone**, **Start Date**, **End Date**, **Repeat every**, **On**, and **Time**. ## Build the rest of the workflow After the trigger is configured, continue in **Editing** with nodes such as [Find Clips](/nodes/findclips), [Add Audiogram](/nodes/audiogram), [Style Video](/nodes/style-video), or [Reframe](/nodes/reframe). Finish with an export node, then click **Publish** when the workflow is ready to record from the livestream. # Audiogram Source: https://docs.overlap.ai/nodes/audiogram Generate dynamic audio visualization for clips in a workflow. > Generate a dynamic audio visualization for every clip that reaches this node. The **Add Audiogram** node is an editing action for workflows that need an audio-forward visual treatment. Use it when the source audio should be represented with an audiogram overlay before the workflow exports the finished clips. ### Schema * **Input**: Video or clips from an upstream trigger or editing node * **Output**: Clips with an audiogram visualization applied ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger first, such as **Manual Trigger**. In the **Editing** stage, choose **Add Audiogram**. Overlap adds an action node to the canvas and connects it to the workflow path. Add Audiogram node in the workflow builder ## Configure the audiogram The node summary shows **Audiogram Overlay** with the current format and styling choices. The default live builder state includes: * **Format**: 16:9 * **Background Color** * **Renderer**: Frontend Use these settings when you want Overlap to turn audio-driven clips into a visual clip with an audiogram treatment. ## Build the rest of the workflow Place **Add Audiogram** after the node that provides the clips you want to visualize. A common flow is **Manual Trigger** -> **Add Audiogram** -> **Email** or **Post to Social**. If the workflow should find specific moments first, place [Find Clips](/nodes/findclips) before **Add Audiogram**. Add finishing nodes such as [Style Video](/nodes/style-video) or [Convert to Vertical](/nodes/reframe) before the export node when the clips need additional styling. # Delay Source: https://docs.overlap.ai/nodes/delay Pause a workflow before continuing to the next node. > Wait for a set amount of time before the workflow continues. The **Delay** action node is for workflows that need time between steps. Use it when a workflow should pause after receiving or preparing content, then continue automatically later. ### Schema * **Input**: Video, clips, or another payload from an upstream node * **Output**: The same payload after the delay finishes ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger or source first, then continue in the **Editing** stage. Choose **Delay** from the action node panel. Overlap adds the node to the canvas. Connect the node you want to pause into **Delay**, then connect **Delay** to the next action or export node. ## Choose the delay Set the amount of time to wait, then choose the unit: * Seconds * Minutes * Hours * Days For an exact resume time, open **Additional options** and set **Delay until**. When this value is set, it takes precedence over the duration and unit. Clearing it returns the node to duration-based delay. When a workflow reaches this node, the workflow row shows **Waiting** while the timer is active. After the wait finishes, Overlap resumes the workflow and sends the output to the next connected node. ## Build the rest of the workflow Place **Delay** before the step that should happen later. For example, a workflow might run **Manual Trigger** -> **Delay** -> [Find Clips](/nodes/findclips) -> [Email](/nodes/email). Finish the workflow with an export node, then click **Publish** when the workflow is ready. # Dropbox Source: https://docs.overlap.ai/nodes/dropbox Start a workflow when a new video appears in a Dropbox folder. > Start a workflow automatically when a new video is added to a monitored Dropbox folder. The **New Dropbox Video** trigger is for workflows that should watch a Dropbox folder and send new videos into the rest of your workflow. Use it when a shared folder is where new source videos arrive. Dropbox account verification is required before Overlap can monitor folders. ZIP archives aren't supported. Add video or audio files directly to the monitored folder instead. If Overlap detects a ZIP, it won't start the workflow and will add an error notification in the portal. ### Schema * **Input**: The Dropbox folder to monitor * **Output**: The new Dropbox video that starts the workflow ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. In the **Trigger** stage, choose **New Dropbox Video**. Overlap adds the trigger node to the canvas, selects it, and moves the left panel forward to **Editing** so you can continue building the workflow. Click the **New Dropbox Video** node on the canvas whenever you need to reopen its settings on the right side. New Dropbox Video node settings panel ## Choose the Dropbox folder In the right-side settings panel, use **Dropbox Folder** to choose the folder this trigger should monitor for new videos. If Dropbox is already connected, the panel shows **Dropbox connected. You can choose a folder below.** Click **Select Folder** and choose the folder that should start the workflow when new videos are added. Until a folder is selected, the node shows **Incomplete** and displays **Folder required • Set in right panel** on the canvas. If the panel asks you to connect or verify Dropbox, complete that step first, then return to **Select Folder**. ## Build the rest of the workflow After the trigger is configured, continue in **Editing** with nodes such as [Find Clips](/nodes/findclips), [Style Video](/nodes/style-video), or [Reframe](/nodes/reframe). Finish with an export node, then click **Publish** when the workflow is ready to listen for new Dropbox videos. # Email Source: https://docs.overlap.ai/nodes/email Send workflow results by email after Overlap finishes processing them. > Send the finished workflow output to email recipients. The **Email** export node is for workflows that should notify people when processed clips or videos are ready. Use it at the end of a workflow when the result should land in an inbox instead of being posted directly to social. ### Schema * **Input**: Finished workflow output from the previous node * **Output**: An email notification or delivery step for the completed result ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Build the trigger and editing steps first, then open the **Export** stage and choose **Email**. Overlap adds the Email node as the workflow destination. Email export node in the workflow builder ## Configure the delivery Use the Email node when the workflow should send the finished output to an inbox for review, approval, sharing, or handoff. Because Email is an export node, place it after the editing nodes that create the assets you want delivered. For example, a workflow might run **Find Clips**, use [Style Video](/nodes/style-video) to add subtitles, then finish with **Email** so the completed clips are sent when the workflow run is done. Organization administrators can turn off **Workflow email delivery** from Email Settings. When it is off, workflows continue processing, but Email nodes, completion emails, and workflow status emails do not send. An individual workflow cannot override the organization setting. ## Build the rest of the workflow Email is usually the final node in the workflow. Before publishing, make sure the earlier nodes produce the clips, captions, reframes, or branded assets you want included in the delivery. If the workflow should publish directly to connected social accounts instead, use [Post to Social](/nodes/autopost). # Enhance audio Source: https://docs.overlap.ai/nodes/enhance-audio Studio-quality audio cleanup — remove background noise and echo, and balance volume levels. > Clean up every clip's audio automatically: background noise removal, echo reduction, and consistent loudness — without changing the clip's timing. The **Enhance Audio** node is an editing action for sources recorded outside a studio — laptop mics, echoey rooms, background fans, or uneven speaker volumes. It rewrites each clip's audio track with an AI-enhanced version while leaving the video and all timing untouched, so subtitles, transcripts, and overlays stay perfectly in sync. ### Schema * **Input**: Clips from an upstream node (typically Find Clips) * **Output**: The same clips with studio-quality enhanced audio ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger and a [Find Clips](/nodes/findclips) node first. In the **Editing** stage, choose **Enhance Audio**. Overlap adds the action node to the canvas and connects it to the workflow path. Place it anywhere after **Find Clips**. Since only clip minutes are processed (not the full source recording), placement after clip selection keeps processing fast. ## Configure the enhancement * **Studio sound** — Removes echo and room reverb and boosts vocal clarity, making speakers sound close to the microphone. * **Remove background noise** — Cleans up hiss, hum, fans, and other constant background sounds. * **Balance volume levels** — Evens out quiet and loud speakers to a consistent, streaming-ready loudness. * **Protect music** — Keeps intentional music (intro themes, music beds) out of the noise cleanup so it isn't dulled or removed. All options are enabled by default. ## How it behaves * Enhancement never cuts or shortens audio. The enhanced track is a drop-in replacement with identical duration, so every downstream timestamp remains valid. * If enhancement fails for a clip (for example, a provider outage), the workflow continues with that clip's original audio rather than failing the run. * Re-running the same clip with the same settings reuses the previous result — no duplicate processing. ## Build the rest of the workflow A common flow is **Manual Trigger** -> **Find Clips** -> **Enhance Audio** -> [Style Video](/nodes/style-video) -> **Post to Social**. Enhancing before other editing nodes means every later step — and the final render — carries the cleaned-up audio. # Filler words Source: https://docs.overlap.ai/nodes/filler-words Clean up filler words, stutters, silences, and punctuation in workflow outputs. > Remove speech clutter and transcript punctuation before the workflow moves on to finishing or export. The **Remove Filler Words** node is an **Editing** action node for cleaning up spoken content in a workflow. Use it after the workflow has a video or clips to process, and before any downstream node that should use the cleaned result. ### Schema * **Input**: Video or clips from an earlier workflow node * **Output**: Video/clips output with the selected cleanup options applied ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger or source node first. When the builder moves to the **Editing** stage, choose **Remove Filler Words** from the left node panel. Overlap adds it as an action node on the canvas. Click the **Remove Filler Words** node on the canvas whenever you need to reopen its settings on the right side. Remove Filler Words node settings panel ## Choose what to remove All cleanup options are off by default. Turn on only the passes you want this workflow to run. * **Remove Filler Words**: Clean up words like `uh`, `um`, and `mhmm` from speech. * **Remove Stuttered Words**: Clean up repetitive words like `I I I` or `the the the`. * **Remove Silences**: Cut out long pauses and silence gaps from your video. * **Remove Punctuation**: Remove periods, commas, and other punctuation from the transcript. The node card shows **No removal enabled** until at least one cleanup option is turned on. ## Place it in the workflow Place **Remove Filler Words** after the node that produces the video or clips you want to clean. For a clip workflow, a common order is: * **Find Clips** -> **Remove Filler Words** -> **Style Video** -> export For a manual cleanup workflow, you can place it directly after **Manual Trigger** and then continue into subtitles, reframing, branding, or export. ## Build the rest of the workflow After cleanup is configured, continue with finishing nodes such as [Style Video](/nodes/style-video), [Reframe](/nodes/reframe), or an export node. Click **Publish** when the workflow is ready to run. # Findclips Source: https://docs.overlap.ai/nodes/findclips Find the best moments in an input video and pass clip outputs to the rest of a workflow. > Find Clips scans incoming video and creates clip outputs from your clipping strategy, duration, prompt, keyword, and optional model guidance. The **Find Clips** node is for selecting moments from the source video. It does not apply visual edits such as subtitles, reframing, b-roll, watermarks, or outros. Add those editing nodes after Find Clips when you want to change how the clips look. ### Schema * **Input**: Video or clip output from a trigger or earlier node * **Output**: Clips selected from the input video ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger first, such as **Manual Trigger**, **New YouTube Video**, **RSS Feed**, or another source node. In the **Editing** stage, choose **Find Clips**. Overlap adds the action node to the canvas and connects it to the previous video output. Click the **Find Clips** node on the canvas whenever you need to reopen its settings on the right side. ## Choose a clipping strategy Choose one of the visual **Clipping Strategy** cards at the top of the sidebar: * **Highlights** finds the strongest standalone moments in the source. * **Montages** are themed clips that combine related moments with discontinuous cuts. * **Even Clips** splits the complete source into continuous clips near one target length. Selecting a card expands the settings that apply to that strategy directly below it. Highlights includes a model choice and a minimum/maximum duration. The Montages strategy includes a minimum/maximum duration. Even Clips includes one target duration. The saved workflow contract still treats Even Clips as the uniform strategy; the clearer label only changes how the option appears in the sidebar. ## Choose a Highlights model When **Highlights** is selected, use **Model** to choose how Overlap should evaluate the source video: * **Conversational**: for spoken conversations, podcasts, interviews, and similar talk-driven videos * **Multimodal**: for sports or other videos where non-verbal context is important The Montages and Even Clips strategies choose their required clipping model automatically, so they do not show a separate model setting. ## Configure duration For **Highlights** and **Montages**, use **Minimum** and **Maximum** under **Duration** to set the target range for generated clips. The current defaults are: * **Minimum**: `30 s` * **Maximum**: `120 s` Clips can be between `10` and `600` seconds, and the minimum must stay below the maximum. For **Even Clips**, set one **Target clip length** from `10` to `600` seconds. The separate minimum and maximum controls are hidden because they do not apply. Find Clips partitions the complete source at approximately that length, using nearby transcript boundaries when possible, without a fixed maximum number of clips. ## Guide clip selection Use **Prompt** to describe what makes a good clip for this workflow. You can type directly into the editor or click **Select prompt** to choose a saved prompt. Good prompts usually name the audience, topic, or type of moment you want. For example: * Find clips where the guest shares practical advice for founders. * Surface energetic moments with clear reactions or surprising claims. * Focus on segments about AI trends and avoid housekeeping or intro chatter. Use **Keywords** when certain terms, names, products, or topics should influence what the node looks for. The node starts with no custom keywords. For montage-style prompts, Find Clips can combine separated moments in the playback order that best explains the chosen theme. That order does not have to match source chronology: a later moment may become the hook when the resulting clip remains coherent. By default, Overlap creates one new video in the chosen playback order while keeping each exact selected moment editable in Studio. The video also includes about five seconds of surrounding source context on each side of every moment. Those five-second targets snap to the nearest transcript sentence start and sentence end, so extending a cut does not begin or end halfway through a sentence. The optional `flattened` mode joins only the exact selected moments and removes the editable segment contract. The optional `segments` mode retains the long source and absolute source-time ranges instead of creating a standalone video. ## Clip titles After selecting each clip's source ranges, Find Clips generates a concise title from the exact retained transcript. This title step applies to every clipping strategy, including Even Clips; it does not change the selected timestamps. The generated title is clip metadata, not text burned into the video. Add a [Style Video](/nodes/style-video) node afterward when you want visible title text in the finished video. ## Runtime configuration When you manually launch a workflow that includes Find Clips, open **Runtime Configuration** to add one-run guidance without changing the saved workflow. * **Prompt adjustment** adds temporary instructions to the saved Find Clips prompt. * **Timestamp ranges** accepts source-video start and end times. Use **Guaranteed clips** to include exact ranges as clips, or **Search within** to find individual clips inside those ranges. ## Build the rest of the workflow After Find Clips, continue with editing nodes such as [Style Video](/nodes/style-video), [Convert to Vertical](/nodes/reframe), or [Audiogram](/nodes/audiogram). Finish with an export node so the workflow has a destination for the clips it creates. # Frameio Source: https://docs.overlap.ai/nodes/frameio Start a workflow when a new video is uploaded to a Frame.io project folder. > Start a workflow automatically when a new video finishes uploading to a monitored Frame.io folder. The **New Frame.io Video** trigger is for teams whose source content lives in Frame.io. Point it at a project folder, and every new video uploaded there is pulled into Overlap and sent through the rest of your workflow — the same way the [New Dropbox Video](/nodes/dropbox) trigger works for Dropbox. A connected Frame.io account is required before Overlap can monitor folders. ### Schema * **Input**: The Frame.io project folder to monitor * **Output**: The new Frame.io video that starts the workflow ## Connect Frame.io The first time you configure the node, click **Connect Frame.io** in the right-side settings panel. Sign in with your Adobe/Frame.io credentials and approve access. Overlap keeps the connection alive automatically; if it ever expires you'll get a notification asking you to reconnect. ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. In the **Trigger** stage, choose **New Frame.io Video**. Overlap adds the trigger node to the canvas and opens its settings on the right. ## Choose the Frame.io folder In the settings panel, click **Select Folder**. The picker walks the Frame.io hierarchy — account, workspace, project, and folders inside the project. Open the project you want to monitor and either select its root folder (to watch the whole project) or drill into a subfolder. Until a folder is selected, the node shows **Folder required • Set in right panel** on the canvas. New videos uploaded to the selected folder — including anything in its subfolders — start the workflow as soon as the upload completes. ## Build the rest of the workflow After the trigger is configured, continue with nodes such as [Find Clips](/nodes/findclips), [Style Video](/nodes/style-video), or [Reframe](/nodes/reframe). Finish with an export node, then click **Publish** when the workflow is ready to listen for new Frame.io videos. # Image overlay Source: https://docs.overlap.ai/nodes/image-overlay Add an image or video overlay to clips in a workflow. **Legacy node:** Existing media overlay nodes remain supported. For new workflows, add image or video overlay layers in [Style Video](/nodes/style-video). > Add a media overlay on top of every video or clip that reaches this node. The **Image Overlay** page documents the **Media Overlay** node in the workflow builder. Use it when you want to place an uploaded image or video over the source video, such as a full-screen frame, a visual treatment, or another reusable media layer. ### Schema * **Input**: Video or clips from an upstream trigger or editing node * **Output**: Video or clips with a media overlay applied ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger first, such as **Manual Trigger** or **New YouTube Video**. In the **Editing** stage, choose **Media Overlay**. Overlap adds the action node to the canvas and connects it to the workflow path. Click the **Media Overlay** node on the canvas whenever you need to reopen its settings on the right side. Media Overlay node settings panel ## Choose an overlay asset Use **Select from assets** when the overlay file already exists in your workspace. To upload a new file, use **Add Media Overlay** in the settings panel. The upload area accepts an image or video file by drag and drop, or you can click the upload area to select a file from your computer. Until a file is selected, the node shows **No overlay** on the canvas. ## Configure the overlay The current settings panel describes Media Overlay as a way to add an image or video overlay with scaling and opacity controls. The node card also describes position and timing controls for the selected overlay. Use these controls to place the overlay where it should appear in the clip, size it for the video format, and tune how strongly it appears over the source footage. ## Build the rest of the workflow Place **Media Overlay** after the node that provides the video or clips you want to modify. A common flow is [Manual Trigger](/nodes/manual-trigger) -> [Find Clips](/nodes/findclips) -> **Media Overlay** -> [Style Video](/nodes/style-video) -> **Post to Social**. For new workflows, use [Style Video](/nodes/style-video) when you need a watermark-style brand mark, generated title text, or multiple visual elements in one node. # Manual trigger Source: https://docs.overlap.ai/nodes/manual-trigger Start a workflow by running it yourself with a video. > Start a workflow on demand by dropping in a video instead of waiting for a source trigger. The **Manual Trigger** is for workflows that should run only when you start them yourself. Use it for one-off videos, workflow tests, or any workflow that does not need to listen automatically for new YouTube, RSS, Dropbox, or livestream content. ### Schema * **Input**: A video you manually provide when you run the workflow * **Output**: Video/clips output for the rest of the workflow ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. In the **Trigger** stage, choose **Manual Trigger**. Overlap adds the trigger node to the canvas, selects it, and moves the left panel forward to **Editing** so you can keep building the workflow. Manual Trigger node selected in the workflow builder ## Configure the trigger The current **Manual Trigger** node does not have a right-side settings panel or advanced settings. Its run action appears directly on the selected node as **Manual trigger - Click Run**. Click **Manual trigger - Click Run** when you want to start the workflow with a video you choose manually. ## Build the rest of the workflow After the trigger is in place, continue in **Editing** with nodes such as [Find Clips](/nodes/findclips), [Style Video](/nodes/style-video), or [Reframe](/nodes/reframe). Finish with an export node such as **Email** or **Post to Social** so each manual run has a clear destination. # Overview Source: https://docs.overlap.ai/nodes/overview > Use nodes to decide how a workflow starts, what happens to the content, and where the finished result goes ## What nodes are A **node** is one step in your workflow. You add nodes to the workflow canvas, connect them in order, and Overlap runs that path from input to output. A simple workflow might start with a source like YouTube or RSS, pass through clip-selection and editing nodes, and finish with an export like social posting or email. You may still see older `clipping agent` language in some parts of the product. In the current docs, we use `workflow` for the automation and `node` for each step inside it. ## Where to add nodes Open **Workflows** from the left sidebar and click **New** to open the builder. The current builder is organized into three stages: 1. **Trigger** 2. **Editing** 3. **Export** Each stage has a searchable node panel on the left. Start with the empty builder, then click **Manual Trigger** to place the first node on the canvas and move into **Editing** to keep building. You can also use **Double Click** anywhere on the canvas to add a new node, or choose **Explore Templates** if you want to start from a prebuilt flow. Empty workflow builder Workflow builder with a trigger node added ## Trigger nodes Trigger nodes decide what starts the workflow. In the current builder, the **Trigger** stage includes options such as: * **Manual Trigger** * **Audio Livestream** * **New Dropbox Video** * **New YouTube Video** * **RSS Feed** Choose the trigger that matches how new content should enter the workflow. Use **Manual Trigger** when you want to launch runs yourself. Use one of the source-based triggers when you want Overlap to listen for new content automatically. ## Editing nodes Editing nodes shape the clip after the workflow has a source. This is where you tell Overlap what moments to find, how the video should look, and what should be added before export. Common editing nodes documented in this section include: * [Find Clips](/nodes/findclips) * [Style Video](/nodes/style-video) * [Remove Fluff](/nodes/remove-fluff) * [Remove Filler Words](/nodes/filler-words) * [Remove Curse Words](/nodes/remove-curse-words) * [Smart Zoom](/nodes/smart-zoom) * [Reframe](/nodes/reframe) * [Split](/nodes/split) * [Ask AI](/nodes/ask-ai) * [Audiogram](/nodes/audiogram) * [Add Music](/nodes/add-music) * [Delay](/nodes/delay) Think of the **Editing** stage as the part of the workflow where you build your processing chain. You can keep it minimal, or combine multiple editing nodes when you want more control over the final result. The standalone [Add Subtitles](/nodes/subtitles), [Add Title Overlay](/nodes/title-overlay), [Add Watermark](/nodes/add-watermark), and [Add Outro](/nodes/add-outro) nodes are **deprecated but supported**. Existing workflows continue to run, but new workflows should configure those elements in [Style Video](/nodes/style-video). ## Export nodes Export nodes decide what Overlap does with the finished output. In the current builder, the **Export** stage includes options such as: * **Email** * **Post to Social** Use export nodes at the end of the flow so the workflow has a clear outcome after processing is complete. Export nodes in the workflow builder ## A common node flow One practical way to think about nodes is: * A trigger brings content into the workflow * Editing nodes decide what clips get created and how they look * An export node sends the finished result somewhere useful For example, a workflow might look like: * **New YouTube Video** -> **Find Clips** -> **Style Video** -> **Post to Social** * **New YouTube Video** -> **Find Clips** -> **Remove Fluff** -> **Style Video** -> **Post to Social** * **Manual Trigger** -> **Find Clips** -> **Split** -> different editing or export branches * **Manual Trigger** -> **Find Clips** -> **Ask AI** -> answer-specific editing or export branches * **Manual Trigger** -> **Remove Filler Words** -> **Remove Curse Words** -> **Smart Zoom** -> **Style Video** -> **Email** * **RSS Feed** -> **Find Clips** -> **Style Video** -> **Email** ## Keep exploring Start a workflow from YouTube, RSS, Dropbox, audio livestreams, or a manual run. Guide Overlap toward the moments you want it to surface from each source. Add subtitles, titles, graphics, an outro, and color grading in one node. # Post to social Source: https://docs.overlap.ai/nodes/post-to-social Send workflow clips to Overlap's social posting layer. > Share the clips produced by a workflow through connected social accounts. The **Post to Social** export node is for workflows that should end by sending finished clips toward social publishing. Use it after the workflow has created or edited clips and you want those clips to become outgoing posts in Overlap. ### Schema * **Input**: Clips Output * **Output**: Social posts for connected accounts ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. After you have a trigger and any editing nodes in place, open the **Export** stage and choose **Post to Social**. Overlap adds the export node to the canvas with **Clips Output** as its input. Click the node on the canvas to open its settings on the right side. Post to Social node settings panel ## Configure the destination In the right-side settings panel, choose where the generated posts should go. The current settings include: * **Where should this post go?**: choose the social platform, such as TikTok. * **To which account?**: choose the connected account that should publish the posts. * **Who should draft the post?**: choose the posting persona that should draft the post copy. If no destination is ready, the node shows **Incomplete** and displays the selected platform with **No account**. Connect the account you want to post from, then return to the workflow and confirm the export node is ready. Use [Linking your Socials](/essentials/linking) when you need to connect or reauthorize an account. To create a persona without leaving the workflow, choose **Add New Persona** and use **Enhance with AI** to improve the prompt you entered. You can also use **Posting Personas** from the left sidebar to create or adjust personas. When the source includes stored speaker metadata, Overlap can give the posting persona the speakers' names, roles, companies, and context while drafting the caption. The persona only uses that metadata when the clip transcript supports the connection. This does not perform external research, and clips without stored speaker context continue using their existing people names. ## Visibility Some platforms add a **Visibility** control below the destination settings. It applies to every post this node creates. * **YouTube** and **YouTube Shorts**: choose **Public**, **Unlisted**, or **Private**. * **Facebook**: choose **Public** or **Draft**. Choosing **Draft** for Facebook sends each post to the Drafts tab of your Meta Business Suite instead of publishing it to the Page. The clip still moves through the normal workflow: it is scheduled on the [Social Calendar](/essentials/social-calendar) like any other post, and when its scheduled time arrives Overlap creates the draft. Publish it yourself from Meta Business Suite when you are ready. Two things to know about Facebook drafts: * Facebook keeps drafts and published posts in separate places, so a draft has no public link and reports no views, likes, or comments. Overlap does not collect analytics for it. * Because the draft is not live, it does not count as a published post on the Page. Leaving Visibility on **Public** keeps the existing behavior — the post publishes to the Page at its scheduled time. ## Facebook Reels and collaborators When the destination is Facebook, two extra controls appear. **Post as Facebook Reel** publishes each clip to the Reels tab rather than as a normal feed video. Leave it off and nothing changes — posts keep going to the feed exactly as before. **Collaborator** invites one other Facebook Page to co-author every Reel this node posts. Once that Page accepts, the Reel appears on both Pages and they share the same view and engagement counts. Search for the Page by name and pick it from the list. Facebook's Page search matches on name, so several similar Pages can come back — use the link beside each result to open a Page and confirm before choosing it. A verified badge marks the official Page. If the Page is too new to appear in search, paste its full Facebook Page URL instead and Overlap will resolve it directly. Things to know: * Collaborators only work on Reels. The control stays disabled until **Post as Facebook Reel** is on. * A collaborator cannot be added to a **Draft** post — Facebook holds the Reel unpublished, so there is nothing for the other Page to accept. * One collaborator per Reel. * Facebook allows roughly **10 collaborator invites per Page per day**, shared across every workflow posting from that Page. Beyond that Facebook declines the invite. * The invite is separate from the post. A Reel can publish successfully while Facebook declines the invite — most often because the collaborator Page is in the same Meta Business portfolio as the posting Page, or has collaboration turned off. When that happens the post still succeeds and Overlap records why the invite did not land. * Acceptance is up to the other Page and can take a while; until they accept, the Reel appears only on your Page. The same controls are available per-post in [Compose](/essentials/social-calendar) when you post to Facebook by hand. ## Thumbnail preset The **Thumbnail** section lets you pick one of your [Thumbnail Presets](/essentials/brand-kits#thumbnail-presets), or **None**. When a preset is selected, every post this node schedules gets its own generated thumbnail: Overlap picks a frame from the clip (or uses the fixed time / clip thumbnail the preset asks for), cuts out the subject and prepares the background if the preset uses them, writes the headline from the preset's instruction, and renders the result with the same engine the editor uses. Presets are sized for one aspect ratio, and the picker only shows the ones that fit this route: if a [Convert to Vertical](/nodes/reframe) node runs before this one, the clips arriving here are vertical and only 9:16 presets are offered; without one they stay the source's 16:9 and only 16:9 presets are offered. If none of your presets match, the section says so — create one in that shape from **Brand Kits → Thumbnail Presets**. A preset chosen before the route changed shape stays selected and is flagged, so you can swap it or fall back to the clip thumbnail rather than have it silently cropped. Two things to know: * YouTube Shorts do not accept custom thumbnails; the preset applies to long-form YouTube uploads only. * If generation fails for a clip, the post is still scheduled and uses the clip's regular thumbnail. The generated thumbnail belongs to the scheduled post, not the clip — the clip's own thumbnail is untouched, and you can **Edit thumbnail** from the post's card on the [Social Calendar](/essentials/social-calendar). ## Posting Cadence Use **Posting Schedule** to control how aggressively the workflow schedules posts. The cadence is written as: * **Post up to**: the maximum number of posts Overlap should schedule in each cadence window * **times every**: the length of the cadence window * **for**: how long the workflow should keep scheduling posts from the generated output For example, **Post up to 3 times every 1 days for ∞ days total** means Overlap can schedule up to three posts per day and keep spreading available posts into future days until there are no more posts to place. Turn on **Require approval from user** when you want posts to wait for manual approval before they publish. Approval-required posts can be reviewed from [Social Calendar](/essentials/social-calendar). The **Don't schedule posts if there are already scheduled posts for the same time slot on this social account** setting ensures that posts are not double-booked for the same time slot. When this option is enabled, the workflow will not schedule a post if another post is already scheduled at that time for the selected account, even if you run the workflow multiple times. For example, if the cadence is set to 1 post per day and you run the workflow 3 times in one day, with this option turned off, you would end up with 3 posts scheduled for the same day. With it turned on, the workflow will only schedule one post per day, spreading additional posts into future days without exceeding the cadence limit. ## Reposting Reposting is rolled out per organization. If you do not see **Repost clips intermittently** in the node's Posting Schedule, the feature is not enabled for your organization yet — contact Overlap support to have it turned on. Turn on **Automatically repost clips after the original post** under **Repost clips intermittently** to schedule each clip again after its original post time. Set the schedule as **Repost every \[X] days, up to \[N] times** — by default every 30 days, up to 3 times (so 30, 60, and 90 days after the original). The interval can be as short as 1 day, and a clip can be reposted at most 5 times; reposts that would land more than a year out are dropped. Each repost: * reuses the original post's caption, title, and platform options, and posts to the same account * is scheduled at the same time of day as the original, offset by the number of days you chose — if that day is already full under your posting schedule, the repost moves to the next day that has room * appears on the [Social Calendar](/essentials/social-calendar) as its own post, so you can edit its copy, move it, or cancel it individually without affecting the original * follows the same approval rule as the original — if **Require approval from user** is on, reposts also wait for approval Reposts never crowd out original posts. When the double-booking setting above is on, each repost is placed on the first day at or after its chosen delay that still has room in your posting schedule, so adding reposts can push them a few days past the delay you set rather than exceeding your cadence. A repost that cannot find room within a month of its target is skipped, as are reposts beyond the 250 posts a single workflow run can schedule (originals always keep their slots, and the nearest reposts are kept first). Reposts also count as scheduled posts for the double-booking check, so later workflow runs schedule around them. ## Build the rest of the workflow Use **Post to Social** at the end of a complete workflow path. A common flow is [New YouTube Video](/nodes/youtube) -> [Find Clips](/nodes/findclips) -> [Style Video](/nodes/style-video) -> **Post to Social**. After the workflow creates outgoing posts, use [Social Calendar](/essentials/social-calendar) to review scheduled posts, adjust copy or timing, and approve anything that requires manual review before publishing. # Reframe Source: https://docs.overlap.ai/nodes/reframe Reframe landscape clips into vertical format for short-form channels. > Reframe landscape video into vertical clips for Shorts, Reels, TikTok, and other 9:16 channels. The **Convert to Vertical** node is an editing action that changes the visual composition of incoming video or clips. Use it when your workflow starts with landscape footage and should produce vertical output before export. ### Schema * **Input**: Video or clips from an earlier workflow node * **Output**: Vertically reframed clips ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger first, such as **Manual Trigger** or **New YouTube Video**. In the **Editing** stage, choose **Convert to Vertical**. Overlap adds the action node to the canvas and connects it to the workflow path. Click the **Convert to Vertical** node on the canvas whenever you need to reopen its settings on the right side. Convert to Vertical node settings panel ## Choose a model Use **Model** to decide how Overlap should build the vertical composition. * **Content-Aware Reframing**: follows the active speaker and updates the crop or layout as the scene changes. This is the default model and corresponds to the API's content-aware styles, including `adaptive`. * **Static Reframing**: keeps the source centered in the vertical frame instead of following speakers. This corresponds to `style_three` in the API. ### Content-Aware Reframing (`adaptive`) Use `adaptive` for speaker-following reframes, especially webinars, remote recordings, screen shares, or other footage with on-screen content. Overlap can switch focus as the active speaker changes and can combine speakers with shared content in the vertical layout. * **Use Split View for Multiple Speakers** (`split_view`): allows a split layout when multiple speakers are visible. Turn it off to keep the reframe in a single-speaker layout. * **Always Prefer Split View** (`force_split_view`): when split view is enabled and at least two people are visible, keeps them in a split layout instead of switching to a single focused speaker. * **Always fill the frame** (`full_frame_single`): single-speaker scenes fill the whole vertical frame instead of sitting in a shorter band with blurred bars above and below. The crop stays on whoever it was following and widens to reach the edges. Wide shots with several people are left padded, since no single vertical crop can hold them all. * **Include on-screen content** is the inverse of `ignore_content_tiles`. When content is included (`ignore_content_tiles: false`), Overlap can detect a webinar slide, screen share, gameplay, or other content shown beside the speakers and place that content in the lower part of the vertical frame. Set `ignore_content_tiles: true` to leave those content tiles out and frame the speakers instead. ### Static Reframing (`style_three`) Use `style_three` for a fixed composition. The horizontal source stays centered in the vertical canvas and does not follow the active speaker. At lower zoom levels, the unused space above and below the source is black when **Background Blur** is off, or filled with a blurred version of the video when it is on. Increase **Zoom Level** to crop more of the source and fill more of the 9:16 frame; **Vertical Position** moves the centered source composition up or down. ## Configure the reframe When **Content-Aware Reframing** is selected, set **How do you film?** to match the source footage: * **In-Person Studio**: use this for filmed conversations, interviews, panels, or other studio-style recordings. * **Online or with Overlays**: use this for screen recordings, remote calls, or videos where overlays are part of the layout. When **Static Reframing** is selected, **Zoom Level** starts at `1x`. API values below `1` are normalized to `1x` before the reframe request is sent. ### Video game sources Video-game reframing is rolling out to selected accounts. If you do not see the **Gaming** option under **How do you film?**, the feature is not enabled for your organization yet — contact Overlap support to request access. Workflows from accounts without access are reframed as camera footage even if the setting was applied earlier. Under **Content-Aware Reframing**, choose **Gaming** in the **How do you film?** grid for gameplay footage or streams with a facecam. Overlap then requests the reframe service's video-game mode for every clip this node processes; the other filming options (In-Person Studio, Online or with Overlays, Sports) reframe as normal camera footage. The setting sits here, on the node that does the reframing, so the same clips can be reframed differently by different branches of a workflow. Overlap still looks at each scene and picks the treatment per scene: * **Player-view games** — first-person and over-the-shoulder games such as shooters, survival sandboxes, and cockpit driving views — get a fixed, centered crop. The game already frames its own action, so there is no camera animation. * **World-camera games** — MOBAs, real-time strategy, isometric and top-down strategy, and sports or management sims — keep following the action, because it moves around the frame. * **Racing** footage, including racing games, keeps its vehicle tracking. * **Streams with a facecam** get the stacked layout: the webcam above the game feed, both held as fixed boxes. Overlap looks for the webcam inset directly on video-game sources, so a small corner cam is still found even when it does not read as a separate panel. The video-game treatment applies to **Content-Aware Reframing** only. **Static Reframing** already holds a fixed, centred crop and does not analyse scene layout, so it needs no game-specific handling — a video-game source there simply stays centred, and the facecam is not split out into its own panel. Choose Content-Aware Reframing if you want the stacked facecam layout. Use the preview beside the settings panel to check how the workflow will modify clips before you publish the workflow. ## Build the rest of the workflow Place **Convert to Vertical** after the node that provides the video or clips you want to reframe. If your workflow finds moments first, connect [Find Clips](/nodes/findclips) before this node. Add finishing nodes such as [Style Video](/nodes/style-video) or an export node after the vertical conversion. # Remove curse words Source: https://docs.overlap.ai/nodes/remove-curse-words Remove or silence profanity and custom words in workflow outputs. > Clean up profanity and other blocked words before clips move on to finishing or export. The **Remove Curse Words** node is an **Editing** action node for processing profanity and inappropriate language in a workflow. Use it after the workflow has a video or clips to process, and before any downstream node that should use the cleaned result. ### Schema * **Input**: Video or clips from an earlier workflow node * **Output**: Video/clips output with the selected profanity cleanup applied ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger or source node first. When the builder moves to the **Editing** stage, choose **Remove Curse Words** from the left node panel. Overlap adds it as an action node on the canvas. Click the **Remove Curse Words** node on the canvas whenever you need to reopen its settings on the right side. Remove Curse Words node settings panel ## Choose how profanity is processed The node is enabled by default and automatically detects common profanity. Use the right-side settings panel to decide how Overlap should process the video/audio and transcript. * **Audio/Video Processing**: The default setting is **Silence Audio**. * **Transcript Processing**: The default setting is **Keep Original**. With the default settings, Overlap silences curse words in the audio while keeping the original transcript text. ## Add custom words Use **Add Custom Word** when the workflow should also process words beyond the default profanity list. Type a word in the custom word field, then click the **+** button to add it to the node. The settings panel notes that Overlap automatically detects common profanity plus any additional words you specify. ## Place it in the workflow Place **Remove Curse Words** after the node that produces the video or clips you want to clean. For a clip workflow, a common order is: * **Find Clips** -> **Remove Curse Words** -> **Style Video** -> export For a manual cleanup workflow, you can place it directly after **Manual Trigger** and then continue into subtitles, reframing, branding, or export. ## Build the rest of the workflow After profanity cleanup is configured, continue with finishing nodes such as [Style Video](/nodes/style-video), [Reframe](/nodes/reframe), or an export node. Click **Publish** when the workflow is ready to run. # Remove fluff Source: https://docs.overlap.ai/nodes/remove-fluff Tighten clip pacing with editorial cuts in a workflow. > Use the General Editor to tighten clip pacing with editorial cuts. The **Remove Fluff** node is an **Editing** action node for making clips feel tighter before export. Use it after the workflow has a video or clips to process, and before downstream finishing nodes that should receive the tightened result. ### Schema * **Input**: Video or clips from an earlier workflow node * **Output**: Clips output with Remove Fluff editorial cuts applied ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger or source node first. When the builder moves to the **Editing** stage, choose **Remove Fluff** from the left node panel. Overlap adds it as an action node on the canvas. Click the **Remove Fluff** node on the canvas whenever you need to review its state. Remove Fluff node on the workflow canvas ## Review the node state The node card describes the action as **Use the General Editor to tighten clip pacing with editorial cuts**. By default, the card shows **No Remove Fluff instructions** and marks the node as **Incomplete**. Keep the node after the step that produces the clips you want to tighten. ## Place it in the workflow Use **Remove Fluff** when the clip has the right moment but needs tighter pacing. For a clip workflow, a common order is: * **Find Clips** -> **Remove Fluff** -> **Style Video** -> export For a manual editing workflow, you can place it after **Manual Trigger** and continue into subtitles, reframing, branding, or export. ## Remove fluff in Studio Open a clip in **Studio**, choose **AI Tools**, and expand **Remove Fluff** under **Video Edits**. Click **Remove Fluff** to analyze the loaded transcript and automatically tighten the clip's timeline. The edit is applied as a normal Studio timeline change, so use the existing **Undo** and **Redo** controls to review or revert it. Expand **Advanced settings** before running the tool when you want to give the editor a specific instruction. ## Build the rest of the workflow After Remove Fluff is in place, continue with finishing nodes such as [Style Video](/nodes/style-video), [Reframe](/nodes/reframe), or an export node. Click **Publish** when the workflow is ready to run. # Rss Source: https://docs.overlap.ai/nodes/rss Start a workflow when a configured RSS, Atom, podcast, or blog feed publishes a new entry. > Start a workflow automatically when a configured feed publishes a new entry. The **RSS Feed** trigger is for always-on workflows that should watch a feed and send new entries into the rest of your workflow. Use it for podcast feeds, blog feeds, or any supported RSS or Atom source. If you want to run one media file by hand, use **Manual Trigger** instead. ### Schema * **Input**: An RSS feed URL * **Output**: The new feed entry that starts the workflow ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. In the **Trigger** stage, choose **RSS Feed**. Overlap adds the trigger node to the canvas, selects it, and moves the left panel forward to **Editing** so you can continue building the workflow. Click the **RSS Feed** node on the canvas whenever you need to reopen its settings on the right side. RSS Feed node settings panel ## Configure the feed In the right-side settings panel, fill in **RSS Feed URL**. The field accepts: * RSS 2.0 feeds, such as `.rss` or `.xml` URLs * Atom feeds, such as `.atom` URLs * podcast feeds from services like Spotify or Anchor * blog feeds from services like WordPress or Medium Overlap verifies that the URL contains valid RSS content before the workflow can listen for new entries. ## Build the rest of the workflow After the trigger is configured, continue in **Editing** with nodes such as [Find Clips](/nodes/findclips), [Style Video](/nodes/style-video), [Reframe](/nodes/reframe), or [Audiogram](/nodes/audiogram). Finish with an export node, then click **Publish** when the workflow is ready to listen for new feed entries. # Smart zoom Source: https://docs.overlap.ai/nodes/smart-zoom Add quick emphasis zooms to the important parts of workflow clips. > Periodically zoom in on the most important part of the video for emphasis. The **Smart Zoom** node is an editing action that adds short emphasis zooms to incoming video or clips. Use it when you want Overlap to automatically draw attention to important visual moments before the workflow exports the result. ### Schema * **Input**: Video or clips from an upstream trigger or editing node * **Output**: Clips with Smart Zoom applied ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger first, such as **Manual Trigger** or **New YouTube Video**. In the **Editing** stage, choose **Smart Zoom**. Overlap adds the action node to the canvas and connects it to the workflow path. Smart Zoom node in the workflow builder ## Review the zoom behavior The current Smart Zoom node applies the default **Smart Zoom (MEDIUM)** behavior. The node card shows the effect summary and a default **Duration** of `0.1s`. Smart Zoom does not expose additional configuration controls in the current builder. To change the surrounding edit, place it before or after other editing nodes depending on what should happen first. ## Build the rest of the workflow Place **Smart Zoom** after the node that provides the video or clips you want to emphasize. A common flow is [New YouTube Video](/nodes/youtube) -> [Find Clips](/nodes/findclips) -> **Smart Zoom** -> [Style Video](/nodes/style-video) -> **Post to Social**. Finish the workflow with an export node, then click **Publish** when the workflow is ready. # Split Source: https://docs.overlap.ai/nodes/split Route clips into weighted workflow branches. > Split sends clips into two or more downstream workflow branches by weight. The **Split** node is an editing action for branching a clip workflow. Use it after a node that outputs clips when you want different portions of the clip set to follow different downstream paths. ### Schema * **Input**: Clips from an upstream workflow node * **Output**: Weighted clip branches ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Add a trigger and a clip-producing node first, such as [Manual Trigger](/nodes/manual-trigger) -> [Find Clips](/nodes/findclips). In the **Editing** stage, choose **Split**. Overlap adds the action node to the canvas. ## Configure branches Use **Branches** to choose `2`, `3`, or `4` output branches. Each active branch has a percentage weight. The active weights always add up to `100%`. For example: * `70 / 30` sends roughly 70% of clips to branch 1 and 30% to branch 2. * `50 / 30 / 20` sends clips across three branches by that ratio. Split assigns clips deterministically, so the same input clips and weights produce the same branch assignment each run. ## Connect branch outputs Each Split branch has its own output handle on the right side of the node. Connect each branch to the downstream editing or export path you want. Branches that receive no clips for a run simply stop; the rest of the workflow continues through populated branches. ## Build the rest of the workflow A common flow is [Manual Trigger](/nodes/manual-trigger) -> [Find Clips](/nodes/findclips) -> **Split**. From there, one branch might add [Style Video](/nodes/style-video) with subtitles, another might use a different Style Video treatment with a watermark, and another might go directly to [Post to Social](/nodes/post-to-social). Finish each active path with the action or export nodes that match your content plan. # Style video Source: https://docs.overlap.ai/nodes/style-video Use a template or build a custom visual treatment with titles, subtitles, graphics, an outro, and color grading. > Style every clip from one editing node. **Style Video** is the primary workflow node for titles, subtitles, watermarks, media overlays, lower thirds, outro end cards, outro audio, and color grading. It replaces the separate Add Subtitles, Add Title Overlay, Add Watermark, and Add Outro nodes for new workflows. Background music remains available through the separate [Add Music](/nodes/add-music) node. ### Schema * **Input**: Clips * **Output**: Styled clips * **Node type**: `style_video` * **Required styling fields**: None **All Style Video fields are optional.** An empty Style Video node is valid and passes clips through unchanged. ## Add the node Open **Workflows**, create or edit a workflow, and add a trigger or another node that outputs clips. In the **Editing** stage, select **Style Video**. Click the node on the canvas whenever you want to reopen its settings. The settings panel opens with two tabs: * **Templates** for starting from a saved look * **Create your own** for building or changing the style layer by layer ## Choose how you want to work You can use Style Video in three different ways. | Approach | How to start | Where the result is saved | | -------------------------- | ----------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | | Use a template | Select a look in **Templates**, then optionally adjust it in **Create your own**. | The selected configuration is stored on this Style Video node. | | Create a reusable template | Select **Blank** or start from a template, customize the elements, and click **Save Template**. | The configuration stays on the node and is also added to your reusable template gallery. | | Create a one-off style | Select **Blank** or customize any template, then skip **Save Template**. | The configuration stays on this node only and is not added to the template gallery. | **Save draft** or **Publish** saves the Style Video configuration with the workflow. **Save Template** is a separate, optional action that makes the same look reusable elsewhere. ## Start from a template Open **Templates**, then use **Vertical** or **Landscape** to filter the gallery. The filter only changes which templates are shown. Each template keeps the aspect ratio and visual treatment with which it was saved. Select a template tile to apply that complete look. Then open **Create your own** to add clip-specific text or graphics, change an element, remove an element, or adjust the color grade. Select **Blank** when you want no starting template and would rather build the stack from scratch. Selecting another template replaces the Style Video setup currently on the node. Choose the starting template before making detailed custom changes. ## Create your own style The **Create your own** tab organizes the node into five sections. Every section is optional, and you can use any combination of them. | Section | What you can add | Main controls | | --------------------- | -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **01 Title Text** | One or more title overlays | Generate a title from each clip with a prompt or enter fixed text. Choose a title template and palette, then configure duration, intro and outro transitions, typography, background, position, dynamic positioning, and face avoidance. | | **02 Subtitles** | One subtitle layer | Choose a preset or customize caption placement, wrapping, typography, colors, backgrounds, animation, and speaker styling. You can also reposition and resize the subtitle area in the preview. | | **03 Graphics** | Watermarks, image or video overlays, and one lower third | Choose media, position and size it, set timing and transitions where available, and style speaker identification. You can add multiple watermarks and media overlays. | | **04 Outro End Card** | An end card, outro audio, or both | Choose the closing visual or audio, set its timing and duration, and control audio volume. The outro always renders as the final segment. | | **05 Color Grading** | A preset look or manual grade | Compare **Original**, **Clean**, **Warm Film**, **Cool**, **Punchy**, and **Mono**, or use the Light, Color, and Finishing adjustments with the live RGB histogram. | Adding an element opens its detailed editor. Return to **All Elements** to see the complete stack. An existing element can be opened for editing, disabled without deleting its settings, or removed from the node. ### Title Text Use **Add Title Overlay** for a headline near the start of each clip. A title can be generated independently for every clip from the **Title Generation Prompt**, or it can use fixed copy. The preview text lets you design the title before a workflow run generates the final clip-specific text. Title controls include reusable title templates, palettes, timing, entry and exit transitions, font and spacing, background and shadow treatments, and vertical placement. **Dynamic Position** can anchor a title to a detected split-view seam, while **Avoid Faces** moves it away from detected people and subjects. ### Subtitles Use **Add Subtitles** to choose one caption treatment for the node. Start from a subtitle preset, then customize positioning, line length and count, typography, colors, background treatment, highlights, animation, and speaker-specific styling. The preview updates as you work. Only one subtitle layer can be added to a Style Video node. If subtitles are not needed, leave the section empty. ### Graphics The Graphics section can contain: * **Watermark**: a logo or brand mark pinned to a chosen position * **Media Overlay**: an image or video placed over the clip for branding, context, or additional visuals * **Lower Third**: a speaker name and role near the lower edge of the frame You can add multiple watermarks and media overlays, but only one lower-third treatment. When a section contains multiple elements, use its forward and back controls to change their order within that section. ### Outro End Card Use **Add an End Card** to configure a closing visual, an optional outro audio sting, or both. The outro is a terminal timeline segment rather than a normal overlay, so it always closes the clip after the visual stack. ### Color Grading The **Looks** tab compares the current video frame with each built-in grade. The **Adjustments** tab provides a live RGB histogram and controls for exposure, brightness, contrast, highlights, shadows, saturation, vibrance, temperature, tint, fade, vignette, blur, and film grain. Color grading affects the base video. Subtitles, titles, watermarks, lower thirds, and media overlays keep their authored colors. Custom `.cube` LUT files are not currently supported. ## Understand the visual order The editor labels the stack **FRONT → BACK**. Title Text is in front of Subtitles, and Subtitles are in front of Graphics. Multiple elements inside the same section can be moved forward or back with the arrow controls. The Outro End Card and Color Grading sections behave differently from visual layers: the outro is always the final timeline segment, and color grading is applied to the base video behind the authored elements. ## Save a reusable template After configuring the node, click **Save Template**, enter a template name, and keep the preview open while Overlap renders the template preview. Overlap joins the first and last six seconds of the current preview into a lightweight GIF and saves the reusable configuration to your account. Personal templates are marked **Yours** and appear before Overlap templates in the gallery. A saved template retains the reusable visual treatment, including subtitle and title styling, generation prompts, graphics, lower thirds, outro settings, and color grading. Generated title output is not reused as fixed content; the title can be generated again for each new clip. You do not need to save a template to use the node. For a one-off setup, simply configure the node, skip **Save Template**, and save or publish the workflow as usual. The style will apply whenever that workflow runs, but it will not appear as a reusable template in the gallery. ## API configuration `style_video_config` is a versioned object. The wrapper requires `version` and `layers`, but the styling elements themselves are optional and `layers` may be empty. Every layer uses a stable, unique `id`. ```json theme={null} { "nodeConfigs": { "style_video": { "style_video_config": { "version": 1, "layers": [ { "id": "captions", "type": "subtitles", "enabled": true, "config": { "speakerStyles": [ { "styleId": "black-rounded", "subtitleY": 72 } ] } }, { "id": "brand-mark", "type": "watermark", "enabled": true, "config": { "enabled": true, "url": "https://cdn.example.com/logo.png", "position": 2, "size": 12, "padding": 2 } } ], "outro": { "endCardOption": { "url": "https://cdn.example.com/end-card.png", "duration": 5, "secondsBeforeEnd": 0 } }, "colorGrading": { "exposure": 8, "contrast": 12, "temperature": 6, "vignette": 10, "grain": { "amount": 8, "size": 1.5, "opacity": 0.3, "animated": true } } } } } } ``` See [Node Config](/api-reference/node-config-overrides) for override behavior and the complete field shape. ## Deprecated standalone nodes The standalone Add Subtitles, Add Title Overlay, Add Watermark, and Add Outro nodes are **deprecated but supported**. Existing nodes remain editable and executable, and saved workflows are not migrated automatically. They are no longer offered as separate additions for new workflows; use Style Video instead. # Subtitles Source: https://docs.overlap.ai/nodes/subtitles Deprecated but supported standalone node for generating styled subtitles. **Deprecated but supported:** Existing Add Subtitles nodes remain editable and executable. For new workflows, add subtitles in [Style Video](/nodes/style-video). > Generate and style subtitles for every clip that reaches this node. ### Schema * **Input**: Video or clips from an upstream trigger or editing node. Video inputs are converted to a full-source clip automatically. * **Output**: Clips annotated with the selected subtitle configuration This node does not burn subtitles into the media file while the workflow runs. It stores the selected style on each clip so the frontend can preview subtitles and the export renderer can apply them later. ## Open an existing node Open a workflow that already contains **Add Subtitles**, then click the node on the canvas to open its subtitle style panel. The node is no longer available as a new palette addition; use [Style Video](/nodes/style-video) in new workflows. Add Subtitles node settings panel ## Choose a subtitle style The right-side panel opens to **Styles** with a clip preview and preset subtitle looks. Current presets include options such as **Subway Surfers**, **Elegant Speech Highlight**, **Blocky Bounce**, **Standard Loud**, **Plain Black**, **Murder Mystery**, **Futuristic**, **Blue Highlight**, **Fancy Highlight**, and **Smooth Fade**. Until a style is selected, the node shows **No subtitles selected** and marks the setting as required. Select a preset to apply it, or click **Customize** on a preset when you want to adjust the style before using it. Use **Choose All Speakers** when the same subtitle style should apply across detected speakers. ## Customize the style Click **Customize** on a preset to open the subtitle editor. The current controls include: * **Y Position** * **Text Alignment** with **Left**, **Center**, and **Right** options * **Size** * **Max Chars Per Line** * **Max Lines** * **Typography** controls such as font family, weight, case, italic, letter spacing, and text opacity * **Colors** controls such as base text and background * **Background treatment** options for no background, a single block, per-line blocks, or an **Offset highlight** marker stripe behind the lower portion of each line * **Highlight coverage** from 5–100% to control how much of the text height the offset marker covers The **Offset highlight** option uses the selected background color and opacity, defaults to yellow when the current background is transparent, and starts at 32% coverage. Increasing coverage grows the marker upward over more of the letters. The same treatment is available from the Subtitles panel in Studio. The **Preview** area updates the selected style as you adjust these values. Click **Done** when the subtitle style is ready. Add Subtitles customization controls ## Edit subtitles in the preview Select the subtitle text to show its red canvas bounds. Drag anywhere inside the bounds to move it from its current visible position. Drag a left or right handle to change the wrapping width, a top or bottom handle to change line capacity, or a corner to change both. Line capacity changes only after the handle crosses a line-height threshold, so clicking a handle or making a small adjustment does not reset **Max Lines**. Detected transcript speakers continue to use and edit the shared Speaker 1 style. Canvas edits become speaker-specific only after that speaker has been explicitly customized in the subtitle controls. In Studio, subtitle positions are also kept within the active reframe or split-screen section instead of moving unrelated sections. ## Build the rest of the workflow When maintaining an existing workflow, keep **Add Subtitles** after the video or clip source. A common legacy flow is [New YouTube Video](/nodes/youtube) -> [Find Clips](/nodes/findclips) -> **Add Subtitles** -> **Post to Social**. Finish the workflow with an export node, then click **Publish** when the workflow is ready. # Title overlay Source: https://docs.overlap.ai/nodes/title-overlay Deprecated but supported standalone node for adding title overlays. **Deprecated but supported:** Existing Add Title Overlay nodes remain editable and executable. For new workflows, add one or more title layers in [Style Video](/nodes/style-video). > Add an AI-generated title overlay to every video or clip that reaches this node. ### Schema * **Input**: Video or clips from an upstream trigger or editing node * **Output**: Video or clips with a title overlay applied ## Open an existing node Open a workflow that already contains **Add Title Overlay**, then click the node on the canvas to reopen its settings. The node is no longer available as a new palette addition; use [Style Video](/nodes/style-video) in new workflows. Add Title Overlay node settings panel ## Generate the title Use **Title Generation Prompt** to describe the kind of title Overlap should create for each clip. The default prompt asks Overlap to create a catchy title that summarizes the main point of the clip. **Title Text** sets the preview text shown in the builder so you can see how a title looks with your styling. At run time the node generates a title for each clip and replaces this preview text. To send a fixed title instead of an AI-generated one, use the API: pass `title_config.text` together with `generateTitle: false` (see [Node Config](/api-reference/node-config-overrides)). Note that an API title applies the same text to every clip in the run; for different per-clip titles, edit each clip after generation. Click **Apply Social Default** to start from the current social title style, then adjust the settings below it. Choose **Vertical Video Hook** when you want a two-part editorial opener. The preset declares an ordered **Name** block and **Title / Hook** block, so Overlap generates each field with its matching prompt instead of relying on preset-specific workflow logic. It prefers a known guest or active speaker over the host when speaker metadata is available. You can enter fixed copy in the title-block control to override its generated text for every clip. ## Set timing and motion Use **Duration** to decide how long the title stays visible. The panel notes that dragging duration to **10s** makes the title **Always Visible**. Set **Intro Transition** and **Outro Transition** to control how the title appears and disappears. The current defaults are **None** for intro and **Fade: Fade** for outro. ## Style the title Use the typography controls to adjust the title's font, weight, uppercase setting, font color, font size, line height, and character spacing. Use the background controls to choose the background style, text alignment, background color, padding, vertical padding, border radius, and line margin. Shadow controls let you set the shadow color, blur, and offset. Enable **Dynamic Position** when the title should anchor to a detected split-view seam. Enable **Avoid Faces** when the title should move away from detected face and subject regions. The settings are independent and both default to off. Use **Position** to set the preferred vertical placement. ## Build the rest of the workflow When maintaining an existing workflow, keep **Add Title Overlay** after the video or clip source. A common legacy flow is [New YouTube Video](/nodes/youtube) -> [Find Clips](/nodes/findclips) -> **Add Title Overlay** -> [Add Subtitles](/nodes/subtitles) -> **Post to Social**. Finish the workflow with an export node, then click **Publish** when the workflow is ready. # Trending post Source: https://docs.overlap.ai/nodes/trending-post Trigger a workflow when one of your published posts starts trending. **Limited availability:** This trigger is rolling out to selected organizations. If you don't see **Trending Post** in the trigger panel, it isn't enabled for your organization yet — reach out to [support@overlap.ai](mailto:support@overlap.ai) to request access. > Runs your workflow automatically when a post you published starts trending — outperforming your account's own typical views. The workflow receives the trending post's clip, so you can send a proven winner to your other platforms the moment it takes off. ### Schema * **Input**: None (this is a trigger) * **Output**: The trending post's clip, ready for editing or export nodes such as **Post to Social** ## What counts as trending Overlap refreshes each social account's platform-specific 90-day baseline daily, then scores every recent post hourly against that history. An account-platform pair needs at least 20 historical posts before Overlap can make a reliable comparison; until then, it does not fall back to a company-wide average and does not send a trending notification. A post needs two analytics snapshots between 15 minutes and 12 hours apart. It must add at least the greater of 50 views or 5% of the account's median, and it must have at least the greater of 1,000 total views or 50% of that median. Passing those evidence checks is not enough by itself: the post must also either reach the account's historical 90th-percentile view count or reach its median while gaining views at least 5× faster than the account's normal daily pace. Qualifying posts are ranked by a standout index that compares their p90 overperformance and their recent velocity. Overlap selects at most two new standout posts per company in any rolling 24-hour window. A selection that cools off stops appearing as actively trending, but its slot remains occupied until that 24-hour window expires so customers cannot receive a stream of ordinary-post alerts. This trigger watches the selected trending posts and fires your workflow with the underlying clip. It does not apply another threshold after trending detection. ## Email alerts When Overlap selects a trending post, every active member of the organization who has **Email notifications** enabled receives the standout-post email. The email includes the clip thumbnail, aspect ratio, title, description, and current view, like, and share counts. Its link opens the trending post directly on the Analytics post-detail page and preserves the Posts tab and views sort as the return destination. An organization receives at most two trending-post emails in any rolling 24-hour period, one for each distinct standout post. Overlap sends no more than one email per hourly scan, starting with the highest-ranked standout that has not already used a slot. Each post is permanently marked after successful delivery, so a post that remains trending beyond 24 hours is not emailed again. Delivery retries reuse the same provider idempotency key, so an uncertain retry does not create a duplicate message. Email delivery starts with posts newly selected after live alerts are enabled; previously selected trending posts are not backfilled. If a saved member address is rejected by the email provider as invalid, Overlap skips that address permanently for the post. Valid opted-in recipients still receive the alert, and the invalid address does not leave the organization's notification queue stuck retrying. ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. Choose **Trending Post** from the trigger panel — it appears only for organizations the trigger has been enabled for. Connect it to the rest of your workflow — the most common pattern is straight into **Post to Social** for the platforms you want the winner republished to. ## Settings * **Which platforms to monitor** — select one or more platforms to react to. Leave everything unselected to watch all platforms. * **Which accounts to monitor** — select one or more connected accounts to react to. Leave everything unselected to watch all connected accounts. * **Allow duplicate posting** — off by default, so the trending clip is never re-posted back to the account it already trended on. A second account on the same platform still receives the repost. ## How often it triggers The trigger fires **at most once per clip, per account it trended on**: * A post triggers the workflow at most once, and a post that stops trending and later trends again does not re-trigger it. * Re-posts of the same clip to the same account (for example, scheduled intermittent reposts) count as the same event — the trigger will not fire again for them. * The same clip trending on a **different account** is its own event and triggers the workflow again. * Posts this trigger itself created never re-trigger it, no matter how well they perform — including any later scheduled reposts of them. This is what keeps a winning clip from looping through the workflow indefinitely. ## Watching it run Opening the workflow shows the usual launcher — the URL box, upload target and project picker — with **Previous Runs** beneath it. When one of your posts trends the trigger supplies the clip itself, so nothing needs to be pasted for those runs. You can also drop in a video by hand. A pasted link or uploaded file is run through the workflow as a single clip spanning the whole video: it is normalized, then handed to **Post to Social** exactly as a trending clip would be, so it is reposted to every account the workflow is configured for. Its card in Previous Runs reads `Manual → {platforms it was posted to}`. Each card in Previous Runs is one repost: * the badge counts the accounts that repost went out to, rather than clips found * the line beneath reads `{platform it trended on} → {platforms it was reposted to}` as icons * clicking a card opens the clip that was reposted A workflow that pairs this trigger with a manual one shows the same launcher, and its Previous Runs use the standard project cards instead. ## How it pairs with Post to Social The clip that reaches your **Post to Social** node is the exact clip that went trending — the same cut, not a re-edit. Enable **Prevent Double Posting** in the Post to Social node's cadence settings so the workflow never re-posts to a platform that clip is already on. ## Notes * Trending detection runs hourly, and your workflow fires as soon as a post is detected as trending — there is no separate waiting step in between. * A company can have at most two newly selected trending posts in a rolling 24-hour window. * Email alerts go only to organization members who have email notifications enabled, with at most two trending emails per organization in a rolling 24-hour period. * A specific post produces at most one live trending email, even if it continues trending or qualifies again after the rolling window resets. * If that first attempt doesn't go through, the post is queued and retried automatically over the following hour, so a workflow isn't lost to a temporary hiccup. * Building the workflow while one of your posts is already trending fires it right away, rather than waiting for the next check. * Deactivating the workflow removes the trigger's subscription — it stops firing immediately. * The trigger remembers which posts it has already fired for, across config edits. # Youtube Source: https://docs.overlap.ai/nodes/youtube Start a workflow when a new video appears on a YouTube channel or playlist. > Start a workflow automatically when a YouTube channel or playlist publishes a matching video. The **New YouTube Video** trigger is for always-on workflows that should watch a YouTube source and send new videos into the rest of your workflow. Use it when a channel or playlist should start the workflow for you. If you want to run one video by hand, use **Manual Trigger** instead. ### Schema * **Input**: A YouTube channel URL or playlist URL * **Output**: The new YouTube video that starts the workflow ## Add the node Open **Workflows** from the left sidebar and click **New** to open the workflow builder. In the **Trigger** stage, choose **New YouTube Video**. Overlap adds the trigger node to the canvas, selects it, and moves the left panel forward to **Editing** so you can continue building the workflow. Click the **New YouTube Video** node on the canvas whenever you need to reopen its settings on the right side. New YouTube Video node settings panel ## Configure the source In the right-side settings panel, fill in **YouTube Channel or Playlist URL**. The field accepts: * a channel URL, such as `https://youtube.com/@channelname` * a playlist URL, such as `https://youtube.com/playlist?list=PLxxxx...` Until a source is added, the node shows **Not configured** and prompts you to add a channel or playlist URL. ## Advanced settings Expand **Advanced Settings** to control which videos are allowed to start the workflow. New YouTube Video advanced settings The current settings are: * **Minimum Input Video Length**: defaults to `3 minutes`. Videos shorter than this will not trigger the workflow. * **Maximum Input Video Length**: defaults to `120 minutes`. Videos longer than this will not trigger the workflow. Use these filters when the source publishes a mix of Shorts, livestreams, or other videos that should not all enter the same workflow. ## Build the rest of the workflow After the trigger is configured, continue in **Editing** with nodes such as [Find Clips](/nodes/findclips), [Style Video](/nodes/style-video), or [Reframe](/nodes/reframe). Finish with an export node, then click **Publish** when the workflow is ready to listen for matching YouTube videos. # Quickstart Source: https://docs.overlap.ai/quickstart Create your first workflow, run it on a source video, and post the results. > Create your first workflow, run it on a video, and move clips toward posting. Overlap is easiest to learn when you start with one simple workflow and one real video. This guide walks through the fastest path: 1. Create and publish a workflow 2. Drop in your first source video 3. Review the clips and post them If you want to publish directly from Overlap, connect your social accounts in **Accounts** before you schedule posts. ## 1. Create your first workflow Open [**Workflows**](/essentials/workflows) from the left sidebar. This is where you manage every workflow in your workspace, review what is already live, and start a new one. Current workflows list Click **New** to open the workflow builder. For a first workflow, **Manual Trigger** is the simplest place to start. Begin with the empty builder, then click **Manual Trigger** to drop the trigger node onto the canvas. This is the fastest way to test with one source video before you move on to always-on sources like **New YouTube Video**, **New Dropbox Video**, or **RSS Feed**. Empty workflow builder Workflow builder with Manual Trigger added As you build, think in three stages: * **Trigger** decides how the workflow starts * **Editing** defines what Overlap does to the content * **Export** decides what gets produced at the end When the flow looks right, click **Publish** in the top-right corner to make the workflow ready to run. ## 2. Drop in your first video After you publish, return to **Workflows** and click your workflow from the list. This opens the workflow's trigger page, which is where you drop in your first source video. If you started with **Manual Trigger**, you can paste a media URL, upload a file, or select a file from Dropbox. For a first pass, keep it simple: use one recording, webinar, interview, or podcast episode and let the workflow process it end to end. Once a run starts, Overlap surfaces the results back in **Home** under your projects and outgoing work so you can see new clips as they come in. Workflow trigger page with upload and URL options If you want a deeper walkthrough of triggers, nodes, and publishing states, continue with the full [**Workflows**](/essentials/workflows) guide. ## 3. Review clips and post From the finished project, open the clips you want to keep and make any final edits you need. As clips move toward publishing, you can review scheduled posts in **Social Calendar**. Social Calendar Use this final pass to: * confirm the right account is selected * check the post copy * review the scheduled time * use **Create Post** when you want to add or schedule something manually Once that looks good, your first workflow has gone all the way from setup to post-ready output.