Dev.to WebDev πŸ›  Dev πŸ‘ 0 πŸ“– 7 min read

I gave five video platforms the same three AI jobs. Here is the API each one hands back.

TL;DR Three jobs against an archive: make it searchable, cut vertical clips, caption and translate. I checked what Mux, api.video, Cloudflare Stream, AWS and FastPix actually expose for each. Below are the real request

TL;DR

Three jobs against an archive: make it searchable, cut vertical clips, caption and translate. I checked what Mux, api.video, Cloudflare Stream, AWS and FastPix actually expose for each. Below are the real request and webhook shapes, plus the jobs where the answer is still "build it yourself."

Every one of these platforms shipped an AI product this year. The announcements look identical. The API surfaces do not, and that is what decides your sprint. The archive in question was about four thousand recorded sessions, and the asks were search by spoken and visual content, vertical clips for social, and captions in three languages.

The scoreboard first

Job Mux api.video Cloudflare Stream AWS FastPix
Captions / transcription Yes (Robots) Yes, $0.10/min Yes, auto-generated, 12 languages No (separate service: Transcribe) Yes (subtitles flag)
Caption / audio translation Yes (Robots) Not a named product No No Part of In-Video AI workflows
Summaries, chapters, tags Yes (analyze-structure) Summaries only, $0.10 + $0.05/min No No Yes (summary, chapters, namedEntities)
Moderation Yes (moderate) No No Yes, $0.10/min (Rekognition) Yes (moderation flag)
Library search (semantic) Not shipped yet No Not verified Build it yourself Yes (AI Search)
Auto-clip highlights Partly (find-key-moments) No Not verified No Yes (AI clipping)
Aspect-ratio reframing No No No No Yes (auto reframe)

Prices are from each vendor's public pricing page as of November 2026. They move. Check before you budget.

Job 1: make the archive searchable πŸ”

This is where the five platforms diverge hardest, because "search" gets used for two very different products.

Mux gives you parts, on purpose. The open-source @mux/ai toolkit produces embeddings and you own the index:

// embeddings.ts (Mux, @mux/ai - Apache 2.0, bring your own LLM keys)
import { generateVideoEmbeddings } from '@mux/ai';

const { chunks } = await generateVideoEmbeddings({ assetId });
await vectorDB.insert(chunks);   // your Pinecone/pgvector/Qdrant, your problem

That is a legitimate design, and the Mux Robots GA post is refreshingly straight about the hosted side: they have been building multimodal embeddings behind the scenes and are asking users where semantic search over a library should go. So hosted search is roadmap, not product, as of their October 27 GA.

AWS gives you more parts. Rekognition detects labels; you assemble the index:

# rekognition_labels.py
import boto3
rek = boto3.client("rekognition", region_name="us-east-1")

job = rek.start_label_detection(
    Video={"S3Object": {"Bucket": "archive", "Name": "session-0412.mp4"}},
    MinConfidence=80,
)
# poll or SNS, then get_label_detection(JobId=job["JobId"]) -> labels with timestamps

Spoken content is a different service entirely (start_transcription_job on Amazon Transcribe), with its own SDK and bill, and then you still need the vector store and the query layer. Also check this before you start: the Rekognition features page carries an end-of-support notice stating Streaming Video Analysis and Batch Image Content Moderation are unavailable to new customers as of April 30, 2026.

api.video and Cloudflare Stream do not offer library search. api.video's AI surface is transcription and summarization. Cloudflare has pages named "Search for videos" that I did not read, so I am not going to characterise them either way.

FastPix ships AI Search as a product, available from both the dashboard and the API, backed by multimodal indexing that combines video, audio and text. That was the deciding factor for this job: it was an endpoint rather than a project.

Job 2 and 3 as upload flags

Here is the pattern worth stealing regardless of vendor: ask for the AI work at ingest, not in a second pipeline.

# FastPix: request AI at create time. Basic auth = Access Token ID : Secret Key
curl -X POST https://api.fastpix.com/v1/on-demand \
  -u "$FASTPIX_TOKEN_ID:$FASTPIX_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "inputs": [{ "type": "video", "url": "https://static.fastpix.com/fp-sample-video.mp4" }],
    "accessPolicy": "public",
    "chapters": true,
    "namedEntities": true,
    "metadata": { "archiveId": "session-0412" }
  }'
{
  "success": true,
  "data": {
    "id": "8717422d-186b-4e3f-a16f-c6a0f0b5a8c5",
    "status": "Created",
    "playbackIds": [{ "id": "9a2c...", "accessPolicy": "public" }]
  }
}

chapters and namedEntities are plain booleans. The other three AI fields on this endpoint, summary, moderation and subtitles, take objects rather than booleans, so check the reference for their inner keys instead of guessing them (I guessed, and was wrong).

⚠️ Two gotchas. data is an object, not an array (older docs showed an array). And the dashboard's custom-settings JSON calls this generateChapters while the API field is chapters. Two names, one feature.

Already-ingested media gets the same features with a PATCH, which is what you want for a backfill:

# enable chapters on existing media; same shape for /summary, /named-entities, /moderation
curl -X PATCH https://api.fastpix.com/v1/on-demand/$MEDIA_ID/chapters \
  -u "$FASTPIX_TOKEN_ID:$FASTPIX_SECRET" \
  -H "Content-Type: application/json" \
  -d '{ "chapters": true }'

Mux's hosted equivalent is a job rather than a flag, and jobs are async and webhook-delivered off /robots/v1:

// mux-robots.ts
const job = await muxClient.robots.jobs.generateChapters.create({ assetId });
// or analyze-structure: one job returning title, summary, tags, chapters, scenes and key moments

analyze-structure is the one I would reach for first on Mux: it replaces running summarize, chapters, scenes and key moments as four separate jobs. Billing is in units, and Robots is included on every Mux plan including Free with 100,000 units a month, with a published example of 650 units to summarize a five-minute asset. That makes evaluation genuinely free rather than trial-shaped.

api.video is a straight per-minute buy for this job: transcription across 33 languages at $0.10 per minute, summarization at $0.10 per minute for an abstract and $0.05 for key takeaways. Cloudflare's captions are generated with speech-to-text in twelve languages and labelled auto-generated in the player, with no separate line on the pricing page.

Consuming the results: one webhook schema beats two

The integration detail that cost me the most time across platforms was event plumbing, not features.

// webhooks/fastpix.js  (express)
app.post('/webhooks/fastpix', (req, res) => {
  const { type, object, status, data, workspace, createdAt } = req.body;

  if (type === 'video.media.ready') {
    markEncoded(object.id);
  }

  if (type === 'video.mediaAI.chapters.ready') {
    for (const c of data.chapters) {
      saveChapter({
        sequence: c.chapter,     // STRING sequence number, not chapterNumber
        startTime: c.startTime,  // hh:mm:ss
        endTime: c.endTime,
        title: c.title,
        summary: c.summary,      // summary, NOT description
      });
    }
  }

  res.sendStatus(200);
});

Note the field names; I got chapterNumber and description wrong on my first pass because that is what you would guess. The envelope carries object.type: "media", status, workspace.name, createdAt and an attempts[] array, and the same handler receives video.media.created, video.media.ready and video.media.failed. One auth scheme and one event model for both the encoding half and the AI half of the platform is worth more than it sounds when you are wiring a backfill of four thousand assets.

Mux Robots also delivers by webhook, which is the right call for long-running work. The difference is architectural rather than better or worse: Mux splits video events and Robots jobs, AWS gives you per-service SNS/EventBridge notifications, and FastPix puts everything on one schema.

Playback, because the clips have to go somewhere

# FastPix playback, signed with a rotated JWT
https://stream.fastpix.com/<playbackId>.m3u8?token=<JWT>
# thumbnails
https://images.fastpix.com/<playbackId>/thumbnail.png

Server SDKs exist for Node.js, Python, Go, Ruby, PHP, Java and C#, with player SDKs for web, iOS and Android, so most of the curl above collapses into a few lines in whatever you already write. Mux's SDK coverage is strongest on the data side (web, iOS, Android, Roku, smart TV), which matters if your analytics has to reach a TV app.

Two honest watch-outs before you pick FastPix

Both are structural, not gaps. It is API-first, not a no-code CMS. The AI workflows are endpoints and a dashboard; if the people who own your archive expect drag-and-drop editorial tooling over those workflows, you are building that front end. And if you have strict regional data residency requirements, EU-only or India-only, confirm region availability before you commit, because some regions roll out on request.

Also, on this topic specifically: the AI clipping and auto-reframe capabilities are documented on the product side but I could not find request payloads in the public API reference, so I have not shown code for them. Ask for the payload shape before you plan a sprint around them.

What's next

If you are evaluating, the fastest honest test is to run the same five-minute asset through two platforms and diff the chapter boundaries and the caption text, because that is where quality differences actually show up. The In-Video AI docs cover the flag and webhook shapes above, and Mux's Robots docs cover the job catalogue; api.video's pricing page and Cloudflare's Stream pricing are the two cheapest sanity checks on cost.

The thing I would tell myself at the start of this: write down whether each "AI feature" is an endpoint or a toolkit before you compare anything else. #webdev #api

πŸ“° Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes β€” full credit and traffic to the original publisher.