Scrapers / Developer & File Tools

OG Image Generator
hipersoft/og-image-generator
Generate 1200×630 Open Graph / Twitter social share PNG images from a title, subtitle and theme, in bulk. Fast and lightweight — perfect for blogs, social previews and n8n/Make/Zapier automations.
Total users
3Monthly users
2Total runs
74Per image generated
$0.004Last rebuilt
Oct 26, 2026Overview
Turn a title and a theme into a polished 1200×630 social share image — in bulk, in seconds.
Generate Open Graph and Twitter/X card PNGs for every blog post, landing page or product without opening a design tool. Fast, lightweight, no templates to wrangle — just pass text and get share-ready images back.
What it does
- Renders clean 1200×630 PNG cards (the standard Open Graph / Twitter card size).
- Large auto-wrapping title, optional subtitle, and a colored accent bar.
- Seven built-in themes with tasteful background gradients: dark, light, ocean, sunset, forest, grape, mono.
- Optional logo in the top-left corner.
- Processes an array of items in one run — one image per row, saved to the key-value store.
Use cases
- Blogs & CMS — auto-generate a matching OG image for every article so links look great when shared.
- Social preview cards — consistent, on-brand link previews across X/Twitter, LinkedIn, Slack and Discord.
- Landing pages & product launches — spin up dozens of variants for A/B testing headlines.
- Automation (n8n / Make / Zapier) — wire it into a workflow to auto-generate an OG image per post: publish an article, trigger this Actor with the title, and drop the returned image URL straight into your
og:imagemeta tag.
Input
{
"items": [
{ "title": "Ship faster with automation", "subtitle": "The complete guide to no-code workflows", "theme": "ocean" },
{ "title": "10 tips for better OG images", "subtitle": "Boost your click-through rate", "theme": "sunset", "accent": "#f97316" }
]
}
A single object is also accepted, e.g. { "items": { "title": "Hello World" } }.
| Field | Type | Description |
|---|---|---|
items |
array | Cards to render. Each item needs a title; the rest are optional. |
items[].title |
string | Main heading (wraps automatically, auto-sized). Required. |
items[].subtitle |
string | Optional secondary line under the title. |
items[].theme |
string | One of dark, light, ocean, sunset, forest, grape, mono. |
items[].accent |
string | Optional hex color for the accent bar (e.g. #22d3ee). |
items[].logoUrl |
string | Optional https URL of a small logo shown top-left. |
theme |
string | Default theme for items that don't set their own. |
accent |
string | Default accent color for items that don't set their own. |
Output
Each generated image is saved as a PNG in the run's key-value store, and one row per item is pushed to the dataset:
{
"title": "Ship faster with automation",
"theme": "ocean",
"bytes": 154660,
"width": 1200,
"height": 630,
"resultUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/og-0001.png",
"ok": true
}
Output schema
| Field | Type | Description |
|---|---|---|
title |
string | The title rendered on the card. |
theme |
string | The theme used for this card. |
bytes |
integer | Size of the generated PNG in bytes. |
width |
integer | Image width (always 1200). |
height |
integer | Image height (always 630). |
resultUrl |
string | Direct URL to the PNG in the key-value store. |
ok |
boolean | Whether the image was generated successfully. |
FAQ
What size are the images? Exactly 1200×630 pixels — the recommended size for Open Graph (og:image) and Twitter/X summary large image cards.
Do I need to supply a font? No — a font is bundled in. Everything is rendered server-side, so runs are fast and light on memory.
Can I automate it? Yes — connect it to your stack via integrations on the Apify platform and the Apify API. A typical n8n / Make / Zapier flow triggers this Actor on publish and writes the returned resultUrl into your page's og:image.
What happens if one item fails? The run keeps going. That item gets a row with ok: false and an error message, so a single bad input never breaks the batch.
Notes
Original clean-room implementation.
Input
| Field | Type | Description |
|---|---|---|
items requiredItems | array | Array of card objects to render. Each item: { "title": string (required), "subtitle": string (optional), "theme": string (optional: dark, light, ocean, sunset, forest, grape, mono), "accent": string (optional hex color for the accent bar/subtitle, e.g. "#22d3e |
themeDefault theme | string · dark, light, ocean, sunset, forest, grape… | Fallback theme used for any item that does not set its own `theme`. Default: "dark" |
accentDefault accent color | string | Fallback accent color (hex, e.g. "#22d3ee") used for any item that does not set its own `accent`. Default: "#38bdf8" |
API
curl -X POST "https://api.apify.com/v2/acts/hipersoft~og-image-generator/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"title": "Ship faster with automation",
"subtitle": "The complete guide to no-code workflows",
"theme": "ocean"
},
{
"title": "10 tips for better OG images",
"subtitle": "Boost your click-through rate",
"theme": "sunset"
}
]
}'from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("hipersoft/og-image-generator").call(run_input={
"items": [
{
"title": "Ship faster with automation",
"subtitle": "The complete guide to no-code workflows",
"theme": "ocean"
},
{
"title": "10 tips for better OG images",
"subtitle": "Boost your click-through rate",
"theme": "sunset"
}
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('hipersoft/og-image-generator').call({
"items": [
{
"title": "Ship faster with automation",
"subtitle": "The complete guide to no-code workflows",
"theme": "ocean"
},
{
"title": "10 tips for better OG images",
"subtitle": "Boost your click-through rate",
"theme": "sunset"
}
]
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Pricing
| Event | Price | Paid plans from |
|---|---|---|
| Image Generated Charged per social/OG image generated. | $0.004 | $0.002 |
You pay only for what the run returns. Set a maximum cost per run and it stops cleanly at that limit.
Related scrapers
Bulk Image Downloader
Download thousands of images from a list of URLs and store each in the key-value store with a public link. Returns content type, size, dimensions and SHA-256 per image. Bulk-ready. Great for datasets, backups and media pipelines.
8,102 runs · 103 users · $0.056 / url processedText to Speech
Convert any text to natural-sounding speech as an MP3 download. 300+ premium neural voices across 70+ languages, adjustable rate, pitch and volume. Great for voiceovers, videos, accessibility and audio content. No setup.
278 runs · 22 users · $0.01 / audio generatedGoogle Maps Email Extractor
Search Google Maps for businesses, then crawl each business website to extract emails, social profiles and extra phone numbers. Turns any Maps search into a ready lead list. No setup.
159 runs · 8 users · $0.006 / business lead scrapedWebsite Screenshot
Capture full-page or viewport screenshots of any URL as PNG or JPEG, at any device size. For monitoring, previews, thumbnails and automation workflows.
156 runs · 3 users · $0.004 / screenshot capturedBulk URL Status Checker
Check thousands of URLs over plain HTTP: status codes, broken links (404/410/5xx), full redirect chains, response time, content type, page title and SSL certificate expiry.
154 runs · 13 users · $0.002 / url checkedGoogle Search Scraper
Scrape Google Search results (organic listings) for any query: title, URL, displayed URL, snippet and position. Multi-query, per-country/language, pagination. Uses Google SERP proxy — reliable, no captcha, no setup.
121 runs · 8 users · $0.001 / result scrapedSend the site and the fields. We build it and you get it first.