Primitive/clips3 min read

Introducing /clips and /media: turn long video into shorts and manage every asset

Clip long-form video into captioned, ready-to-post shorts in one call, and keep every generated or uploaded asset in a managed media library — the production layer for an autonomous content business.

Primitive/clips
TL;DR
  • /clips turn a long video into multiple captioned, vertical, ready-to-post shorts in one call
  • Async job pattern create returns a job, poll status until the clips are rendered
  • Auto-editing captions, reframing, and highlight selection handled for you, not a timeline to scrub
  • /media a managed asset library that holds every generated and uploaded file by Company
  • Edit pass refine an existing clip with a second editing call before publishing
  • Composes with /video, /image, and /social generate, store, clip, and post through one key

Today we're launching /clips and /media — the production layer for video content. /clips turns a long-form video into multiple captioned, vertical, ready-to-post shorts in a single call. /media is the managed library that holds every asset your agent generates or uploads. Together they're the difference between an agent that can make media and an agent that can run a content operation.

The problem: clipping is the bottleneck of every content business

Short-form is where attention lives, but the workflow behind it is brutally manual. A single podcast or stream becomes a dozen clips only after someone:

  • Watches the whole thing to find the highlights.
  • Cuts each moment, reframes it to vertical, and burns in captions.
  • Exports, names, files, and tracks every output so it can actually be posted.

Generation primitives like /video create net-new footage. But most content businesses don't need more footage — they need the long thing they already have, turned into many short things. That's editing, not generation, and it's exactly the step that keeps a "faceless content channel" a full-time human job. Until now.

How /clips works

/clips takes a source video and produces social-ready shorts — selecting highlights, reframing to vertical, and adding captions automatically. It's an async job: you create the job, then poll for the result.

// Kick off a clipping job
const job = await naive.clips.create({
  video_url: "https://cdn.example.com/episode-42.mp4",
  language: "en",
});
 
// Poll until the clips are rendered
let status = await naive.clips.status(job.job_id);
while (status.status !== "completed") {
  await new Promise((r) => setTimeout(r, 5000));
  status = await naive.clips.status(job.job_id);
}
// status now carries the rendered clip URLs

This is the same job model as /image and /video, and every clipping job also surfaces under the unified /jobs primitive, so an agent tracks all its async work in one place.

Refine before you publish

When a clip is close but not perfect, run a second editing pass instead of regenerating from scratch:

const edit = await naive.clips.edit({
  clip_id: "clip-uuid",
  captions: { style: "bold", position: "bottom" },
});
const result = await naive.clips.status(edit.job_id);

/media: the asset library that ties it together

Every file an agent touches needs a home. /media is the Company's managed library — generated images and videos, uploaded source footage, and finished clips all live here, queryable by Company and reusable everywhere else.

# List the library
curl https://api.usenaive.ai/v1/media \
  -H "Authorization: Bearer $NAIVE_API_KEY"
 
# Add an asset by URL
curl -X POST https://api.usenaive.ai/v1/media/upload/url \
  -H "Authorization: Bearer $NAIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://cdn.example.com/logo.png" }'

Because media is a first-class store, an asset generated in one step is available to the next without you shuttling files between services.

What you can build with /clips and /media

Run a faceless clipping channel on autopilot — This is the missing piece for the workflow in our faceless clipping channel guide. An Employee ingests a long video, clips it, stores the outputs in /media, and posts them via /social — no human in the edit bay.

Repurpose every long-form drop into a week of shorts — One podcast episode becomes ten clips, scheduled across platforms. The library keeps track of what's been produced and what's been posted.

Build a brand-consistent asset pipeline — Generate logos and B-roll with /image and /video, store them in /media, and pull from the same library across every clip and post.

Give an orchestrated team a shared media store — With /orchestration, a designer Employee generates assets and an editor Employee clips and publishes them — both reading and writing the same /media library.

Get started

Drop this starter prompt into any coding agent to wire up Naïve:

Read https://usenaive.ai/skill.md and use it to set up Naïve in my project.

Frequently Asked Questions
What is /clips?+
/clips is Naïve's short-form video primitive. Give it a long-form video and it produces multiple captioned, vertical, social-ready clips — selecting highlights, reframing, and burning in captions automatically. It's async: create a clipping job, then poll its status until the clips are ready.
What is /media and how does it relate?+
/media is the Company's managed asset library — the durable home for files an agent generates or uploads (images, video, clips, documents). Clips land somewhere; media is where they live, queryable by Company and reusable across /social posts and apps.
How does the async job pattern work?+
naive.clips.create(...) returns a job with a job_id. Poll naive.clips.status(jobId) until it reports completed, then read the resulting clip URLs. This is the same job model used by /image and /video, and every job also shows up under the unified /jobs primitive.
Can I edit a clip after it's generated?+
Yes. naive.clips.edit(...) runs a follow-up editing pass on an existing clip — adjust captions or styling before you publish. Like create, it returns a job you poll to completion.
How is it billed?+
Clipping and editing consume credits based on the work performed (video length and rendering). Media library storage and listing are lightweight. See the pricing page for current rates.
How do I get started with /clips?+
Call naive.clips.create({ video_url }) and poll naive.clips.status(jobId). Pair it with /media to store outputs and /social to publish. The full guide is at usenaive.ai/docs/getting-started/clips.
DZ
Dennis ZaxCTO

CTO of Naïve. Building the open-source agent runtime.

@denniszax