Platemark

Docs

The API lives at https://platemark.rowhousesoftware.com/v1. It takes JSON and returns PNGs. All you need is a key.

Quick start

# 1. Get a key (or use the form on the home page)
curl https://platemark.rowhousesoftware.com/v1/accounts -H "Content-Type: application/json" -d '{"email": "you@company.com"}'

# 2. Make an image
curl https://platemark.rowhousesoftware.com/v1/images \
  -H "Authorization: Bearer pm_..." -H "Content-Type: application/json" \
  -d '{"template": "quote-card-square", "modifications": {"quote": "Done beats perfect.", "author": "Sam Lee"}}' \
  > quote.png

Keys

POST /v1/accounts with {"email": "..."} makes an account and returns its first key. The key is shown once. Send it on every call as Authorization: Bearer pm_....

GET /v1/account tells you your plan and how many credits are left.

Make an image

POST /v1/images

templateA template id, like og-image.
modificationsAn object keyed by slot name. Leave out a slot to keep its sample.
responseOptional. "json" returns {"data_url": "data:image/png;base64,...", "credits_left": 99} instead of the raw PNG. Handy in n8n and Make.

The raw response is image/png, with an x-credits-left header.

JavaScript

const res = await fetch("https://platemark.rowhousesoftware.com/v1/images", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.PLATEMARK_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ template: "product-card-square", modifications: { name: "Linen apron", price: "$34", photo: imageUrl } }),
});
const png = Buffer.from(await res.arrayBuffer());

Python

import os, requests
r = requests.post("https://platemark.rowhousesoftware.com/v1/images",
    headers={"Authorization": f"Bearer {os.environ['PLATEMARK_KEY']}"},
    json={"template": "og-image", "modifications": {"title": "Our 2026 pricing, explained"}})
open("og.png", "wb").write(r.content)

Filling slots

A slot takes a plain string, or an object when you want more:

"modifications": {
  "title": "Plain text",
  "photo": "https://example.com/photo.jpg",
  "badge": { "text": "Sold", "bg": "#15803d" },
  "headline": { "text": "Big news", "color": "#fde68a" },
  "background": { "color": "#0f172a" }
}
  • Text shrinks to fit its box and wraps on its own. Line breaks you send are kept.
  • Images must be https PNG, JPG or GIF under 4 MB. They fill their box and crop from the center.
  • An empty pill slot ("") disappears instead of leaving a blank shape.

AI agents (MCP)

Platemark is an MCP server at https://platemark.rowhousesoftware.com/mcp. Add it to Claude, Cursor or any MCP client as a remote (HTTP) server, with your key as a header:

{
  "mcpServers": {
    "platemark": {
      "type": "http",
      "url": "https://platemark.rowhousesoftware.com/mcp",
      "headers": { "Authorization": "Bearer pm_..." }
    }
  }
}

The tools are list_templates, render_image, account_status and create_account. An agent without a key can call create_account to get one, then you add it to the config.

Signed URLs for link previews

For an og:image tag you want a plain URL, not a POST. Sign the query with your signing secret and any crawler can load it. The first load renders and costs a credit. After that it's served from cache, free.

import crypto from "crypto";
const account = "acct_...";                           // "account" from GET /v1/account
const secret = process.env.PLATEMARK_SIGNING_SECRET;  // "signing_secret" from the same call
const params = new URLSearchParams({ a: account, title: "How we closed the books in 2 days" });
params.sort();
const s = crypto.createHmac("sha256", secret).update(`og-image?${params}`).digest("hex").slice(0, 32);
const url = `https://platemark.rowhousesoftware.com/v1/images/og-image.png?${params}&s=${s}`;

Keep the signing secret on your server. Anyone with it can spend your credits.

Errors

Errors come back as {"error": {"code": "...", "message": "..."}}. A failed render is never charged.

401 bad_keyMissing or wrong key.
402 no_creditsOut of credits for this month.
400 unknown_layerA slot name that isn't in this template. The message lists the real ones.
400 bad_imageAn image URL that isn't an https PNG, JPG or GIF.
404 no_templateNo template with that id.

Limits

  • Free images carry a small "Made with Platemark" mark in the corner.
  • Five new accounts per network per day.
  • We don't store the images you send or the PNGs we make. Photo links sit in a cache for up to an hour, and signed URLs stay cached so crawlers don't cost you credits.

Templates

Announcement, story: announcement-story

1080x1920. Sample

SlotTypeSample
photoimage URLa photo
kickertextStarting Monday
headlinetextWe're open until 9 on weeknights
footertext1120 Thames St

Just listed (real estate): just-listed-square

1080x1080. Sample

SlotTypeSample
photoimage URLa photo
statustext (pill)Just listed
pricetext$489,000
addresstext2214 Fleet Street, Baltimore
detailstext3 beds · 2 baths · 1,640 sq ft

Just listed, story: just-listed-story

1080x1920. Sample

SlotTypeSample
photoimage URLa photo
statustext (pill)Just listed
pricetext$489,000
addresstext2214 Fleet Street, Baltimore
detailstext3 beds · 2 baths · 1,640 sq ft
agenttextDana Reyes, Harbor Homes

Link preview (OG image): og-image

1200x630. Sample

SlotTypeSample
sitetextledgerline.com/blog
titletextHow we closed the books in two days instead of nine
subtitletextThree changes to month end that anyone can copy.

Link preview with photo: og-image-photo

1200x630. Sample

SlotTypeSample
photoimage URLa photo
sitetextledgerline.com
titletextThe month end checklist we actually use
subtitletextWith the template, free.

Product card: product-card-square

1080x1080. Sample

SlotTypeSample
photoimage URLa photo
badgetext (pill)New
nametextStoneware pour-over set
detailtextDripper, mug and 40 filters
pricetext$48

Quote card: quote-card-square

1080x1080. Sample

SlotTypeSample
accenttext
quotetextShip the boring version first. Then make it better every week.
authortextJane Okafor
roletextFounder, Ledgerline

Quote card, story: quote-card-story

1080x1920. Sample

SlotTypeSample
quotetextShip the boring version first. Then make it better every week.
authortextJane Okafor
roletextFounder, Ledgerline

Sale announcement: sale-banner-square

1080x1080. Sample

SlotTypeSample
kickertextThis weekend only
offertext30% off everything
detailtextEnds Sunday at midnight. Free shipping over $50.
codetext (pill)Code WEEKEND30

Social post over a photo: social-post-square

1080x1080. Sample

SlotTypeSample
photoimage URLa photo
kickertextOpen Saturdays
headlinetextPastries out of the oven at 7, gone by 10

Social post, portrait: social-post-portrait

1080x1350. Sample

SlotTypeSample
photoimage URLa photo
kickertextThis week
headlinetextPastries out of the oven at 7, gone by 10
footertext@corner.bakehouse

Video thumbnail: video-thumbnail

1280x720. Sample

SlotTypeSample
photoimage URLa photo
headlinetextI closed the books in 2 days
tagtext (pill)Month end