Every page that gets shared needs an Open Graph image, and static placeholders leave clicks on the table. The reliable pattern: build an HTML template with your fonts and brand, interpolate the title/author/data per page, and render it at exactly 1200×630 in a real browser.
Because Screenshotty accepts raw HTML, the whole pipeline is one POST per image — no canvas libraries, no font rasterization bugs, no design tool exports.
const html = ogTemplate({ title: post.title, author: post.author });const res = await fetch("https://api.screenshotty.link/api/v1/screenshot", {method: "POST",headers: {"X-Api-Key": process.env.SCREENSHOTTY_API_KEY,"Content-Type": "application/json",},body: JSON.stringify({html,format: "image/png",viewport_width: 1200,viewport_height: 630,}),});
Set the viewport to 1200×630 (or any platform spec) and capture precisely that box.
Google Fonts and custom @font-face render exactly as in Chrome — no metric drift.
POST the interpolated HTML per request, or capture a parameterized URL of your own /og route.
response_type=json returns a hosted image URL you can store and serve from your CDN.
Both work. POSTing HTML is simplest for templates. Capturing a URL (e.g. your own /og/[slug] route) is convenient when the template needs your app's components — point the API at it with viewport 1200×630.
Use ready_event=networkidle and, for icon fonts or late-loading assets, add a small wait_ms buffer. Fonts referenced in the HTML are fetched like in any browser tab.
Yes. 100 screenshots per month free, no credit card required. Paid plans start at $9/month for 2,500 screenshots with $0.004 pay-as-you-go overage.
Yes — fire one request per page at publish time and store the result, or use webhook_url for async delivery on large back-catalogs.