Instagram API: JPEG only, no MPO or JPS. Stills from a video frame

Meta's publishing guide says JPEG is the only image format and MPO and JPS are not supported. Sume video-frames returns jpeg by default, or png.

4 min readSume
All posts

Ask video-frames for format: "jpeg", its default, and send that still to Instagram. Meta's guide says "JPEG is the only image format supported. Extended JPEG formats such as MPO and JPS are not supported," so a png still from the same route would not qualify as is.

What does Meta say?

The relevant line is short and absolute, and the same guide adds the carousel and rate limits used in the sibling posts.

Instagram image format (read 2026-09-30). Sume rows: https://docs.sume.com/models/video-frames
ItemValueWhere
Supported image formatJPEG onlyMeta content publishing guide
Not supportedMPO, JPSMeta content publishing guide
Sume formatsjpeg (default) or pngVideo frames docs

How do I get a JPEG from a clip?

POST /v1/video-frames returns durable media.sume.com image artifacts for the times you name. format is jpeg unless you set png. Poll GET /v1/video-frames/:id and read frames[{t,url,width,height}].

curl -X POST https://api.sume.com/v1/video-frames \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: ig-still-001" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/clip.mp4",
    "at": [2],
    "format": "jpeg"
  }'

Will a Sume JPEG ever be an MPO?

Sume's docs do not describe the JPEG variant beyond the jpeg value, and they say nothing about MPO or JPS. Confirm the type of the file you download, since only Meta decides what its publish call accepts.

What if I only have a PNG?

Re-run the extract with format: "jpeg". The route is unbilled, and a new request needs a new Idempotency-Key. Frames are limited to 24 per call and to sources of 300 seconds or less.

Which frame times work well for stills?

Pick times you can name. at[] takes 1 to 24 values in seconds, each at least 0 and below the duration, and an out-of-range value fails the job as frame_time_out_of_range and reports the probed length. If you would rather sample than choose, fps up to 2 samples mid-bin times and is capped at 24 frames.

A single failed instant comes back with url null without failing the whole job, so check each entry before you publish.

  • Use at for a chosen moment such as a product reveal.
  • Use fps to sample a clip evenly.
  • Keep max_edge unset to keep the source frame size, or set 16 to 2160 to clamp the long edge.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume