Framepine

Frame extraction API

Every frame has an address.

Register a video or PDF once. After that, any frame is a URL — pick a timecode, pick a width, get a JPEG. Derivatives are cached, so the second request costs you nothing.

Pick a frame to see its delivery URL

GET https://framepine.com/v1/f/k3d9xq2m/t4s-w640.jpg GET https://framepine.com/v1/f/k3d9xq2m/t8.25s-w640.jpg GET https://framepine.com/v1/f/k3d9xq2m/t12.5s-w640.jpg GET https://framepine.com/v1/f/k3d9xq2m/t19.75s-w640.jpg GET https://framepine.com/v1/f/k3d9xq2m/t26s-w640.jpg

How it works

Three calls, and you are done.

  1. Register the source

    Post the URL of a video or PDF. Framepine reads the container, indexes keyframes and returns an asset id.

  2. Take the delivery token

    Each asset gets an unguessable token. Delivery URLs carry it, so your API key never leaves your servers.

  3. Request any frame

    Ask for a timecode and a width. First request renders and caches it; every later request is served straight from cache.

Register a source

One POST to get started.

curl -X POST https://framepine.com/v1/assets \
  -H "Authorization: Bearer fp_live_9c2ad41f7b6e" \
  -H "Content-Type: application/json" \
  -d '{"source":"https://cdn.example.com/reel.mp4"}'

# 201 Created
{
  "id": "as_7f31c0",
  "status": "ready",
  "duration": 34.2,
  "token": "k3d9xq2m",
  "delivery": "https://framepine.com/v1/f/k3d9xq2m/"
}

Sources up to 2 GB. MP4, MOV, WebM, MKV and PDF. Full parameter list in the API reference.

Why teams use it

Built for the boring part.

Nobody wants to run FFmpeg in a request handler, keep a render queue alive, or explain to the team why the thumbnail service fell over during a launch. Framepine does one job: it turns a timecode into an image, and it keeps that image around so you only pay for the first render.

Delivery runs on plain HTTP caching — ETag, Cache-Control, conditional requests. Your CDN, your browser and your mobile client all already know how to talk to it.