A campaign graphic is rarely one image. The link preview wants 1.91:1, the feed wants a square or a 4:5 portrait, stories and Reels want 9:16, Pinterest wants 2:3 and YouTube 16:9. Designing the same card six times — or cropping one master until the headline falls off — is the slow part of social publishing. With Shareglint you design the template once and ask for every shape in one request: "sizes": ["og", "square", "portrait", "story", "pinterest", "youtube"]. Each size is laid out again from the HTML at its own width and height, so nothing is cropped, stretched or letterboxed.
The presets
There are 6 size presets: og 1200×630, square 1080×1080, portrait 1080×1350, story 1080×1920, pinterest 1000×1500, youtube 1280×720. They map to where images go:
| Preset | Shape | Typical use |
|---|---|---|
og |
1.91:1 | Link previews (og:image) on Facebook, LinkedIn, X, Slack, WhatsApp |
square |
1:1 | Feed posts, carousels, podcast covers |
portrait |
4:5 | Portrait feed posts on Instagram and Facebook |
story |
9:16 | Stories, Reels and Shorts covers, TikTok |
pinterest |
2:3 | Pins |
youtube |
16:9 | Video thumbnails |
Raster files (PNG, JPEG, WebP) come out at twice the preset's pixel size by default, so the story file is 2160×3840 — sharp on any phone. The platforms' own numbers, each with its source and the date we checked it, are on the social media image sizes page; the link preview in detail is on OG image size.
One request, every size
curl -X POST "https://shareglint.com/v1/images?wait=true" \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"template": "blog-og",
"sizes": ["og", "square", "portrait", "story", "pinterest"],
"modifications": {
"title": "We moved to a four-day week. Here is what happened.",
"author": "Northwind Engineering",
"site": "northwind.dev",
"photo": "https://cdn.example.com/team.jpg"
}
}'
The answer is {"renders": [...]} with one entry per size, in the order you listed them: its own id, size and url. Each size is an ordinary render — its own cache entry, webhook call and refund if it fails — so you can store the URLs next to the post in your CMS and hand them to a scheduler.
Two rules keep the bill predictable:
- All or nothing. If the quota left this month does not cover every new size, you get a
402and nothing is queued. You never end up with the square but not the story. - Repeats are free. A size already rendered with the same values returns the existing file at no cost, so adding
storyto a request you sent yesterday only pays for the story.
Batches take sizes too: a CSV of 40 blog posts with "sizes": ["og", "square", "pinterest"] returns 120 images and one ZIP. Signed URLs take a size parameter instead (…/blog-og.png?title=…&size=story&s=…); it is signed like every other value, so a URL signed for one size cannot be switched to another.
Re-laid out, not cropped
Resizing tools that start from a finished bitmap have two options: crop or pad. Cropping a 1200×630 card to 9:16 keeps a narrow slice of the middle; padding it gives a small card floating in a tall coloured box. Rendering from HTML has a third option: lay the content out again. A wide card can put the photo beside the headline, a square one stack them, a story give the headline more of the height — whatever the template's CSS says for that shape.
Every one of the 153 built-in templates does this already. Long headlines shrink to fit their box in every shape instead of running off the edge, and accent and theme apply to all sizes the same way. The template gallery shows each template rendered in several shapes before you write any code.
Your own template in every shape
A template you write yourself in HTML and CSS gets the same treatment, with two hooks on the <html> element during each render:
- a shape class:
shape-landscape,shape-squareorshape-tall; - a size class:
size-og,size-story,size-pinterestand so on.
Most layouts need only the shape classes:
.card { display: flex; gap: 48px; padding: 64px; height: 100%; }
.shape-landscape .card { flex-direction: row; align-items: center; }
.shape-square .card,
.shape-tall .card { flex-direction: column; justify-content: flex-end; }
.shape-tall h1 { font-size: 96px; } /* a story is seen full-screen on a phone */
.size-story .card { padding-bottom: 360px; } /* keep text clear of the reply bar */
Use units that follow the box — percentages, flex, grid, vh/vw of the render — rather than fixed pixel positions, and the template reflows. Check every shape for free before spending quota: the template preview (POST /v1/templates/preview) uses no quota and takes the same size values.
A template whose own dimensions equal a preset (a 1080×1080 design asked for square) renders the same image as without size — one cache entry, not two.
Where the time goes
What one-template-every-size saves is not the render time — that is a second or two per image either way — but the manual steps around it:
- No per-network design files. A typo in the headline is fixed once and re-rendered everywhere.
- No cropping review. The layout is decided by the template, so nobody checks six exports for a cut-off logo.
- No upload shuffle. The response lists every URL; a scheduler or an automation tool (n8n or Make) posts each size to its own network.
For a blog, the usual set is og for the article's og:image, square or portrait for the feed post and pinterest for a pin. For a podcast or video channel, youtube for the thumbnail, square for the episode cover and story for the announcement.
Cost
One render per image and size. A post in five sizes is five renders; the same five again are free. The Free plan's 100 renders a month carry a watermark; Starter is $9 a month for 2,000 renders and Pro $29 for 10,000 (pricing). An animated GIF or MP4 costs 5 renders per size, as with any animated render.
What it does not do
- No platform-specific safe zones guaranteed. Each network's buttons and captions cover a different part of the image and change without notice; if your design is tight, keep text away from the edges in your own template. Meta, for example, recommends keeping about 14% at the top and 35% at the bottom of a story ad free of text (Meta Ads Guide).
- No arbitrary sizes in one request.
sizestakes the presets; for another size (a LinkedIn banner at 1584×396, say), save a template at that size. - No posting. The API returns image URLs; your scheduler, CMS or automation publishes them.
- No AI recomposition. The layout follows the HTML and CSS you or the built-in template wrote — it does not move objects around inside a photo. For "smart crop" of a photograph, a dedicated image CDN such as Cloudinary is the right tool; for a designed card with text, a template that reflows is.