Introduction
SnapForge is a 6-in-1 developer API for generating OG images, PDFs, QR codes, URL metadata, image resizing, and placeholder images. It was designed with one principle: make common web development tasks trivially easy.
What makes SnapForge different:
- URL Mode — paste a URL in your HTML. No API key, no code, no signup. Just works.
- API Mode — full REST API with every option. One key, six tools.
- 10+ OG templates and 10+ PDF templates — professionally designed, ready to use.
- Fast — QR codes in <50ms, images in <300ms, OG/PDF in <2s.
Quick start
Option A: Start in 10 seconds (URL Mode)
Paste this into any HTML page. No signup required:
<img src="https://usesnapforge.com/qr?text=https://example.com" alt="QR Code" />That's it. A QR code will render wherever you place the tag. Works with OG images too:
<img src="https://usesnapforge.com/og/blog?title=My+First+Post&theme=dark" />Option B: Start in 2 minutes (API Mode)
1. Create a free account at usesnapforge.com/register
2. Copy your API key from the dashboard (starts with sk_live_)
3. Make your first API call:
curl -X POST https://usesnapforge.com/api/v1/og \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"template":"blog","data":{"title":"Hello World"}}'const res = await fetch("https://usesnapforge.com/api/v1/og", {
method: "POST",
headers: {
"Authorization": "Bearer sk_live_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
template: "blog",
data: { title: "Hello World" }
}),
});
const imageBlob = await res.blob();Authentication
API mode requires authentication via an API key. URL mode does not require authentication.
Getting your API key
Register at /register, then find your key in the dashboard. Keys start with sk_live_.
Using your API key
Pass it in the Authorization header:
Authorization: Bearer sk_live_YOUR_KEYOG Images
Generate beautiful Open Graph images for social media sharing. Choose from 10 professionally designed templates.
/og/:template— URL mode — no auth, watermark on free/api/v1/og— API mode — auth required, no watermark on paidURL Mode
<meta property="og:image" content="https://usesnapforge.com/og/blog?title=My+Post&theme=dark" />API Mode
curl -X POST https://usesnapforge.com/api/v1/og \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"template":"blog","data":{"title":"My Post","theme":"dark"}}'const res = await fetch("https://usesnapforge.com/api/v1/og", {
method: "POST",
headers: {
Authorization: "Bearer sk_live_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
template: "blog",
data: { title: "My Post", author: "Jane", theme: "dark" }
}),
});import requests
r = requests.post("https://usesnapforge.com/api/v1/og",
headers={"Authorization": "Bearer sk_live_YOUR_KEY"},
json={"template": "blog", "data": {"title": "My Post"}})
with open("og.png", "wb") as f:
f.write(r.content)Available templates
All templates render at 1200x630px (standard OG size) and support light and dark themes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| template | string | Yes | — | Template name: blog, social, product, event, article, github, minimal, gradient, stats, announcement |
| title | string | Yes | — | Main title text (max 200 chars) |
| theme | string | No | light | "light" or "dark" |
| accent_color | string | No | #8B5CF6 | Hex accent color |
| subtitle | string | No | — | Secondary text (social, gradient, announcement) |
| author | string | No | — | Author name (blog) |
| date | string | No | — | Date string (blog, event) |
PDF Generation
Generate pixel-perfect PDFs from HTML or pre-built templates. Invoices, reports, certificates, and more.
/api/v1/pdf— Auth requiredFrom a template
const res = await fetch("https://usesnapforge.com/api/v1/pdf", {
method: "POST",
headers: {
Authorization: "Bearer sk_live_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
template: "invoice",
data: {
company: { name: "Acme", address: "123 St", email: "a@b.com", phone: "555" },
client: { name: "Client Co", address: "456 Ave", email: "c@d.com" },
invoice_number: "INV-001",
issue_date: "2026-01-15",
due_date: "2026-02-15",
items: [{ description: "Design work", quantity: 10, unit_price: 150 }],
tax_rate: 20,
currency: "USD",
},
}),
});From raw HTML
curl -X POST https://usesnapforge.com/api/v1/pdf \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"html":"<h1>Hello World</h1><p>This is my PDF.</p>"}'Available templates
invoice, receipt, report, letter, certificate (landscape), contract, proposal, resume, meeting-notes, packing-slip
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| html | string | No | — | Raw HTML content (use this OR template) |
| template | string | No | — | Template name |
| data | object | No | — | Data for template rendering |
| format | string | No | A4 | A4, Letter, A3, A5, Legal |
| landscape | boolean | No | false | Landscape orientation |
| margin | object | No | — | { top, right, bottom, left } in mm e.g. "20mm" |
QR Codes
Generate QR codes with custom colors, sizes, and formats.
/qr— URL mode/api/v1/qr— API modeURL Mode
<img src="https://usesnapforge.com/qr?text=https://example.com&size=300&fg=8B5CF6&bg=ffffff" />API Mode
curl -X POST https://usesnapforge.com/api/v1/qr \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"https://example.com","size":300,"format":"svg"}'import requests
r = requests.post("https://usesnapforge.com/api/v1/qr",
headers={"Authorization": "Bearer sk_live_YOUR_KEY"},
json={"text": "https://example.com", "size": 300, "fg": "8B5CF6"})
with open("qr.png", "wb") as f:
f.write(r.content)req, _ := http.NewRequest("POST", "https://usesnapforge.com/api/v1/qr",
strings.NewReader(`{"text":"https://example.com","size":300}`))
req.Header.Set("Authorization", "Bearer sk_live_YOUR_KEY")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| text | string | Yes | — | Text or URL to encode (max 4000 chars) |
| size | number | No | 300 | Image size in pixels (50-2000) |
| fg | string | No | 000000 | Foreground color (6-digit hex) |
| bg | string | No | ffffff | Background color (6-digit hex) |
| format | string | No | png | "png" or "svg" |
| errorCorrection | string | No | M | "L", "M", "Q", or "H" |
URL Metadata
Extract title, description, image, favicon, and more from any URL.
/meta?url=...— URL mode/api/v1/metadata?url=...— API modecurl "https://usesnapforge.com/meta?url=https://github.com"Response format
{
"success": true,
"data": {
"title": "GitHub",
"description": "Let's build from here",
"image": "https://github.githubassets.com/images/...",
"favicon": "https://github.com/favicon.ico",
"siteName": "GitHub",
"type": "website",
"locale": "en_US",
"url": "https://github.com",
"author": null,
"published": null
}
}| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| url | string | Yes | — | URL to extract metadata from (must be http/https) |
Limitations: 5-second timeout, max 5 redirects. file://, localhost, and private IPs are blocked for security.
Image Resize
Resize, convert, and optimize images on the fly.
/resize?url=...&w=400— URL mode/api/v1/resize— API mode<img src="https://usesnapforge.com/resize?url=https://example.com/photo.jpg&w=400&h=300&format=webp" />| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| url | string | Yes | — | Source image URL |
| w / width | number | No | — | Target width (1-5000) |
| h / height | number | No | — | Target height (1-5000) |
| format | string | No | png | jpeg, png, webp, avif |
| quality | number | No | 80 | Output quality (1-100) |
| fit | string | No | cover | cover, contain, fill, inside, outside |
| grayscale | boolean | No | false | Convert to grayscale |
| blur | number | No | 0 | Blur amount (0-100) |
Placeholders
Generate placeholder images via URL. No auth, no rate limit (SVG is cheap).
/placeholder/:WxH/:bgColor?/:textColor?— URL mode only<img src="https://usesnapforge.com/placeholder/600x400" />
<img src="https://usesnapforge.com/placeholder/800x600/8B5CF6/ffffff?text=Banner" />
<img src="https://usesnapforge.com/placeholder/1200x630/0F172A/F8FAFC?text=OG+Image&font=serif" />| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| dimensions | string | Yes | — | Format: "WIDTHxHEIGHT" e.g. "600x400" |
| bgColor | string | No | cccccc | Background hex color |
| textColor | string | No | 666666 | Text hex color |
| text | string | No | — | Custom text (default: "WxH") |
| font | string | No | sans-serif | "sans-serif" or "serif" |
URL Mode vs API Mode
| URL Mode | API Mode | |
|---|---|---|
| Authentication | Not required | API key required |
| Signup | Not required | Free account needed |
| Watermark | Yes (on free) | No (on paid plans) |
| Features | OG, QR, Meta, Resize, Placeholder | All 6 features + PDF |
| Parameters | Query string | JSON body (full control) |
| Best for | Static sites, no-code, prototypes | Web apps, SaaS, automation |
| Rate limit | 100/day per IP | Based on plan (1K-500K/month) |
Error handling
All errors return a consistent JSON format:
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters",
"details": [{ "path": "title", "message": "Required" }]
}
}HTTP status codes
| Code | Meaning | When |
|---|---|---|
| 400 | Bad Request | Invalid parameters, missing required fields |
| 401 | Unauthorized | Missing or invalid API key / JWT |
| 403 | Forbidden | Access denied to resource |
| 404 | Not Found | Template or route not found |
| 429 | Too Many Requests | Rate limit or plan limit exceeded |
| 500 | Internal Error | Server error (never includes stack traces) |
| 503 | Service Unavailable | Server busy (Puppeteer queue full) |
Rate limits
| Plan | Monthly limit | Per-minute burst |
|---|---|---|
| Free | 1,000 requests | 30 req/min |
| Starter | 20,000 requests | 120 req/min |
| Pro | 100,000 requests | 300 req/min |
| Business | 500,000 requests | 600 req/min |
URL mode (no auth): 100 requests per day per IP address.
When you exceed your limit, the API returns 429 Too Many Requests with a Retry-After header. Your limit resets on the 1st of each month.
Need help? Email support@usesnapforge.com