Skip to content

DocsAPI referenceOperations

Make a storyboard

Frames at a fixed interval laid out in a grid on one image. Creates the same Job as POST /v1/jobs, with operation set.

POST /v1/storyboard

Needs an API key: Authorization: Bearer $VIDEXO_API_KEY.

Parameters

Parameters
NameInTypeDescription
idempotency-key headerstring, up to 255 charactersMakes retries safe for 24 hours. Up to 255 printable ASCII characters. One key space per account across every endpoint that creates a job.

Body StoryboardRequest

Body fields
NameTypeDescription
input requiredstring or objectAn http or https URL, videxo://uploads/<upload_id>, { "url" } or { "upload_id" }.
extra_inputs map of string to string or object
webhook_url string, URL, up to 2,048 characters or nullAn https URL that gets the job when it ends (M4).
metadata map of string to string, up to 500 charactersYour own string pairs, returned with the job and its webhook: at most 20 keys of up to 40 characters, values up to 500.
filename string, up to 105 charactersThe stored file name, <name>.<format> by default; one extension, matching format.
format one of mp4, mov, webm, mkv, ts, mp3, m4a, aac, wav, flac, ogg, opus, jpg, png, gif, jsonThe container or image format; from filename, or the type's default.
trim objectThe part of the input to use: start, and end or duration.
crop objectA rectangle of the input frame, in input pixels.
rotate numberDegrees clockwise.
flip one of horizontal, verticalMirror the picture.
color objectBrightness, contrast, saturation, gamma and hue.
interval number, 0.5 to 3600Seconds between frames.
columns integer, 1 to 16Frames across.
rows integer, 1 to 16Frames down.
tile_width integer, 16 to 640Each frame fits in a square of this many pixels.
quality one of low, medium, highJPEG quality; PNG ignores it.
exact_times booleanDecode every frame for exact tile times, instead of key frames only.
strip_metadata booleanDrop the input's global and stream metadata (GPS, device tags).

Request

bash
curl "$VIDEXO_API_URL/v1/storyboard" \
  -H "Authorization: Bearer $VIDEXO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "input": "https://videxo.io/samples/talk.mp4",
  "interval": 1,
  "columns": 5,
  "rows": 3
}'

Response

202 JSON
{
  "id": "job_3k9x0c2mfq8w1n7r5t4b6v2z",
  "state": "queued",
  "kind": "operations",
  "operation": "storyboard",
  "spec": {
    "inputs": {
      "source": {
        "url": "https://videxo.io/samples/talk.mp4"
      }
    },
    "outputs": [
      {
        "name": "storyboard",
        "type": "storyboard",
        "input": "source",
        "filename": "storyboard.jpg",
        "format": "jpg",
        "quality": "medium",
        "interval": 1,
        "columns": 5,
        "rows": 3,
        "tile_width": 320,
        "exact_times": false
      }
    ]
  },
  "command": "-skip_frame nokey -t 15 -i {{in_source}} -map 0:v:0 -vf fps=1/1,scale=320:320:force_original_aspect_ratio=decrease:force_divisible_by=2,tile=5x3 -frames:v 1 -q:v 5 {{out_storyboard}}",
  "input_files": {
    "in_source": "https://videxo.io/samples/talk.mp4"
  },
  "output_files": {
    "out_storyboard": "storyboard.jpg"
  },
  "ffmpeg_command": "ffmpeg -skip_frame nokey -t 15 -i https://videxo.io/samples/talk.mp4 -map 0:v:0 -vf fps=1/1,scale=320:320:force_original_aspect_ratio=decrease:force_divisible_by=2,tile=5x3 -frames:v 1 -q:v 5 storyboard.jpg",
  "steps": [
    {
      "tool": "ffmpeg",
      "inputs": [
        "source"
      ],
      "outputs": [
        "storyboard"
      ],
      "command": "ffmpeg -skip_frame nokey -t 15 -i https://videxo.io/samples/talk.mp4 -map 0:v:0 -vf fps=1/1,scale=320:320:force_original_aspect_ratio=decrease:force_divisible_by=2,tile=5x3 -frames:v 1 -q:v 5 storyboard.jpg"
    }
  ],
  "webhook_url": null,
  "metadata": {},
  "progress": null,
  "error": null,
  "outputs": [],
  "usage": null,
  "created_at": "2026-11-04T12:00:00.000Z",
  "started_at": null,
  "finished_at": null
}

Responses

Responses
StatusBodyWhen
200JobThe job this Idempotency-Key made earlier (same endpoint and body).
202JobThe job, queued.
400Probleminvalid_request (with errors) or command_invalid (with problems)
401Problemauthentication_failed (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired)
402Problemusage_cap_reached or out_of_credits
403Problempermission_denied (account_disabled, token_scope)
404Problemnot_found (upload)
409Problemconflict (idempotency_key_reused)
413Problemlimit_exceeded (request_body_size): the body is larger than 512 KB
415Probleminvalid_request (not_json): the body is not sent as application/json
429Problemrate_limited, with Retry-After in seconds
500Probleminternal_error
503Problemservice_unavailable (temporary): the account's free credits are still being granted, or a part of the service did not answer