ogmake

Public URLs

GET /i/{keyId}/{sig} (see Signing) needs your app to compute an HMAC over the request. Some sites have no server or build step that can do that — a Hugo or Jekyll site built on GitHub Pages, a Ghost theme, a Webflow page. For those, mint a public key in the dashboard instead: it accepts unsigned requests, but only for the templates you explicitly allow.

The URL shape

GET https://ogmake.com/p/{keyId}/{template}?title=...&description=...

{keyId} is the public key's id (starts with k_), {template} is one of the key's allow-listed templates (e.g. blog), and every other query param is that template's own field — same params as the signed route, just no sig. A request for a template outside the key's allow-list, or against a key that isn't marked public, is refused — like every other refusal on this route (see below), that's a 200 fallback image, never an error status.

Create a public key

Sign in at /login, open the dashboard, and under "API keys" check which templates the new key may render, then "Create public key". The key id (not the bearer secret) is what goes in the URL — it is safe to commit into a public site's source.

Hugo

In a page or partial template, e.g. layouts/partials/opengraph.html:

<meta property="og:image" content="https://ogmake.com/p/k_yourkeyid/basic?title={{ .Title | urlquery }}&description={{ .Summary | urlquery }}" />

Jekyll (GitHub Pages)

In _layouts/default.html:

<meta property="og:image" content="https://ogmake.com/p/k_yourkeyid/basic?title={{ page.title | url_encode }}&description={{ page.excerpt | strip_html | url_encode }}" />

Behaves like a normal render, minus the signature

Anyone who copies this URL can spend your quota — it's unsigned on purpose. A per-account daily and monthly render budget (separate from, and smaller than, your monthly cap) limits how fast a copied or replayed URL can run up renders; revoke the key's public access from the dashboard at any time without touching its signed use.

Debugging a public URL that isn't working

Every refusal on this route is still a 200 image — a wrong template, a mistyped key id, a missing required field, or a render your account can't currently afford all look identical in the browser or the crawler's preview. Check the response headers instead (e.g. curl -I the URL): a failed request carries an x-ogmake-error header set to one of:

A successful render never carries x-ogmake-error at all.