API reference
Stateless. No account, no uploads, no upstream fetches. title is required. Other fields fall back to template=card, theme=ink, size=og.
Endpoints
| Method | Path | Returns |
| GET | /api/health | Service status JSON |
| GET | /api/templates | Templates, themes, sizes, limits |
| GET | /api/openapi.json | OpenAPI 3.1 document |
| POST | /api/render | JSON with png_base64 or svg |
| GET | /api/og.png | image/png |
| GET | /api/og.svg | image/svg+xml |
Fields
| Field | Limit | Notes |
title | 140 | Required. Newlines start a new line. |
subtitle | 200 | Caption, attribution, or stat label. |
eyebrow | 48 | Shown in uppercase. Ticket stub stays “ADMIT ONE”. |
footer | 80 | Small line at the bottom. Optional. |
template | | card, split, quote, stat, ticket |
theme | | ink, paper, signal, dawn |
size | | og 1200×630, square 1200×1200, story 1080×1920 |
format | | POST only: png (default) or svg |
Templates
- card
- Full-bleed title card with an eyebrow, subtitle, and footer.
- split
- Accent panel on the left, title on the right.
- quote
- Large quotation with an attribution line.
- stat
- One big figure and a short caption.
- ticket
- Perforated pass with a stub and a serial number.
Examples
curl -fsSL -o card.png \
'https://og-image-gen.over9000.cc/api/og.png?template=card&theme=ink&title=Generate%20the%20card%20before%20the%20post.'
curl -s https://og-image-gen.over9000.cc/api/render \
-H 'content-type: application/json' \
-d '{"template":"quote","theme":"paper","title":"Ship the door.","subtitle":"over9000"}'
Errors
| Status | Code | When |
| 400 | invalid_request | Missing title, bad enum, or a field over its limit |
| 400 | invalid_json | POST body is not JSON |
| 404 | not_found | Unknown /api path |
| 405 | method_not_allowed | Wrong verb for the path |
| 413 | payload_too_large | JSON body over 32KB |
| 415 | unsupported_media_type | POST without application/json |
| 500 | render_failed | The card could not be drawn |
The typeface on the card is Card Sans, a static Latin subset of IBM Plex Sans, renamed under the SIL Open Font License. The font covers Latin-1 and common punctuation. Characters outside that set may show as a missing-glyph box.