Last Frame API

POST /frame/last

About this tool

The Droid Apps FFmpeg `/frame/last` endpoint is purpose-built for teams that automate thumbnails, catalog shots, QA stills, and timeline posters from long-form video without hauling entire files through a browser upload. Instead of multipart forms, your integration sends compact JSON referencing a publicly reachable HTTPS `video_url` that our workers can fetch, decode once, seek near the trim end, and export a deterministic raster snapshot. Jobs are asynchronous: each POST returns task metadata with a stable status URL so you can poll until the image asset is downloadable, mirroring every other FFmpeg route in our catalog.

Because decoding happens on subscribed infrastructure, throughput and fairness are guarded by API keys tied to billing. Silent failures from private buckets are common in first integrations—URLs must resolve without cookies, signed query drift, or regional blocks. When you combine optional `epsilon`, `width`, and `height` hints, FFmpeg can converge faster on acceptable geometry; omit them and sensible defaults still produce a crisp frame, but explicit dimensions help when downstream templates expect exact pixels for social cards or preview grids.

This is not a consumer “free converter.” You are orchestrating cloud FFmpeg with the same discipline as any other microservice: version your payload schema, log task IDs, and retry only when the API reports retriable states. The UI form below mirrors the JSON contract so you can prototype requests before wiring server-side workers. Expect network latency between your storage and ours to dominate short jobs; very long sources may take longer simply because demuxing and seeking scale with container complexity rather than your JSON size.

Operational teams pair last-frame exports with cut, crop, and caption routes to build review pipelines: grab the closing still, auto-caption the same source, and ship both to CMS webhooks. Documents in the API reference spell out edge cases such as variable frame rate footage or HDR color metadata; read them alongside this page when planning compliance-friendly retention, since your subscription governs how long derived artifacts remain hot before you must re-fetch from your own archive.

Try it now

How it works

  1. Authenticate and plan the payload

    Attach your `X-API-Key` header from an active Droid Apps subscription. Build JSON with a public HTTPS `video_url` plus any optional geometry hints—no multipart uploads are accepted.

  2. POST to `/frame/last`

    Submit the JSON body to the API path. The response includes a task identifier and `status_url` pointing at the async job record our workers update as FFmpeg progresses.

  3. Poll the task until completion

    Use GET requests on the returned status URL (also with your API key) until the state transitions to a terminal success. Handle errors verbatim from the JSON body for observability.

  4. Download the generated still

    Successful tasks expose HTTPS download links for the rendered frame. Persist the file in your storage; do not treat our CDN copy as long-term archival unless your plan says otherwise.

Frequently asked questions

Why does the API reject my `video_url`?

We only fetch anonymous HTTPS sources. Links that require headers, expiring signatures, or VPN-only access will fail fast with a clear error. Host the asset on a public bucket or generate short-lived tokens that remain valid for the whole job duration.

Can I upload the MP4 directly in the POST body?

No. Every tool in the Droid Apps FFmpeg suite expects JSON plus remote URLs. This keeps workers stateless and prevents giant payloads from blocking event loops; upload to your storage first, then reference it.

How do I know when the still is ready?

The create response returns `status_url`. Poll it on a fixed interval (for example every two seconds) until the status field reports completion or failure. The panel below automates that loop for manual tests.

Do optional `width` and `height` change aspect ratio?

They communicate target rasterization sizes to FFmpeg. If you need strict letterboxing, combine this call with a later `/crop` job or handle padding in your own renderer; consult the embedded docs anchor for parameter semantics.

What happens if I lack an active subscription?

Requests without a valid key return `401`-class errors. Renew or upgrade your plan, then rotate keys from the dashboard; never commit secrets to client-side bundles beyond tightly scoped test keys.