Getting Started
What MakeOG does
MakeOG generates Open Graph images for any public URL. Paste a URL and get a brand-accurate 1200×630 WebP in under 10 seconds — extracted from the page's own colors, fonts, and logo. No templates. No Figma.
Pro and Team plans add API access, letting you automate OG image generation for every page of a site from your own build pipeline or CMS.
Quick start
No account required for the first 10 images per month.
- Go to makeog.com
- Paste any public URL into the input field
- Click Generate and wait ~8 seconds
- Download the WebP and add it to your <head>
For API access, sign up for a Pro or Team plan, then generate an API key from your dashboard.
API Reference
Authentication
All API requests must include your API key as a bearer token in the Authorization header.
Authorization: Bearer mog_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxAPI keys are generated from your dashboard. Each key is shown once at creation — store it securely. Keys can be revoked at any time.
Base URL
https://makeog.com/apiPOST /generate-og
Generates an Open Graph image for the given URL. If an og:image already exists on the page, returns its URL instead (unless force is true).
Request body
Example request
curl -X POST https://makeog.com/api/generate-og \
-H "Authorization: Bearer mog_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/blog/my-post",
"force": false,
"format": "og"
}'Response — existing og:image found
When the page already has an og:image and force is not set, the response has status: "existing".
{
"status": "existing",
"ogImageUrl": "https://example.com/og-image.png"
}Response — image generated
When a new image is generated, the response includes the base64-encoded WebP along with metadata.
{
"status": "generated",
"imageBase64": "/9j/4AAQSkZJRgABAQAA...",
"mimeType": "image/webp",
"svgSource": "<svg xmlns=\"http://www.w3.org/2000/svg\" ...",
"summary": "Stripe — payments infrastructure for the internet",
"altText": "Stripe open graph image: blue background with Stripe wordmark",
"dimensions": {
"width": 1200,
"height": 630
}
}Error responses
| Status | When |
|---|---|
| 400 | Missing or invalid url field |
| 401 | Missing or invalid API key |
| 422 | URL points to a file (PDF, PNG, etc.) rather than an HTML page |
| 429 | Rate limit exceeded for your plan |
| 500 | Generation failed — the page may be inaccessible or return no content |
Rate limits
Generation limits reset on the first day of each calendar month. Limits apply per user account (authenticated requests) or per IP address (anonymous requests).
| Plan | Generations / month | API access |
|---|---|---|
| Anonymous (no account) | 10 | No |
| Free | 10 | No |
| Pro — $19/mo | 500 | Yes |
| Team — $49/mo | 2,000 | Yes |
When you exceed your limit, the API returns a 429 Too Many Requests response with a JSON body: {"error": "Monthly generation limit reached. Upgrade to continue."}
Output formats
All formats are returned as WebP at quality 85. The format parameter controls the output dimensions.
| Format value | Dimensions | Recommended use |
|---|---|---|
| og | 1200 × 630 | Default. Works on all platforms. Use this unless you have a specific need. |
| 1200 × 628 | Twitter / X large card (twitter:card: summary_large_image) | |
| 1200 × 627 | LinkedIn article and post shares | |
| 1200 × 630 | Facebook link previews (same as OG) |
The response always includes the actual dimensions used in dimensions.width and dimensions.height so you can confirm what was generated.