Substack video in email is a clickable image: pick the still

Substack plays video on the web but shows a clickable image in email. Pull candidate stills from your clip with Sume's video frames: unbilled, up to 24.

5 min readSume
All posts

When you send a Substack post with video, subscribers who open the email see a clickable image rather than a player, so the still you choose is the whole pitch. Sume's video frames pulls up to 24 stills from a clip at the seconds you name, for free, so you can pick the best one before you publish.

The email behaviour comes from Substack's announcement of video (read 2026-10-02), which says videos play directly on the web in a post and appear in the email versions as clickable images. That page is from 2022, does not say how the image is chosen, and does not mention custom thumbnails, so this post does not claim you can replace it. It covers making good candidate stills.

What does Substack's page actually say?

Videos can be uploaded or recorded in a post, access can be limited to paid subscribers or left public, and the video stays tied to your mailing list. The page sends technical specs to the Help Center, so file limits are not on it. The one email-relevant sentence is that the email version shows a clickable image.

That is why the opening frame matters. A frame with a half-blink, a transition blur or a black fade-in makes a weak email image whatever the video is worth.

How do I pull candidate stills?

Video frames takes one workspace media.sume.com clip and exactly one of at[] (1 to 24 seconds) or fps (above 0, up to 2). It returns durable image files at the source size unless you set max_edge between 16 and 2160. Submit is always 202; read the result with GET /v1/video-frames/:id.

Ask for six moments spread over the first 30 seconds and open the results side by side:

curl -X POST https://api.sume.com/v1/video-frames \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: issue-41-stills" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/issue-41.mp4",
    "at": [1, 4, 8, 12, 20, 28],
    "format": "jpeg",
    "max_edge": 1280
  }'

What are the limits?

The source clip can be at most 300 seconds. For a longer video, cut the part you want to show with video trim first ($0.02 a job) and run frames on the trimmed file. An at value at or past the clip's duration fails the job as frame_time_out_of_range, and the error names the duration it probed.

One instant that fails to extract comes back with a null url without failing the whole job, so check each entry before you use it. Video frames is unbilled.

Video frames program, read 2026-10-02
FieldRule
at[]1 to 24 values, each 0 or more and under the duration
fpsAbove 0, up to 2, capped at 24 frames
formatjpeg (default) or png
max_edge16 to 2160; omit to keep source size
Source lengthUp to 300 seconds

Where does the still go?

Use the winning still as the poster in your own post header, in a social card or in the email body wherever Substack's editor lets you place an image. Whether the image Substack shows in email can be swapped is a question for Substack's Help Center, not this page or Sume's docs.

For upload limits on the Substack side, see Substack video post upload. For the general method, see extract video frames API.

How do I choose among the candidates?

Open the six results side by side and reject any with closed eyes, mid-gesture blur or text cut off at the edge. Prefer a frame where the subject looks at the camera with a clear background, since the image is small in an inbox.

If none work, run a second pass with fps: 1 on the 10 seconds around the best candidate; mid-bin sampling gives frames at 0.5, 1.5, 2.5 seconds and so on. Because video frames is unbilled, a second and third pass cost nothing, but each is still a job, so reuse an Idempotency-Key only when you mean to repeat the same request.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume