Rendex
Use Case

Dynamic OG Images from a URL You Paste Into <meta>

Call /v1/render/link, get back a signed URL, and drop it into <meta og:image> or an <img> tag. Rendex renders the card the first time it's fetched, caches the bytes on the edge, and serves every repeat crawl from cache — no image hosting, no storage bucket, no re-render bill.

The Problem

Dynamic social cards normally mean rendering an image, uploading it to S3 or R2, wiring a CDN, and tracking when to invalidate — all before a single crawler sees it. For a no-code stack or a static site, standing up that storage-and-hosting pipeline just to power <meta og:image> is far more infrastructure than the feature is worth.

The Solution

Rendex hosts the render for you. POST your capture params — a URL, raw HTML, or Markdown with {{data}} templating — to /v1/render/link and get back a self-contained signed URL plus its expiry. Paste it into <meta og:image>: the first crawl renders and caches it in Rendex's R2 under a deterministic key, so identical requests serve straight from cache and don't re-charge you. Prefer the binary endpoint? Set hosted: true on /v1/screenshot to get {url, expiresAt} back instead of raw bytes.

See it in action

A render-link request with a title and tag on the left, and the cached Rendex-rendered Open Graph social card it produces on the right.

Get Started in Minutes

render-link.sh
curl -s -X POST https://api.rendex.dev/v1/render/link \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "html": "<h1>{{title}}</h1>",
    "data": { "title": "Launch day" },
    "format": "png", "width": 1200, "height": 630
  }'
# => { "url": "https://api.rendex.dev/v1/render?p=...&sig=...", "expiresAt": "..." }
render-link.js
import Rendex from "@copperline/rendex";

const rendex = new Rendex("YOUR_API_KEY");

// Mint one signed URL per page — render it from a URL, HTML, or Markdown.
const { url, expiresAt } = await rendex.renderLink({
  url: "https://example.com/product/42",
  format: "png",
  width: 1200,
  height: 630,
});

// In your page <head>:
//   <meta property="og:image" content={url} />
console.log(url, expiresAt);
render_link.py
from rendex import Rendex

rendex = Rendex("YOUR_API_KEY")

# Render once, host on the edge, embed the signed URL anywhere.
link = rendex.render_link(
    url="https://example.com/product/42",
    format="png",
    width=1200,
    height=630,
)

# Drop link["url"] into <meta property="og:image" content="...">
print(link["url"], link["expiresAt"])

100 free API calls/month — no credit card required. Get your API key and start building.

Built for This Use Case

A URL You Can Paste Into <meta>

/v1/render/link returns a self-contained signed URL. No SDK required at render time — any crawler, CMS, or email client just fetches it like a normal image.

Renders on First Hit

The card is rendered the first time the signed URL is fetched, then served as a static asset. Your app never has to call the API on the request path.

Edge-Cached, No Re-Charge

Identical params map to a deterministic R2 cache key, so repeat crawls serve cached bytes and don't count against your quota — only the first render bills.

HTML, Markdown & Templating

Render from a live URL or build the card yourself with raw HTML or Markdown plus {{data}} templating — perfect for per-post, per-product, or per-user cards.

Set Your Own TTL

Control how long the signed URL stays valid with expiresIn, and how long the asset is cached with cacheTtl — from an hour to 30 days.

Zero Backend Required

No bucket to provision, no CDN to wire, no invalidation to manage. Available on every plan, including Free — ideal for static sites and no-code stacks.

Start Free, Scale as You Grow

100 calls/month free. Starter at $69/mo for 10K calls (or $58/mo billed annually — 2 months free). Pro at $179/mo for 100K calls.

Frequently Asked Questions

Related Resources