SnapAPI/public/use-cases/social-media-previews.html
Hoid 9fe59d4867
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
feat: add WCAG 2.1 AA accessibility landmarks and skip-to-content link
- Wrap nav in <header> landmark on all pages
- Wrap content in <main id='main-content'> on all pages
- Add skip-to-content link (visually hidden, visible on focus)
- Add skip-link CSS styles
- Add 65 accessibility tests covering all 16 full-layout pages
- All 288 tests passing
2026-03-03 15:04:55 +01:00

204 lines
13 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Generate OG Images & Social Media Previews with a Screenshot API | SnapAPI</title>
<meta name="description" content="Use SnapAPI to generate dynamic OG images and social media preview cards from HTML templates. Render custom Open Graph images on-the-fly with a simple API call.">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📸</text></svg>">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link rel="canonical" href="https://snapapi.eu/use-cases/social-media-previews">
<meta property="og:title" content="Generate OG Images & Social Media Previews with a Screenshot API">
<meta property="og:description" content="Render dynamic Open Graph images and Twitter cards from HTML templates using SnapAPI.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://snapapi.eu/use-cases/social-media-previews">
<meta property="og:image" content="https://snapapi.eu/og-image.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Generate OG Images & Social Media Previews with a Screenshot API">
<meta name="twitter:description" content="Render dynamic Open Graph images and Twitter cards from HTML templates using SnapAPI.">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"Article","headline":"Generate OG Images & Social Media Previews with a Screenshot API","description":"Use SnapAPI to generate dynamic OG images and social media preview cards from HTML templates.","author":{"@type":"Organization","name":"Cloonar Technologies GmbH"},"publisher":{"@type":"Organization","name":"SnapAPI","url":"https://snapapi.eu"},"datePublished":"2026-03-02","url":"https://snapapi.eu/use-cases/social-media-previews"}
</script>
<style>
*{box-sizing:border-box;margin:0;padding:0}
:root{
--bg:#0a0e17;--bg2:#0f1420;--card:#141a28;--card-hover:#1a2235;
--border:#1e2a3f;--border-light:#2a3752;
--text:#f0f2f7;--text-secondary:#94a3c0;--muted:#6b7a96;
--primary:#4f8fff;--primary-light:#6da3ff;--primary-dark:#3a6fd8;--primary-glow:rgba(79,143,255,0.15);
--accent:#10b981;--accent-glow:rgba(16,185,129,0.15);
--purple:#a78bfa;--orange:#f59e0b;--pink:#ec4899;
--gradient:linear-gradient(135deg,#4f8fff 0%,#a78bfa 50%,#ec4899 100%);
--radius:12px;--radius-lg:16px;--radius-xl:24px;
}
html{scroll-behavior:smooth}
body{font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.6;-webkit-font-smoothing:antialiased}
a{color:var(--primary-light);text-decoration:none;transition:color .2s}
a:hover{color:var(--primary)}
::selection{background:var(--primary);color:#fff}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.btn{display:inline-flex;align-items:center;gap:8px;padding:12px 28px;border-radius:10px;font-weight:600;font-size:.95rem;border:none;cursor:pointer;transition:all .2s;font-family:inherit}
.btn-primary{background:var(--primary);color:#fff;box-shadow:0 4px 20px rgba(79,143,255,0.3)}
.btn-primary:hover{background:var(--primary-dark);transform:translateY(-1px);box-shadow:0 6px 28px rgba(79,143,255,0.4);color:#fff}
.btn-lg{padding:16px 36px;font-size:1.05rem;border-radius:12px}
nav{position:sticky;top:0;z-index:100;background:rgba(10,14,23,0.85);backdrop-filter:blur(20px);border-bottom:1px solid rgba(30,42,63,0.5);padding:0 24px}
.nav-inner{max-width:1180px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;height:64px}
.nav-logo{font-size:1.15rem;font-weight:800;display:flex;align-items:center;gap:8px;color:var(--text)}
.nav-logo span{background:var(--gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
.nav-links{display:flex;gap:32px;align-items:center}
.nav-links a{color:var(--muted);font-size:.9rem;font-weight:500;transition:color .2s}
.nav-links a:hover{color:var(--text)}
.nav-cta{margin-left:8px}
.nav-mobile{display:none;background:none;border:none;color:var(--text);font-size:1.5rem;cursor:pointer}
.article{padding:80px 0 60px}
.article h1{font-size:2.5rem;font-weight:800;line-height:1.2;margin-bottom:24px}
.article h2{font-size:1.6rem;font-weight:700;margin:48px 0 16px}
.article h3{font-size:1.2rem;font-weight:600;margin:32px 0 12px}
.article p{color:var(--text-secondary);font-size:1rem;line-height:1.8;margin-bottom:16px}
.article ul,.article ol{color:var(--text-secondary);margin:0 0 16px 24px;line-height:1.8}
.article li{margin-bottom:8px}
.code-window{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;margin:24px 0;box-shadow:0 10px 40px rgba(0,0,0,0.2)}
.code-titlebar{display:flex;align-items:center;gap:8px;padding:14px 20px;background:rgba(0,0,0,0.2);border-bottom:1px solid var(--border)}
.code-dot{width:12px;height:12px;border-radius:50%}
.code-dot:nth-child(1){background:#ff5f57}.code-dot:nth-child(2){background:#ffbd2e}.code-dot:nth-child(3){background:#28c840}
.code-titlebar span{flex:1;text-align:center;font-size:.8rem;color:var(--muted);font-weight:500}
.code-body{padding:24px;font-family:'JetBrains Mono',monospace;font-size:.85rem;line-height:1.9;overflow-x:auto;color:var(--text-secondary)}
.code-body .kw{color:var(--purple)}.code-body .str{color:var(--accent)}.code-body .cmt{color:#475569;font-style:italic}.code-body .fn{color:var(--primary-light)}.code-body .prop{color:var(--orange)}
.cta-box{background:linear-gradient(135deg,rgba(79,143,255,0.1) 0%,rgba(167,139,250,0.1) 100%);border:1px solid rgba(79,143,255,0.2);border-radius:var(--radius-xl);padding:48px;text-align:center;margin:48px 0}
.cta-box h2{font-size:1.8rem;font-weight:800;margin-bottom:12px}
.cta-box p{color:var(--text-secondary);margin-bottom:24px}
.related{margin:48px 0;padding:32px;background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg)}
.related h3{font-size:1.1rem;font-weight:700;margin-bottom:16px}
.related a{display:block;padding:8px 0;font-size:.95rem}
footer{border-top:1px solid var(--border);padding:48px 24px 32px;background:var(--bg2)}
.footer-grid{max-width:1180px;margin:0 auto;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:40px;margin-bottom:40px}
.footer-brand h4{font-size:1.1rem;font-weight:800;margin-bottom:12px;display:flex;align-items:center;gap:8px}
.footer-brand p{color:var(--muted);font-size:.85rem;line-height:1.6;max-width:280px}
.footer-col h5{font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:1.5px;color:var(--muted);margin-bottom:16px}
.footer-col a{display:block;color:var(--text-secondary);font-size:.88rem;padding:4px 0;transition:color .2s}
.footer-col a:hover{color:var(--text)}
.footer-bottom{max-width:1180px;margin:0 auto;padding-top:24px;border-top:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px;font-size:.8rem;color:var(--muted)}
@media(max-width:640px){
.article{padding:40px 0 30px}
.article h1{font-size:1.8rem}
.nav-links{display:none;flex-direction:column;position:absolute;top:64px;left:0;right:0;background:rgba(10,14,23,0.97);backdrop-filter:blur(20px);border-bottom:1px solid var(--border);padding:16px 24px;gap:16px;z-index:99}
.nav-links.show{display:flex}
.nav-mobile{display:block}
.footer-grid{grid-template-columns:1fr}
}
.skip-link{position:absolute;top:-100%;left:50%;transform:translateX(-50%);background:var(--primary);color:#fff;padding:12px 24px;border-radius:0 0 8px 8px;font-weight:600;font-size:.9rem;z-index:1000;transition:top .2s}
.skip-link:focus{top:0}
</style>
</head>
<body>
<a href="#main-content" class="skip-link">Skip to content</a>
<header>
<nav>
<div class="nav-inner">
<a href="/" class="nav-logo">📸 <span>SnapAPI</span></a>
<div class="nav-links">
<a href="/#features">Features</a>
<a href="/#playground">Try It Free</a>
<a href="/#pricing">Pricing</a>
<a href="/docs">API Docs</a>
<a href="/#pricing" class="btn btn-primary btn-sm nav-cta">Get API Key</a>
</div>
<button class="nav-mobile" onclick="document.querySelector('.nav-links').classList.toggle('show')" aria-label="Menu"></button>
</div>
</nav>
</header>
<main id="main-content">
<article class="article">
<div class="container">
<h1>Generate OG Images & Social Media Previews with a Screenshot API</h1>
<p>When you share a link on Twitter, LinkedIn, or Slack, the platform fetches an Open Graph image to display as a preview card. Static OG images are fine for homepages — but what about blog posts, user profiles, or product pages that need <strong>unique, dynamic preview images</strong>?</p>
<p>SnapAPI lets you render any HTML page as a PNG image via a simple API call. Build an HTML template with your title, author, and branding, host it on a URL, and let SnapAPI screenshot it into a pixel-perfect OG image.</p>
<h2>How It Works</h2>
<p>The workflow is straightforward:</p>
<ol>
<li><strong>Create an HTML template</strong> — Design your OG card layout (1200×630px) with CSS. Use query parameters for dynamic content.</li>
<li><strong>Call SnapAPI</strong> — Pass the template URL to the screenshot endpoint. SnapAPI renders it in a real Chromium browser.</li>
<li><strong>Serve the image</strong> — Use the returned PNG as your <code>og:image</code> meta tag, or cache it on your CDN.</li>
</ol>
<h2>Code Example</h2>
<h3>Screenshot an OG Template</h3>
<div class="code-window">
<div class="code-titlebar"><span class="code-dot"></span><span class="code-dot"></span><span class="code-dot"></span><span>Node.js</span></div>
<div class="code-body"><pre><span class="kw">const</span> response = <span class="kw">await</span> <span class="fn">fetch</span>(<span class="str">'https://snapapi.eu/v1/screenshot'</span>, {
method: <span class="str">'POST'</span>,
headers: {
<span class="str">'Content-Type'</span>: <span class="str">'application/json'</span>,
<span class="str">'X-API-Key'</span>: process.env.<span class="prop">SNAPAPI_KEY</span>
},
body: JSON.stringify({
url: <span class="str">'https://yoursite.com/og-template?title=My+Post&amp;author=Jane'</span>,
width: <span class="prop">1200</span>,
height: <span class="prop">630</span>,
format: <span class="str">'png'</span>
})
});
<span class="kw">const</span> imageBuffer = <span class="kw">await</span> response.<span class="fn">arrayBuffer</span>();
<span class="cmt">// Upload to S3, serve from CDN, or return directly</span></pre></div>
</div>
<h3>Dynamic Meta Tags</h3>
<p>Point your <code>og:image</code> to a serverless function that calls SnapAPI on-the-fly:</p>
<div class="code-window">
<div class="code-titlebar"><span class="code-dot"></span><span class="code-dot"></span><span class="code-dot"></span><span>HTML</span></div>
<div class="code-body"><pre><span class="cmt">&lt;!-- In your page's &lt;head&gt; --&gt;</span>
&lt;meta property=<span class="str">"og:image"</span>
content=<span class="str">"https://yoursite.com/api/og?title=My+Blog+Post"</span> /&gt;
&lt;meta property=<span class="str">"og:image:width"</span> content=<span class="str">"1200"</span> /&gt;
&lt;meta property=<span class="str">"og:image:height"</span> content=<span class="str">"630"</span> /&gt;</pre></div>
</div>
<h2>Why Use SnapAPI for OG Images?</h2>
<ul>
<li><strong>Real browser rendering</strong> — Full CSS support, custom fonts, gradients, SVGs. No template language limitations.</li>
<li><strong>EU-hosted, GDPR compliant</strong> — All rendering happens on servers in Germany. No data leaves the EU.</li>
<li><strong>Fast</strong> — Typical render times under 2 seconds. Cache the result and serve instantly.</li>
<li><strong>Simple API</strong> — One POST request, one image back. No SDKs required.</li>
</ul>
<div class="cta-box">
<h2>Start Generating OG Images</h2>
<p>Try SnapAPI free in the playground — no signup needed.</p>
<a href="/#pricing" class="btn btn-primary btn-lg">Get Your API Key →</a>
</div>
<div class="related">
<h3>Related Use Cases</h3>
<a href="/use-cases/website-monitoring">Visual Website Monitoring & Regression Testing →</a>
<a href="/use-cases/pdf-reports">Generate Visual Reports & Thumbnails from Web Content →</a>
</div>
</div>
</article>
</main>
<footer>
<div class="footer-grid">
<div class="footer-brand"><h4>📸 SnapAPI</h4><p>The EU-hosted screenshot API for developers. Convert any URL to a pixel-perfect image with a simple API call.</p></div>
<div class="footer-col"><h5>Product</h5><a href="/#features">Features</a><a href="/#pricing">Pricing</a><a href="/#playground">Playground</a><a href="/docs">API Docs</a></div>
<div class="footer-col"><h5>Developers</h5><a href="/docs">Swagger / OpenAPI</a><a href="/health">Status</a></div>
<div class="footer-col"><h5>Legal</h5><a href="/impressum.html">Impressum</a><a href="/privacy.html">Privacy Policy</a><a href="/terms.html">Terms of Service</a></div>
</div>
<div class="footer-bottom">
<span>© 2026 Cloonar Technologies GmbH · FN 631089y · ATU81280034</span>
<span>Linzer Straße 192/1/2, 1140 Wien, Austria 🇦🇹</span>
<span>EU-hosted 🇪🇺 · All data stays in Europe</span>
</div>
</footer>
</body>
</html>