ogmake
Menu

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 and open the dashboard. Click New key, choose Public key, select which templates the key may render, then Create 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. If the key uses auto mode (/p/YOUR_KEY/auto), set Allowed sites in the key's Settings to protect your renders.

Hugo

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

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

Jekyll (GitHub Pages)

In _layouts/default.html:

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

One tag for every page: /auto

Don't want to pass a title and description per page? Point the key at the page itself: GET /p/{keyId}/auto?url=<page url>. ogmake reads the page's title, description and site name and renders your key's default template (its first allowed template, or one you pick with &template=). Put one tag in your layout and every page gets its own card:

<meta property="og:image" content="https://ogmake.com/p/YOUR_KEY/auto?url={{page.url}}">

Replace {{page.url}} with your generator's absolute, URL-encoded page address:

<!-- Hugo -->
<meta property="og:image" content="https://ogmake.com/p/{your-public-key}/auto?url={{ .Permalink | urlquery }}">

<!-- Jekyll -->
<meta property="og:image" content="https://ogmake.com/p/{your-public-key}/auto?url={{ page.url | absolute_url | url_encode }}">

<!-- Ghost (default.hbs) -->
<meta property="og:image" content="https://ogmake.com/p/{your-public-key}/auto?url={{url absolute="true"}}">

Webflow: in a page's Open Graph settings, paste https://ogmake.com/p/{your-public-key}/auto?url=https://yoursite.com/that-page as the image URL.

Set your site under the key's allowed domains in the dashboard: an auto URL only works for pages on those domains, so nobody else can spend your renders, and social crawlers (which send no Referer) can fetch the image. A key with no allowed domains only answers requests whose Referer is the page itself. Pages with no title get a card from your site name; a repeat request for the same page is served from cache and costs nothing.

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 render budget (one fifth of your monthly cap) limits how fast a copied or replayed URL can run up renders, but a public URL can still use your whole monthly cap over time; 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.