Placeholder videos, from a URL.
Put /video/640x360 in a video tag and get back an MP4 of exactly that size, with your label in the middle, a running timer and a progress bar along the bottom. Colours, label, length and frame rate are query parameters. No key, no account.
The preview is the real response from that URL, exactly what your page would load.
Test the player, not the footage.
A placeholder video is a real H.264 file with a real size and length, so players, layouts and loaders behave exactly as they will with the final footage.
Custom players and controls
Check a scrubber, a fullscreen button or a chapter list against a real file. The timer drawn in the middle (0.0s / 5s) and the bar filling along the bottom show at a glance whether play, pause, seek and loop are doing what you expect.
Hero and background video
Lay out a muted, looping hero before the brand film is shot. Ask for the exact size of the slot, such as /video/1280x720, and the page gets the right aspect ratio and file type from the first commit.
Feeds, grids and lazy loading
Fill a feed with clips at mixed sizes to see how it reserves space, lazy-loads and pauses off-screen. Give each one its own label with ?text=Clip+1 so you can tell them apart in a screen recording.
Seed data, stories and demos
Point video_url fields in seed scripts and Storybook stories at placeholder URLs instead of committing binaries to the repo. Each URL says what it contains, so the fixtures stay readable months later.
One MP4, drawn frame by frame.
Each frame is drawn on the server: the background colour, your label centred in bold, the elapsed time under it and a progress bar that fills along the bottom edge. The frames are then encoded with ffmpeg as H.264 (baseline profile, level 3.0, yuv420p) in an MP4 container, with the index moved to the front of the file so playback can start before the download finishes.
There is no audio track. Browsers still want the muted attribute before they will autoplay, so keep it on the tag. The first request for a new URL waits while the clip is encoded; after that the server returns the stored file, sent with a one-year immutable cache header.
<video autoplay muted loop playsinline
width="640" height="360"
src="https://imgsrc.pub/video/640x360?text=Hero+loop">
</video>Everything the URL accepts.
The size goes in the path. Everything else is an optional query parameter, in any order.
| Parameter | Values | Default | What it does |
|---|---|---|---|
| /video/{w}x{h} | 50–1280 each | required | Width and height in pixels, in the path. A size outside the range returns a 400 error instead of a video. |
| bg | hex, no # | eeeeee | Background colour. |
| color | hex, no # | 31343c | Colour of the label, the timer and the progress bar. |
| text | URL-encoded string | {w} x {h} | The label in the middle. Its size is a tenth of the shorter side, and never below 20px. |
| duration | seconds | 5 | Length of the clip. Longer clips take longer to encode the first time. |
| fps | frames per second | 15 | Frame rate. 15 is plenty for a ticking timer; use 24 or 30 to test smoother playback. |
Four URLs, four videos.
Each player below is playing the URL under it, straight from imgsrc.pub.
Placeholder video, answered.
Is the placeholder video API free?+
Yes. There is no account, no API key and no watermark. A URL is encoded once and stored, so asking for the same video again returns the saved file.
How do I make it autoplay and loop?+
Add autoplay, muted, loop and playsinline to the video tag. Browsers only autoplay video that is muted, and iPhones need playsinline to play it inside the page rather than full screen.
What sizes can I ask for?+
Any width and height from 50 to 1280 pixels. Common picks are 1280x720 for 16:9, 720x1280 for vertical video and 640x640 for square. Anything outside the range returns a 400 error with a one-line explanation.
Why does the first request take longer?+
Every frame is drawn and encoded the first time a URL is requested. A five-second clip at 15 fps is 75 frames. Later requests for the same URL skip all of that and return the stored MP4.
Can I use it as a poster image too?+
Use the placeholder image API for that: /640x360.png?text=Loading gives a still of the same size, which you can set as the video's poster attribute.
Can I add sound or change the font?+
No. The clips have no audio track, and the label is drawn in the server's sans-serif font. You can change the colours, the label, the length and the frame rate.
The rest of the toolbox.
Five more free tools, and three AI tools for when a placeholder won't do.

Placeholder image
FreeAny size up to 4000 px, in PNG, JPG, WebP, GIF or SVG, with your own colours and text.
QR code
FreeA PNG for any link or text, at the highest error correction, so it still scans when printed small.
Share card
FreeA 1200×630 Open Graph image drawn from a title and one line of text. Point og:image at it.
Favicon
FreeAny site's icon by domain. It reads the page's link tags and falls back to /favicon.ico.
Logo resizer
FreeOne square logo in; favicon.ico, Apple, Android and PWA icons and a web manifest out. It runs in your browser.
AI image
1–30 creditsSquare, landscape or portrait, at 1024×1024, 1536×1024 or 1024×1536.
AI logo
30 creditsA 1024 px mark, delivered on a solid background and on a transparent one.
AI share card
30 creditsA 1200×630 illustrated Open Graph image for a launch, post or product page.
Your player is waiting.
Give it a video.
Pick a size, copy the URL, paste it into your video tag.







