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
template | A template id, like og-image. |
modifications | An object keyed by slot name. Leave out a slot to keep its sample. |
response | Optional. "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_key | Missing or wrong key. |
402 no_credits | Out of credits for this month. |
400 unknown_layer | A slot name that isn't in this template. The message lists the real ones. |
400 bad_image | An image URL that isn't an https PNG, JPG or GIF. |
404 no_template | No 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
| Slot | Type | Sample |
|---|---|---|
photo | image URL | a photo |
kicker | text | Starting Monday |
headline | text | We're open until 9 on weeknights |
footer | text | 1120 Thames St |
Just listed (real estate): just-listed-square
1080x1080. Sample
| Slot | Type | Sample |
|---|---|---|
photo | image URL | a photo |
status | text (pill) | Just listed |
price | text | $489,000 |
address | text | 2214 Fleet Street, Baltimore |
details | text | 3 beds · 2 baths · 1,640 sq ft |
Just listed, story: just-listed-story
1080x1920. Sample
| Slot | Type | Sample |
|---|---|---|
photo | image URL | a photo |
status | text (pill) | Just listed |
price | text | $489,000 |
address | text | 2214 Fleet Street, Baltimore |
details | text | 3 beds · 2 baths · 1,640 sq ft |
agent | text | Dana Reyes, Harbor Homes |
Link preview (OG image): og-image
1200x630. Sample
| Slot | Type | Sample |
|---|---|---|
site | text | ledgerline.com/blog |
title | text | How we closed the books in two days instead of nine |
subtitle | text | Three changes to month end that anyone can copy. |
Link preview with photo: og-image-photo
1200x630. Sample
| Slot | Type | Sample |
|---|---|---|
photo | image URL | a photo |
site | text | ledgerline.com |
title | text | The month end checklist we actually use |
subtitle | text | With the template, free. |
Product card: product-card-square
1080x1080. Sample
| Slot | Type | Sample |
|---|---|---|
photo | image URL | a photo |
badge | text (pill) | New |
name | text | Stoneware pour-over set |
detail | text | Dripper, mug and 40 filters |
price | text | $48 |
Quote card: quote-card-square
1080x1080. Sample
| Slot | Type | Sample |
|---|---|---|
accent | text | |
quote | text | Ship the boring version first. Then make it better every week. |
author | text | Jane Okafor |
role | text | Founder, Ledgerline |
Quote card, story: quote-card-story
1080x1920. Sample
| Slot | Type | Sample |
|---|---|---|
quote | text | Ship the boring version first. Then make it better every week. |
author | text | Jane Okafor |
role | text | Founder, Ledgerline |
Sale announcement: sale-banner-square
1080x1080. Sample
| Slot | Type | Sample |
|---|---|---|
kicker | text | This weekend only |
offer | text | 30% off everything |
detail | text | Ends Sunday at midnight. Free shipping over $50. |
code | text (pill) | Code WEEKEND30 |
Social post over a photo: social-post-square
1080x1080. Sample
| Slot | Type | Sample |
|---|---|---|
photo | image URL | a photo |
kicker | text | Open Saturdays |
headline | text | Pastries out of the oven at 7, gone by 10 |
Social post, portrait: social-post-portrait
1080x1350. Sample
| Slot | Type | Sample |
|---|---|---|
photo | image URL | a photo |
kicker | text | This week |
headline | text | Pastries out of the oven at 7, gone by 10 |
footer | text | @corner.bakehouse |
Video thumbnail: video-thumbnail
1280x720. Sample
| Slot | Type | Sample |
|---|---|---|
photo | image URL | a photo |
headline | text | I closed the books in 2 days |
tag | text (pill) | Month end |