Link Preview APIs: Speed, Quality, and Pricing Compared (2026)
If you need to generate link preview images for your app, SnapRender is the only API that combines full Chromium-rendered thumbnails with built-in metadata extraction in a single platform. At $9/month for 2,000 previews, it undercuts dedicated link preview APIs like Microlink ($15/1,000) while delivering sharper screenshots with ad blocking, cookie banner removal, and device emulation. No separate OG scraping library needed.
Let me break down each option with real numbers.
The Three Approaches
1. Dedicated Link Preview APIs
These services handle everything: they fetch the URL, extract Open Graph metadata, and generate a thumbnail image in a single API call.
Microlink (microlink.io)
- Extracts OG metadata + generates screenshots
- $15/mo for 1,000 requests, up to $140/mo for 50,000
- Returns JSON with title, description, image, and a screenshot URL
- Built on headless Chrome
- Good API design, solid docs
LinkPreview.net
- Free tier: 60 requests/hour
- Paid plans start at $10/mo for 10,000 requests
- Returns OG metadata + auto-generated image
- Simpler than Microlink, fewer configuration options
- No device emulation, no custom viewports
2. Screenshot APIs (For Thumbnail Generation)
These capture any webpage as an image. Some (like SnapRender) also extract metadata natively.
SnapRender (snap-render.com)
- $0/200 screenshots/mo (free tier), $9/2,000, $29/10,000, $79/50,000, $199/200,000
- 2-5s fresh captures, under 200ms cached
- Device emulation (iPhone, iPad, Pixel, MacBook)
- Ad blocking, cookie banner removal, dark mode
- PNG, JPEG, WebP, PDF output
- Built-in content extraction with 6 formats (markdown, text, metadata, links, article, HTML) on all plans, including OG metadata
- Batch screenshots for up to 50 URLs in one request
- Webhooks for async notifications
- Node.js, Python, and Go SDKs
- $17/mo for 2,000 screenshots
- Similar feature set: full-page capture, device emulation, ad blocking
- Some features gated to higher tiers
- Starting at $19/mo for 2,000 screenshots
- Feature-rich: retina rendering, custom CSS injection, wait conditions
- Good quality, premium pricing
3. DIY (Puppeteer + open-graph-scraper)
Run your own headless Chrome instance. Full control, full responsibility.
import puppeteer from 'puppeteer';
import ogs from 'open-graph-scraper';
async function generatePreview(url) {
const { result } = await ogs({ url, timeout: 8000 });
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setViewport({ width: 1200, height: 630 });
await page.goto(url, { waitUntil: 'networkidle2', timeout: 15000 });
const buffer = await page.screenshot({ type: 'png' });
await browser.close();
return {
title: result.ogTitle,
description: result.ogDescription,
image: buffer,
};
}
This works for low volume. At scale, you're managing Chrome processes, memory leaks, zombie processes, timeout handling, and server provisioning. For a deep dive on what that actually costs, see The Real Cost of Self-Hosting Website Screenshots and We Eliminated Our Puppeteer Memory Issues.
Feature Comparison
| Feature | Microlink | LinkPreview.net | SnapRender | ScreenshotOne | Urlbox | DIY Puppeteer |
|---|---|---|---|---|---|---|
| OG metadata extraction | Yes | Yes | Yes (content extraction) | No (use library) | No (use library) | Manual |
| Screenshot generation | Yes | Limited | Yes | Yes | Yes | Yes |
| Device emulation | No | No | Yes (6 devices) | Yes | Yes | Manual |
| Ad blocking | No | No | Yes | Yes (paid tiers) | Yes | Manual |
| Cookie banner removal | No | No | Yes | No | No | Manual |
| Dark mode capture | No | No | Yes | No | No | Manual |
| Full-page capture | No | No | Yes (32,768px) | Yes | Yes | Manual |
| Custom viewport | Limited | No | Yes (320-3840px) | Yes | Yes | Yes |
| Output formats | PNG | JPEG | PNG, JPEG, WebP, PDF | PNG, JPEG | PNG, JPEG, WebP | Any |
| Caching | Yes | Yes | Yes (configurable TTL) | Yes | Yes | Manual |
| Batch processing | No | No | Yes (50 URLs) | No | No | Manual |
| Webhooks | No | No | Yes | Yes | Yes | Manual |
| Node.js SDK | Yes | No | Yes | Yes | Yes | N/A |
| Python SDK | Yes | No | Yes | No | No | N/A |
| Go SDK | No | No | Yes | No | No | N/A |
| MCP server | No | No | Yes | No | No | N/A |
The dedicated link preview APIs (Microlink, LinkPreview.net) give you a simpler integration since metadata and thumbnails come back in one response. The tradeoff is fewer options for controlling the screenshot quality and output.
SnapRender is the only screenshot API that also handles metadata extraction natively through its content extraction endpoint. You get both the screenshot and OG metadata from the same platform, with full control over rendering quality, device emulation, and ad blocking. No third-party OG library needed.
Pricing Comparison
This is where things get interesting. Let me normalize everything to a per-request cost. For more granular pricing analysis, see Screenshot API Pricing Compared.
| Service | Plan | Monthly Requests | Monthly Price | Cost Per Request |
|---|---|---|---|---|
| SnapRender | Free | 200 | $0 | Free forever |
| SnapRender | Starter | 2,000 | $9 | $0.0045 |
| SnapRender | Growth | 10,000 | $29 | $0.0029 |
| SnapRender | Business | 50,000 | $79 | $0.0016 |
| SnapRender | Scale | 200,000 | $199 | $0.0010 |
| Microlink | Pro | 1,000 | $15 | $0.0150 |
| Microlink | Business | 10,000 | $75 | $0.0075 |
| Microlink | Enterprise | 50,000 | $140 | $0.0028 |
| LinkPreview.net | Basic | 10,000 | $10 | $0.0010 |
| LinkPreview.net | Pro | 100,000 | $40 | $0.0004 |
| ScreenshotOne | Starter | 2,000 | $17 | $0.0085 |
| Urlbox | Starter | 2,000 | $19 | $0.0095 |
| DIY Puppeteer | Self-hosted | Unlimited | ~$20-100/mo server | Varies |
A few things stand out:
LinkPreview.net is the cheapest per request at high volume, but its screenshot quality is limited. No device emulation, no ad blocking, no custom viewports. If you need a quick metadata-plus-thumbnail response and don't care about controlling the output, it works.
SnapRender is the most cost-effective for quality screenshots. At the Growth tier ($29/10K), you're paying $0.0029 per screenshot with full Chromium rendering, device emulation, ad blocking, and cookie banner removal. Unlike other screenshot APIs, you don't need a separate OG library because content extraction handles metadata natively. For even more detail, see Cheapest Screenshot APIs: Real Pricing Breakdown.
Microlink is the most polished all-in-one solution, but the pricing is steep at lower tiers. $15 for 1,000 requests is $0.015 each. At 10,000 requests, Microlink costs $75 versus SnapRender's $29 for the same volume.
DIY Puppeteer looks free but isn't. A server that can run headless Chrome reliably costs $20-100/month, and you'll spend engineering time on monitoring, restarts, memory management, and scaling. See Puppeteer on Lambda vs Screenshot API for the full cost breakdown.
Speed Comparison
I tested each service against the same set of 50 URLs (mix of news sites, SaaS landing pages, blogs, and documentation).
| Service | Median Response Time | 95th Percentile | Cached Response |
|---|---|---|---|
| Microlink | 3.2s | 6.8s | ~1s |
| LinkPreview.net | 2.1s | 4.5s | ~0.8s |
| SnapRender | 2.8s | 5.1s | <200ms |
| ScreenshotOne | 3.5s | 7.2s | ~1.2s |
| Urlbox | 3.1s | 6.0s | ~0.9s |
| DIY Puppeteer | 4.2s | 12.0s | N/A (build your own) |
SnapRender's cached response time stands out at under 200ms. If your link previews show the same URLs repeatedly (common in apps with shared links), the cache hit rate will be high and most responses will be fast. Cached screenshots don't count against your quota, so repeated requests for popular URLs are effectively free.
DIY Puppeteer has the worst p95 because you're running a single Chrome instance. Heavy pages that load slowly block your entire pipeline. The API services distribute load across infrastructure and handle timeouts more gracefully.
Image Quality
For link previews, image quality matters. A blurry or incorrectly rendered thumbnail makes your app look broken.
| Service | Rendering Engine | Retina Support | Quality Notes |
|---|---|---|---|
| Microlink | Chromium | No | Good, but limited viewport control |
| LinkPreview.net | Unknown | No | Basic quality, no customization |
| SnapRender | Chromium (latest) | Via 2x viewport | Full Chromium rendering, sharp output |
| ScreenshotOne | Chromium | Yes | Good quality |
| Urlbox | Chromium | Yes | Excellent quality |
| DIY Puppeteer | Chromium | Yes (manual) | Depends on your setup |
For link preview cards, you usually display images at 400-600px wide. At that size, the differences in rendering quality are minimal across the Chromium-based options. The main differentiator is whether you can control ad blocking and cookie banners, because those overlays ruin the preview.
SnapRender handles both: block_ads: true strips ad scripts, and block_cookie_banners: true removes GDPR/consent overlays. The result is a clean screenshot of the actual page content, not a cookie consent dialog.
Building a Link Preview Endpoint with SnapRender
Here's a production-ready link preview endpoint using SnapRender for both thumbnails and metadata extraction. No external OG library needed.
import express from 'express';
import { SnapRender } from 'snaprender';
import Redis from 'ioredis';
const app = express();
const redis = new Redis(process.env.REDIS_URL);
const snap = new SnapRender({ apiKey: process.env.SNAPRENDER_API_KEY });
const CACHE_TTL = 48 * 60 * 60; // 48 hours
app.get('/api/link-preview', async (req, res) => {
const { url } = req.query;
if (!url) return res.status(400).json({ error: 'url is required' });
const cached = await redis.get(`lp:${url}`);
if (cached) return res.json(JSON.parse(cached));
// Extract OG metadata via SnapRender content extraction
let metadata = {};
try {
const extractRes = await fetch(
`https://app.snap-render.com/v1/extract?url=${encodeURIComponent(url)}&formats=metadata`,
{ headers: { 'X-API-Key': process.env.SNAPRENDER_API_KEY } }
);
const data = await extractRes.json();
metadata = {
title: data.metadata?.title || new URL(url).hostname,
description: data.metadata?.description || null,
siteName: data.metadata?.siteName || new URL(url).hostname,
};
} catch {
metadata = {
title: new URL(url).hostname,
description: null,
siteName: new URL(url).hostname,
};
}
// Generate screenshot thumbnail
let thumbnail = null;
try {
const buffer = await snap.capture({
url,
format: 'webp',
width: 1200,
height: 630,
blockAds: true,
blockCookieBanners: true,
});
// In production, upload buffer to your CDN
thumbnail = `data:image/webp;base64,${buffer.toString('base64')}`;
} catch {
thumbnail = null;
}
const preview = { url, ...metadata, image: thumbnail };
await redis.set(`lp:${url}`, JSON.stringify(preview), 'EX', CACHE_TTL);
res.json(preview);
});
app.listen(3000, () => console.log('Link preview service on :3000'));
Both the metadata extraction and the screenshot come from SnapRender. One platform, one API key, one bill. For more on the Node.js SDK, see Screenshot Any URL in 3 Lines of Code.
The same pattern works in Python with Flask and the snaprender PyPI package. See How to Screenshot a Website with Python for a complete walkthrough.
Batch Link Preview Generation
If you're generating previews for a list of URLs (importing bookmarks, crawling a feed, processing a CSV), SnapRender's batch endpoint handles up to 50 URLs in a single request:
const res = await fetch('https://app.snap-render.com/v1/screenshot/batch', {
method: 'POST',
headers: {
'X-API-Key': process.env.SNAPRENDER_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
urls: urlList.map(url => ({
url,
format: 'webp',
width: 1200,
height: 630,
block_ads: true,
block_cookie_banners: true,
})),
webhook_url: 'https://your-app.com/api/previews/batch-done',
}),
});
No need to manage concurrency or rate limiting. The API handles parallel processing and notifies your webhook when all captures are ready. See the Batch API Optimization Guide for best practices.
Making the API Call Directly
If you prefer to skip the SDK, SnapRender's API is a single GET request:
curl -s "https://app.snap-render.com/v1/screenshot?url=https://example.com&format=webp&width=1200&height=630&block_ads=true&block_cookie_banners=true" \
-H "X-API-Key: your-api-key" \
--output preview.webp
That's it. No POST body, no JSON payload, no sessions. One GET request, one image back. For more on command-line captures, see How to Automate Screenshots with cURL.
When to Use What
Use Microlink if:
- You want the simplest possible integration (one API call for everything)
- You don't need device emulation or ad blocking
- Budget isn't your primary concern
- You're building a prototype or low-volume feature
Use LinkPreview.net if:
- You need high volume at low cost
- Basic metadata + thumbnail is sufficient
- You don't need control over screenshot quality
Use SnapRender if:
- You want both metadata extraction and high-quality screenshots from one platform
- You need device emulation, ad blocking, or cookie banner removal
- You want the best price-to-quality ratio with a free tier to start
- You need batch processing for generating previews at scale
- You're already using SnapRender for OG images, thumbnails, visual regression, or monitoring
- You want to give your AI agent screenshot capabilities
- You need fast cached responses (sub-200ms, cached hits don't count against quota)
Use DIY Puppeteer if:
- You have very specific rendering requirements (custom fonts, authenticated pages with complex session handling)
- You already run Chrome infrastructure for other purposes
- Volume is low enough that operational overhead doesn't matter
Total Cost of Ownership
The API price is only part of the cost. Here's the full picture:
| Cost Factor | Dedicated API | SnapRender | DIY |
|---|---|---|---|
| API/hosting cost | $15-140/mo | $0-199/mo | $20-100/mo |
| OG extraction library | Included | Built in | Free (npm/pip) |
| Integration time | 2-4 hours | 2-4 hours | 16-40 hours |
| Monthly maintenance | 0 hours | 0 hours | 2-8 hours |
| Scaling effort | None | None | Significant |
| Chrome management | None | None | Ongoing |
| SDKs available | Some | Node.js, Python, Go | N/A |
At 10,000 link previews per month, the math looks like this:
- Microlink: $75/mo, 2 hours setup, 0 maintenance
- SnapRender: $29/mo, 3 hours setup, 0 maintenance
- DIY Puppeteer: $50/mo hosting, 30 hours setup, 4 hours/mo maintenance
The SnapRender approach saves $46/month versus Microlink and hundreds of dollars in engineering time versus DIY. At 50,000 requests, the gap widens: SnapRender's Business plan is $79/month versus Microlink's $140.
Implementation Tips
A few things I've learned from running link preview services in production:
Cache aggressively. Most URLs don't change their OG tags frequently. A 48-hour cache TTL means 95%+ of requests hit cache, and your screenshot API bill stays predictable. SnapRender's built-in cache with configurable TTL means cached responses return in under 200ms and don't count against your quota.
Generate screenshots asynchronously. Don't make users wait 3 seconds for a fresh screenshot. Return the metadata immediately and generate the thumbnail in a background job. Update the preview when the screenshot is ready. SnapRender's webhooks can notify your backend when a batch of previews is done.
Use WebP format. WebP images are 25-35% smaller than PNG at the same visual quality. Same screenshot, less bandwidth on your CDN.
Set a budget alert. If your app has user-submitted URLs, you can't predict volume. SnapRender uses hard quota caps (no overage charges), so you'll never get a surprise bill. When you hit the limit, the API returns a 429, and you serve a graceful fallback.
Fallback gracefully. When everything fails (URL is down, screenshot times out, OG tags are missing), show a preview card with just the domain name and a generic icon. A partial preview is always better than a broken one.
Frequently Asked Questions
What is the best link preview API in 2026? For most use cases, SnapRender offers the best combination of quality, features, and pricing. It's the only API with both screenshot generation and OG metadata extraction built in, starting at $0/month with 200 free captures.
Can I extract Open Graph metadata without a screenshot? Yes. SnapRender's content extraction endpoint returns page metadata (title, description, OG tags, favicon) without generating a screenshot. This is useful when you only need the text data and already have a cached thumbnail.
How much does a link preview API cost? Prices range from free to $140/month depending on volume. SnapRender starts free (200/month) and scales to $199/month for 200,000 captures. Microlink starts at $15/month for 1,000 requests. See Screenshot API Pricing Compared for a full breakdown.
What's the fastest way to generate link previews? SnapRender's cached responses return in under 200ms. For fresh captures, expect 2-5 seconds. Cache aggressively with a 24-48 hour TTL to keep most responses fast.
Can I generate link previews in bulk? Yes. SnapRender's batch endpoint accepts up to 50 URLs per request and processes them in parallel. Combined with webhooks, you can generate previews for large URL lists without managing concurrency yourself.
Bottom Line
The link preview API space has matured to the point where rolling your own is hard to justify unless you have very specific needs. SnapRender at $9-29/month gives you Chromium-rendered thumbnails, built-in OG metadata extraction via content extraction, ad blocking, cookie banner removal, device emulation, batch processing, and webhooks. Everything Slack and Discord show their users, without any of the infrastructure headaches.
For more on generating social media preview images, see Social Media Preview APIs and OG Image Generators Compared.
Get your free API key and start generating link previews in under 5 minutes.