One URL in, one screenshot out. No SDK required.
Put your page URL after ours. That's the whole API:
https://thumb.im/https://example.com
The most common use is an OpenGraph image, so every link you share gets a live screenshot card:
<meta property="og:image"
content="https://thumb.im/https://example.com/pricing" />
Screenshots default to 1200x630 (the OpenGraph size), captured at 2x pixel density, and are cached after the first request. Query strings on your URL are preserved.
<meta> tag or at
/.well-known/thumb-im-verification.txt — that makes it yours alone.
og:image tag. That's it — captures happen on demand and refresh themselves.
Want a designed card instead of a screenshot of a page? See Render your own HTML — no domain needed.
Add option segments between our domain and your URL. Combine as many as you need:
https://thumb.im/small/https://example.com https://thumb.im/1200x630/https://example.com https://thumb.im/small/dark/zoom:2/https://example.com https://thumb.im/opengraph/delay:500/transparent/https://example.com
| Segment | Meaning |
|---|---|
| small · medium · large · opengraph | Size presets: 375px, 650px, 1024px wide, or 1200x630 |
| 1200x630 | Custom dimensions (width x height, up to 5000px) |
| dark · light | Force a color scheme |
| transparent | Transparent background |
| fullpage | Capture the whole page, not just the viewport |
| zoom:2 | Extra pixel density (up to 3) |
| delay:500 | Wait N ms after load before capturing (up to 10000) |
| wait:networkidle | When to consider the page loaded: load, domcontentloaded, networkidle |
| ratio:16x9 | Derive height from width by aspect ratio |
Unknown segments are ignored rather than breaking your image — a typo in a template won't take down every card on your site.
Prefer explicit parameters? /shot/ takes the same options as a query string:
https://thumb.im/shot/?url=https://example.com&size=opengraph https://thumb.im/shot/?url=https://example.com&width=1200&height=630 https://thumb.im/shot/?url=https://example.com&color_scheme=dark&full_page=true
Parameters: url (required), size, width, height, aspect_ratio, zoom, delay, wait_until, full_page, color_scheme, transparent.
If you can write the card you want as an HTML page, send us the markup and we'll return the image — no headless browser in your build, no Playwright to install. Handy for OpenGraph cards you generate per post, per product, or per release.
curl -X POST https://thumb.im/apis/render/ \
-H "X-API-Key: ti_..." \
-H "Content-Type: application/json" \
-d '{
"html": "<html><body style=\"margin:0;width:1200px;height:630px;display:flex;align-items:center;justify-content:center;background:#0f172a;color:#fff;font:600 72px sans-serif\">Hello</body></html>",
"width": 1200,
"height": 630
}'
You get back a permanent URL, ready to paste into a meta tag:
{
"image_url": "https://thumb.im/rendered/<hash>.png",
"width": 1200,
"height": 630
}
data: URIs for images and fonts; there's no page origin to resolve relative paths against.For programmatic control, authenticate with an API key in the X-API-Key header — create one on the API Keys page:
curl -H "X-API-Key: ti_..." \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "size": "opengraph"}' \
https://thumb.im/apis/screenshots/
| Endpoint | What it does |
|---|---|
| POST /apis/screenshots/ | Request a screenshot; 200 if cached, 202 while capturing. Body takes the same options as the path form: url, size, width, height, aspect_ratio, zoom, delay, wait_until, full_page, color_scheme, transparent |
| GET /apis/screenshots/ | List your screenshots (filter by q, status, size) |
| GET /apis/screenshots/{id}/ | Screenshot details, including the image URL |
| GET /apis/screenshots/{id}/status/ | Lightweight status poll |
| POST /apis/screenshots/{id}/regenerate/ | Force a fresh capture |
| POST /apis/render/ | Render supplied HTML to an image |
| GET /apis/domains/ | Domains this organization has claimed |
| POST /apis/domains/ | Claim a domain; check captures_allowed on the result |
| POST /apis/domains/{id}/verify/ | Check the domain for its published token (verification) |
| DELETE /apis/domains/{id}/ | Release a claim |
| GET /apis/organizations/ | Organizations your account belongs to |
| GET /apis/organizations/current/ | Which organization this key is acting as |
| GET /apis/organizations/members/ | Who is in the acting organization |
Download a ready-to-use skill for Claude Code and other agents from the API Keys page. It bundles instructions, a single-file Python client, and a new API key already filled in — unzip it into your agent's skills folder and it works with no setup. Each download mints its own revocable key.
Agents that can fetch a URL can read the instructions directly at /skill.md (also indexed in /llms.txt). It teaches an agent to render an OpenGraph card from HTML, screenshot a page, and verify a domain — you only supply an API key.
Domains, screenshots, and API keys belong to an organization, not to a person — invite teammates on the Organizations page and they see the same data. Inviting and removing people is dashboard-only: an API key can read who it acts as, but never grant somebody access. Each key acts as the organization you created it in. If you belong to several, name another one you're a member of with the X-Organization header:
curl -H "X-API-Key: ti_..." \ -H "X-Organization: acme" \ https://thumb.im/apis/screenshots/
Build a URL interactively and preview the result before you ship it.
Open the Generator