Comparison · Published October 17, 2026 · 7 min read

WordPress mShots Alternative: Website Screenshots You Can Rely On

Quick answer

WordPress mShots is the free screenshot service behind WordPress.com: you put an encoded URL into s0.wp.com/mshots/v1/ and get an image back. It works for simple thumbnails, but we found no official documentation, terms or support for outside use, and it has few options. For a commercial site, a documented screenshot API used through a small server-side function is the safer mShots alternative.

What your WordPress previews would look like

Most mShots users show small previews of links: a "related sites" list, a directory, a portfolio. We captured our own blog index the way such a preview card would use it. These are real outputs from SnapshotFlow, not mockups.

Preview card of the SnapshotFlow blog, rendered at 2x and resized to 800 pixels wide
Preview card: page rendered at 2x for sharp text, resized to 800 px wide, WebP 25 KB
Mobile preview of the SnapshotFlow blog at 390 by 844 pixels with mobile emulation
Mobile preview, 390×844 with mobile emulation

Smaller files for the same picture

mShots returns JPEG. We captured the same 1280×800 page in both formats at quality 80:

FormatFile sizeDifference
JPEG88 KB
WebP52 KBabout 41% smaller

One page, one run, so treat it as an example rather than a benchmark. On a page with dozens of previews the difference adds up. To get the card above, add 'device_scale_factor' => 2 and 'image_width' => 800 to the arguments in the WordPress function below.

What mShots is

mShots generates the site previews used across WordPress.com. Developers discovered that the endpoint also works on its own:

https://s0.wp.com/mshots/v1/https%3A%2F%2Fexample.com?w=800

The request above returned a JPEG when we tried it in October 2026. Everything else people know about mShots comes from third-party blog posts and plugin pages, not from an official reference. Below we summarize those reports in our own words; treat them as observed behavior that can change.

Known limits (from third-party sources)

TopicWhat is reported
Optionsw and h for output size; no format, wait, full-page or device options documented
SizeThird-party write-ups report a maximum output size
First requestMay return a "generating preview" placeholder until the image is ready
CachingImages are cached; one plugin page mentions about 24 hours
TermsNo official terms found; a WordPress plugin that uses it describes it as free for non-commercial use
SupportNo public support channel for outside use

Side by side

mShotsSnapshotFlow
Documentation and termsNone official foundPublic API reference
Full pageNofull_page=true
Viewport and devicesNot documentedwidth, height, viewport_mobile, device_scale_factor
FormatsJPEGPNG, JPEG, WebP, PDF
Waiting for contentNot documentedwait_until, wait_for_selector, delay
Cookie banners and adsNot documentedblock_cookie_banners, block_ads
Key neededNoYes, keep it on the server
CostFree300 free screenshots per new account, then paid

If you run a personal or non-commercial WordPress site and only need small previews, mShots may be all you need. The moment previews matter to your business, documented terms and options are worth more than a free endpoint.

Replacing mShots on a WordPress site? Check one of your links in the playground before you change any code.

Try it in the playground

Why WordPress sites switch from mShots

Documented API and termsA public reference for every parameter, instead of behavior pieced together from blog posts.
Key stays in wp-config.phpRequests run on your server; visitors never see the key.
Previews cached in uploadsEach page view serves a local file; the API is only called when a preview is new or expired.
WebP and retinaformat=webp and device_scale_factor=2 for small, sharp cards.
Mobile previewsviewport_mobile=true shows how linked sites look on phones.
No cookie walls in previewsblock_cookie_banners=true keeps consent popups out of your cards.

Drop-in WordPress function

This function replaces an mShots URL with a cached file in your uploads folder. The API key stays in wp-config.php (define( 'SNAPSHOTFLOW_API_KEY', '...' );) and never reaches the browser.

functions.php
function sf_screenshot_url( $url, $width = 1280 ) { $upload = wp_upload_dir(); $file = 'screenshots/' . md5( $url . '|' . $width ) . '.webp'; $path = trailingslashit( $upload['basedir'] ) . $file; $public = trailingslashit( $upload['baseurl'] ) . $file; if ( file_exists( $path ) && filemtime( $path ) > time() - DAY_IN_SECONDS ) { return $public; } $api = add_query_arg( array( 'url' => rawurlencode( $url ), 'width' => (int) $width, 'format' => 'webp', ), 'https://api.snapshotflow.com/screenshot' ); $res = wp_remote_get( $api, array( 'headers' => array( 'X-Api-Key' => SNAPSHOTFLOW_API_KEY ), 'timeout' => 60, ) ); if ( is_wp_error( $res ) || 200 !== wp_remote_retrieve_response_code( $res ) ) { return file_exists( $path ) ? $public : ''; } wp_mkdir_p( dirname( $path ) ); file_put_contents( $path, wp_remote_retrieve_body( $res ) ); return $public; } // Before: <img src="https://s0.wp.com/mshots/v1/<?php echo rawurlencode( $link ); ?>?w=800"> // After: echo '<img src="' . esc_url( sf_screenshot_url( $link ) ) . '" alt="" loading="lazy">';

The first view of a new URL waits for the capture (a few seconds); later views serve the stored file. If the API is unreachable, the function keeps serving the old file. add_query_arg does not encode values, which is why the target URL goes through rawurlencode. For many links, run the function from WP-Cron instead of during a page view.

Other stacks

Outside WordPress, the same idea is a small proxy route that adds the key and sets cache headers; there is a Node.js version in our thum.io comparison, and a Laravel version in the Laravel screenshot guide. For link previews with titles and images, see the link preview API guide.

Takeaways

  • mShots works for small, non-critical previews but has no official docs or terms we could find.
  • A documented API adds full page, formats, waits and cleanup options.
  • Keep the API key in wp-config.php and cache images in uploads.

WordPress and WordPress.com are trademarks of their respective owners. SnapshotFlow is not affiliated with, endorsed by or sponsored by WordPress.com, Automattic or the WordPress Foundation. Details about mShots come from third-party sources and our own test in October 2026 and may have changed; if you spot an inaccuracy, tell us and we will correct it.

Sources

FAQ

What is WordPress mShots?

mShots is the screenshot service behind WordPress.com that returns an image for a URL such as s0.wp.com/mshots/v1/<encoded URL>?w=800. We could not find official public documentation for it; most usage details come from blog posts and plugins.

Is mShots free for commercial use?

We did not find official terms for the endpoint. The Browser Shots WordPress plugin, which uses it, describes it as free for non-commercial use. For commercial sites, use a service with documented terms.

Why does mShots sometimes show a 'generating preview' image?

According to third-party write-ups, the first request for a URL can return a placeholder while the screenshot is created, and the real image appears after a few seconds on a later request.

How do I replace mShots in WordPress?

Use a small PHP function that fetches the screenshot from an API with your key on the server, stores the file in your uploads folder, and returns its URL. The function in this article does that with a one-day cache.

Screenshots with documented terms and options

Full page, WebP, mobile viewports and cookie-banner blocking from one API, with the key kept on your server. The free tier gives you 300 screenshots, no credit card required.