Image APIs
API REFERENCE · v0.1.0 · 16 OPERATIONS

Image APIs

Render social cards, Open Graph images, banners, certificates and PDFs from JSON layer templates or your own HTML; screenshot public pages; build signed URLs that render on first fetch. Every render returns a hosted URL. Costs are in images: one per image or screenshot, one per PDF page; template and record reads are free. Plan ceilings are reported on every response in the X-Gw-* headers (X-Gw-Remaining, X-Gw-Reset), so clients and agents can pace themselves.

GETTING STARTED
Every request goes to https://api.imageapis.com/ with your key in the X-API-Key header. What's left of your allowance rides back on every response in X-Gw-Remaining.
Get a key → · Sign in →
curl "https://api.imageapis.com/v1/templates" \
  -H "X-API-Key: YOUR_KEY"
FROM AN AI AGENT
This API is also an MCP server. Add https://mcp.imageapis.com/ to Claude Code, Cursor or any MCP client with your key as a bearer token and every operation below becomes a tool — same key, same metering, same allowance. In a connector that only takes a URL, use the connector URL instead. Prompting a model by hand? Every operation has a Markdown version.
claude mcp add --transport http imageapis https://mcp.imageapis.com/ \
  --header "Authorization: Bearer YOUR_KEY"
ERRORS
Every operation can also answer with this, so it is listed once here rather than on each card.
400A parameter is missing, malformed or out of range
{
  "error": "string",
  "message": "string",
  "param": "string"
}

Images

POST/v1/images

Render an image from a template, an inline template or HTML

One request, one image. Pass a stored template's id with modifications and variables, an inline template object, or raw html. The response carries a hosted url (30 days on Free, a year on paid plans). Set response to binary to get the file itself, or webhook_url to render in the background.

REQUEST BODY · APPLICATION/JSON · REQUIRED
{
  "template": "tpl_4nq8vzk2hdyw7bxme3rc",
  "modifications": [
    {
      "name": "title",
      "text": "Launch week starts Monday"
    },
    {
      "name": "photo",
      "src": "https://example.com/hero.jpg"
    }
  ],
  "format": "png",
  "scale": 2
}
Open on its own page
REQUEST
curl -X POST "https://api.imageapis.com/v1/images" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "template": "tpl_4nq8vzk2hdyw7bxme3rc",
  "modifications": [
    {
      "name": "title",
      "text": "Launch week starts Monday"
    },
    {
      "name": "photo",
      "src": "https://example.com/hero.jpg"
    }
  ],
  "format": "png",
  "scale": 2
}'
RESPONSE
200With response=binary: the file itself, with X-Image-Id and X-Image-Url headers
201Created
{
  "id": "img_7hk2mq9ztbw4e6nrcxpd",
  "object": "image",
  "status": "completed",
  "url": "https://img.imageapis.com/i/img_7hk2mq9ztbw4e6nrcxpd.png",
  "format": "png",
  "width": 1200,
  "height": 630,
  "scale": 1,
  "template": "tpl_4nq8vzk2hdyw7bxme3rc",
  "bytes": 48213,
  "units": 1,
  "created": "2026-10-10T18:04:11Z",
  "completed": "2026-10-10T18:04:12Z",
  "expires": "2026-11-09T18:04:11Z"
}
202Accepted: rendering in the background; the record has status pending and the webhook gets the finished one
{
  "id": "img_7hk2mq9ztbw4e6nrcxpd",
  "object": "image",
  "status": "completed",
  "url": "https://img.imageapis.com/i/img_7hk2mq9ztbw4e6nrcxpd.png",
  "format": "png",
  "width": 1200,
  "height": 630,
  "scale": 1,
  "template": "tpl_4nq8vzk2hdyw7bxme3rc",
  "bytes": 48213,
  "units": 1,
  "created": "2026-10-10T18:04:11Z",
  "completed": "2026-10-10T18:04:12Z",
  "expires": "2026-11-09T18:04:11Z"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

GET/v1/images/{id}

Fetch an image's record: status, url, size

PARAMETERS
idpath · stringREQUIRED
The image id
e.g. img_7hk2mq9ztbw4e6nrcxpd
Open on its own page
REQUEST
curl "https://api.imageapis.com/v1/images/img_7hk2mq9ztbw4e6nrcxpd" \
  -H "X-API-Key: YOUR_KEY"
RESPONSE
200OK
{
  "id": "img_7hk2mq9ztbw4e6nrcxpd",
  "object": "image",
  "status": "completed",
  "url": "https://img.imageapis.com/i/img_7hk2mq9ztbw4e6nrcxpd.png",
  "format": "png",
  "width": 1200,
  "height": 630,
  "scale": 1,
  "template": "tpl_4nq8vzk2hdyw7bxme3rc",
  "bytes": 48213,
  "units": 1,
  "created": "2026-10-10T18:04:11Z",
  "completed": "2026-10-10T18:04:12Z",
  "expires": "2026-11-09T18:04:11Z"
}
401Missing or invalid API key (from the gateway)
404No such template or record on this account
{
  "error": "string",
  "message": "string",
  "param": "string"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

Templates

GET/v1/templates

List this account's templates

Open on its own page
REQUEST
curl "https://api.imageapis.com/v1/templates" \
  -H "X-API-Key: YOUR_KEY"
RESPONSE
200OK
{
  "templates": [
    {
      "id": "tpl_4nq8vzk2hdyw7bxme3rc",
      "object": "template",
      "name": "Blog post card",
      "engine": "layers",
      "width": 1200,
      "height": 630,
      "layers": 3,
      "created": "2026-10-10T17:40:02Z",
      "updated": "2026-10-10T17:40:02Z"
    }
  ]
}
401Missing or invalid API key (from the gateway)
404No such template or record on this account
{
  "error": "string",
  "message": "string",
  "param": "string"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

POST/v1/templates

Save a template: positioned layers, or your own HTML

Layers are rendered bottom to top inside a canvas of width × height. Text layers shrink to fit their box by default. Put {{placeholders}} in text, src, html or css and fill them with variables at render time, or override any layer property by name with modifications. Set engine to html to bring your own HTML and CSS instead of layers.

REQUEST BODY · APPLICATION/JSON · REQUIRED
{
  "name": "Blog post card",
  "width": 1200,
  "height": 630,
  "background": "#0b1220",
  "layers": [
    {
      "name": "title",
      "type": "text",
      "x": 72,
      "y": 160,
      "width": 1056,
      "height": 280,
      "text": "{{title}}",
      "font": "Inter",
      "weight": 800,
      "size": 72,
      "color": "#ffffff",
      "fit": "shrink",
      "max_lines": 3
    },
    {
      "name": "site",
      "type": "text",
      "x": 72,
      "y": 72,
      "width": 600,
      "height": 40,
      "text": "apidirectory.com",
      "font": "Inter",
      "weight": 600,
      "size": 28,
      "color": "#a3b1c6"
    },
    {
      "name": "accent",
      "type": "rect",
      "x": 0,
      "y": 616,
      "width": 1200,
      "height": 14,
      "fill": "#6366f1"
    }
  ]
}
Open on its own page
REQUEST
curl -X POST "https://api.imageapis.com/v1/templates" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Blog post card",
  "width": 1200,
  "height": 630,
  "background": "#0b1220",
  "layers": [
    {
      "name": "title",
      "type": "text",
      "x": 72,
      "y": 160,
      "width": 1056,
      "height": 280,
      "text": "{{title}}",
      "font": "Inter",
      "weight": 800,
      "size": 72,
      "color": "#ffffff",
      "fit": "shrink",
      "max_lines": 3
    },
    {
      "name": "site",
      "type": "text",
      "x": 72,
      "y": 72,
      "width": 600,
      "height": 40,
      "text": "apidirectory.com",
      "font": "Inter",
      "weight": 600,
      "size": 28,
      "color": "#a3b1c6"
    },
    {
      "name": "accent",
      "type": "rect",
      "x": 0,
      "y": 616,
      "width": 1200,
      "height": 14,
      "fill": "#6366f1"
    }
  ]
}'
RESPONSE
201Created
{
  "id": "tpl_4nq8vzk2hdyw7bxme3rc",
  "object": "template",
  "name": "Blog post card",
  "engine": "layers",
  "width": 1200,
  "height": 630,
  "background": "#0b1220",
  "layers": [
    {
      "name": "title",
      "type": "text",
      "x": 72,
      "y": 160,
      "width": 1056,
      "height": 280,
      "text": "{{title}}",
      "font": "Inter",
      "weight": 800,
      "size": 72,
      "color": "#ffffff",
      "fit": "shrink",
      "max_lines": 3
    },
    {
      "name": "site",
      "type": "text",
      "x": 72,
      "y": 72,
      "width": 600,
      "height": 40,
      "text": "apidirectory.com",
      "font": "Inter",
      "weight": 600,
      "size": 28,
      "color": "#a3b1c6"
    },
    {
      "name": "accent",
      "type": "rect",
      "x": 0,
      "y": 616,
      "width": 1200,
      "height": 14,
      "fill": "#6366f1"
    }
  ],
  "created": "2026-10-10T17:40:02Z",
  "updated": "2026-10-10T17:40:02Z"
}
401Missing or invalid API key (from the gateway)
404No such template or record on this account
{
  "error": "string",
  "message": "string",
  "param": "string"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

GET/v1/templates/{id}

One template with all its layers

PARAMETERS
idpath · stringREQUIRED
The template id
e.g. tpl_4nq8vzk2hdyw7bxme3rc
Open on its own page
REQUEST
curl "https://api.imageapis.com/v1/templates/tpl_4nq8vzk2hdyw7bxme3rc" \
  -H "X-API-Key: YOUR_KEY"
RESPONSE
200OK
{
  "id": "tpl_4nq8vzk2hdyw7bxme3rc",
  "object": "template",
  "name": "Blog post card",
  "engine": "layers",
  "width": 1200,
  "height": 630,
  "background": "#0b1220",
  "layers": [
    {
      "name": "title",
      "type": "text",
      "x": 72,
      "y": 160,
      "width": 1056,
      "height": 280,
      "text": "{{title}}",
      "font": "Inter",
      "weight": 800,
      "size": 72,
      "color": "#ffffff",
      "fit": "shrink",
      "max_lines": 3
    },
    {
      "name": "site",
      "type": "text",
      "x": 72,
      "y": 72,
      "width": 600,
      "height": 40,
      "text": "apidirectory.com",
      "font": "Inter",
      "weight": 600,
      "size": 28,
      "color": "#a3b1c6"
    },
    {
      "name": "accent",
      "type": "rect",
      "x": 0,
      "y": 616,
      "width": 1200,
      "height": 14,
      "fill": "#6366f1"
    }
  ],
  "created": "2026-10-10T17:40:02Z",
  "updated": "2026-10-10T17:40:02Z"
}
401Missing or invalid API key (from the gateway)
404No such template or record on this account
{
  "error": "string",
  "message": "string",
  "param": "string"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

PUT/v1/templates/{id}

Replace a template's definition

Send the whole template; what you send is what is kept. Renders already made from it are unaffected; signed URLs pick up the new version.

PARAMETERS
idpath · stringREQUIRED
The template id
e.g. tpl_4nq8vzk2hdyw7bxme3rc
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
  "name": "Blog post card",
  "width": 1200,
  "height": 630,
  "background": "#0b1220",
  "layers": [
    {
      "name": "title",
      "type": "text",
      "x": 72,
      "y": 160,
      "width": 1056,
      "height": 280,
      "text": "{{title}}",
      "font": "Inter",
      "weight": 800,
      "size": 72,
      "color": "#ffffff",
      "fit": "shrink",
      "max_lines": 3
    },
    {
      "name": "site",
      "type": "text",
      "x": 72,
      "y": 72,
      "width": 600,
      "height": 40,
      "text": "apidirectory.com",
      "font": "Inter",
      "weight": 600,
      "size": 28,
      "color": "#a3b1c6"
    },
    {
      "name": "accent",
      "type": "rect",
      "x": 0,
      "y": 616,
      "width": 1200,
      "height": 14,
      "fill": "#6366f1"
    }
  ]
}
Open on its own page
REQUEST
curl -X PUT "https://api.imageapis.com/v1/templates/tpl_4nq8vzk2hdyw7bxme3rc" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Blog post card",
  "width": 1200,
  "height": 630,
  "background": "#0b1220",
  "layers": [
    {
      "name": "title",
      "type": "text",
      "x": 72,
      "y": 160,
      "width": 1056,
      "height": 280,
      "text": "{{title}}",
      "font": "Inter",
      "weight": 800,
      "size": 72,
      "color": "#ffffff",
      "fit": "shrink",
      "max_lines": 3
    },
    {
      "name": "site",
      "type": "text",
      "x": 72,
      "y": 72,
      "width": 600,
      "height": 40,
      "text": "apidirectory.com",
      "font": "Inter",
      "weight": 600,
      "size": 28,
      "color": "#a3b1c6"
    },
    {
      "name": "accent",
      "type": "rect",
      "x": 0,
      "y": 616,
      "width": 1200,
      "height": 14,
      "fill": "#6366f1"
    }
  ]
}'
RESPONSE
200OK
{
  "id": "tpl_4nq8vzk2hdyw7bxme3rc",
  "object": "template",
  "name": "Blog post card",
  "engine": "layers",
  "width": 1200,
  "height": 630,
  "background": "#0b1220",
  "layers": [
    {
      "name": "title",
      "type": "text",
      "x": 72,
      "y": 160,
      "width": 1056,
      "height": 280,
      "text": "{{title}}",
      "font": "Inter",
      "weight": 800,
      "size": 72,
      "color": "#ffffff",
      "fit": "shrink",
      "max_lines": 3
    },
    {
      "name": "site",
      "type": "text",
      "x": 72,
      "y": 72,
      "width": 600,
      "height": 40,
      "text": "apidirectory.com",
      "font": "Inter",
      "weight": 600,
      "size": 28,
      "color": "#a3b1c6"
    },
    {
      "name": "accent",
      "type": "rect",
      "x": 0,
      "y": 616,
      "width": 1200,
      "height": 14,
      "fill": "#6366f1"
    }
  ],
  "created": "2026-10-10T17:40:02Z",
  "updated": "2026-10-10T17:40:02Z"
}
401Missing or invalid API key (from the gateway)
404No such template or record on this account
{
  "error": "string",
  "message": "string",
  "param": "string"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

DELETE/v1/templates/{id}

Delete a template

PARAMETERS
idpath · stringREQUIRED
The template id
e.g. tpl_4nq8vzk2hdyw7bxme3rc
Open on its own page
REQUEST
curl -X DELETE "https://api.imageapis.com/v1/templates/tpl_4nq8vzk2hdyw7bxme3rc" \
  -H "X-API-Key: YOUR_KEY"
RESPONSE
200OK
{
  "id": "tpl_4nq8vzk2hdyw7bxme3rc",
  "object": "template",
  "deleted": true
}
401Missing or invalid API key (from the gateway)
404No such template or record on this account
{
  "error": "string",
  "message": "string",
  "param": "string"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

Og

POST/v1/og

An Open Graph card from a title and a few options, no template needed

A 1200×630 social card in the built-in design: site name and logo, an optional tag, the title (shrinks to fit), a description and an accent bar. For a card that renders on demand from a URL, create a signed base and use the template name og.

REQUEST BODY · APPLICATION/JSON · REQUIRED
{
  "title": "Three data stories from OpenFEC, NHTSA and OpenAlex",
  "description": "What 2.3 million rows say about September",
  "site": "apidirectory.com",
  "tag": "Blog",
  "theme": "dark",
  "accent": "#6366f1"
}
Open on its own page
REQUEST
curl -X POST "https://api.imageapis.com/v1/og" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "title": "Three data stories from OpenFEC, NHTSA and OpenAlex",
  "description": "What 2.3 million rows say about September",
  "site": "apidirectory.com",
  "tag": "Blog",
  "theme": "dark",
  "accent": "#6366f1"
}'
RESPONSE
200With response=binary: the file itself, with X-Image-Id and X-Image-Url headers
201Created
{
  "id": "img_7hk2mq9ztbw4e6nrcxpd",
  "object": "image",
  "status": "completed",
  "url": "https://img.imageapis.com/i/img_7hk2mq9ztbw4e6nrcxpd.png",
  "format": "png",
  "width": 1200,
  "height": 630,
  "scale": 1,
  "template": "og",
  "bytes": 48213,
  "units": 1,
  "created": "2026-10-10T18:04:11Z",
  "completed": "2026-10-10T18:04:12Z",
  "expires": "2026-11-09T18:04:11Z"
}
202Accepted: rendering in the background; the record has status pending and the webhook gets the finished one
{
  "id": "img_7hk2mq9ztbw4e6nrcxpd",
  "object": "image",
  "status": "completed",
  "url": "https://img.imageapis.com/i/img_7hk2mq9ztbw4e6nrcxpd.png",
  "format": "png",
  "width": 1200,
  "height": 630,
  "scale": 1,
  "template": "og",
  "bytes": 48213,
  "units": 1,
  "created": "2026-10-10T18:04:11Z",
  "completed": "2026-10-10T18:04:12Z",
  "expires": "2026-11-09T18:04:11Z"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

Pdfs

POST/v1/pdfs

Make a PDF from a template, HTML or a public URL

Costs one unit per page. A template without format prints at its own pixel size, one page; HTML and URLs paginate at the paper size you pick.

REQUEST BODY · APPLICATION/JSON · REQUIRED
{
  "html": "<h1>Invoice #1042</h1><p>Total due: $420.00</p>",
  "format": "A4",
  "margin": "20mm"
}
Open on its own page
REQUEST
curl -X POST "https://api.imageapis.com/v1/pdfs" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "html": "<h1>Invoice #1042</h1><p>Total due: $420.00</p>",
  "format": "A4",
  "margin": "20mm"
}'
RESPONSE
200With response=binary: the file itself, with X-Image-Id and X-Image-Url headers
201Created
{
  "id": "pdf_2wq9tkz7hvbx4nmc8rde",
  "object": "pdf",
  "status": "completed",
  "url": "https://img.imageapis.com/i/pdf_2wq9tkz7hvbx4nmc8rde.pdf",
  "format": "pdf",
  "pages": 2,
  "bytes": 90412,
  "units": 2,
  "created": "2026-10-10T18:10:40Z",
  "completed": "2026-10-10T18:10:42Z",
  "expires": "2026-11-09T18:10:40Z"
}
202Accepted: rendering in the background; the record has status pending and the webhook gets the finished one
{
  "id": "pdf_2wq9tkz7hvbx4nmc8rde",
  "object": "pdf",
  "status": "completed",
  "url": "https://img.imageapis.com/i/pdf_2wq9tkz7hvbx4nmc8rde.pdf",
  "format": "pdf",
  "pages": 2,
  "bytes": 90412,
  "units": 2,
  "created": "2026-10-10T18:10:40Z",
  "completed": "2026-10-10T18:10:42Z",
  "expires": "2026-11-09T18:10:40Z"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

GET/v1/pdfs/{id}

Fetch a PDF's record

PARAMETERS
idpath · stringREQUIRED
The PDF id
e.g. pdf_2wq9tkz7hvbx4nmc8rde
Open on its own page
REQUEST
curl "https://api.imageapis.com/v1/pdfs/pdf_2wq9tkz7hvbx4nmc8rde" \
  -H "X-API-Key: YOUR_KEY"
RESPONSE
200OK
{
  "id": "pdf_2wq9tkz7hvbx4nmc8rde",
  "object": "pdf",
  "status": "completed",
  "url": "https://img.imageapis.com/i/pdf_2wq9tkz7hvbx4nmc8rde.pdf",
  "format": "pdf",
  "pages": 2,
  "bytes": 90412,
  "units": 2,
  "created": "2026-10-10T18:10:40Z",
  "completed": "2026-10-10T18:10:42Z",
  "expires": "2026-11-09T18:10:40Z"
}
401Missing or invalid API key (from the gateway)
404No such template or record on this account
{
  "error": "string",
  "message": "string",
  "param": "string"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

Screenshots

POST/v1/screenshots

Screenshot a public web page

Loads the page in a real browser and captures the viewport, the full page, or one element. Private and local addresses are refused.

REQUEST BODY · APPLICATION/JSON · REQUIRED
{
  "url": "https://apidirectory.com/",
  "width": 1280,
  "height": 800,
  "full_page": false,
  "hide": [
    ".cookie-banner"
  ]
}
Open on its own page
REQUEST
curl -X POST "https://api.imageapis.com/v1/screenshots" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://apidirectory.com/",
  "width": 1280,
  "height": 800,
  "full_page": false,
  "hide": [
    ".cookie-banner"
  ]
}'
RESPONSE
200With response=binary: the file itself, with X-Image-Id and X-Image-Url headers
201Created
{
  "id": "shot_9pxk3mz7dqwb2hnt4vce",
  "object": "screenshot",
  "status": "completed",
  "url": "https://img.imageapis.com/i/shot_9pxk3mz7dqwb2hnt4vce.png",
  "source_url": "https://apidirectory.com/",
  "final_url": "https://apidirectory.com/",
  "title": "APIDirectory",
  "http_status": 200,
  "format": "png",
  "width": 1280,
  "height": 800,
  "scale": 1,
  "bytes": 212044,
  "units": 1,
  "created": "2026-10-10T18:12:00Z",
  "completed": "2026-10-10T18:12:03Z",
  "expires": "2026-11-09T18:12:00Z"
}
202Accepted: rendering in the background; the record has status pending and the webhook gets the finished one
{
  "id": "shot_9pxk3mz7dqwb2hnt4vce",
  "object": "screenshot",
  "status": "completed",
  "url": "https://img.imageapis.com/i/shot_9pxk3mz7dqwb2hnt4vce.png",
  "source_url": "https://apidirectory.com/",
  "final_url": "https://apidirectory.com/",
  "title": "APIDirectory",
  "http_status": 200,
  "format": "png",
  "width": 1280,
  "height": 800,
  "scale": 1,
  "bytes": 212044,
  "units": 1,
  "created": "2026-10-10T18:12:00Z",
  "completed": "2026-10-10T18:12:03Z",
  "expires": "2026-11-09T18:12:00Z"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

GET/v1/screenshots/{id}

Fetch a screenshot's record

PARAMETERS
idpath · stringREQUIRED
The screenshot id
e.g. shot_9pxk3mz7dqwb2hnt4vce
Open on its own page
REQUEST
curl "https://api.imageapis.com/v1/screenshots/shot_9pxk3mz7dqwb2hnt4vce" \
  -H "X-API-Key: YOUR_KEY"
RESPONSE
200OK
{
  "id": "shot_9pxk3mz7dqwb2hnt4vce",
  "object": "screenshot",
  "status": "completed",
  "url": "https://img.imageapis.com/i/shot_9pxk3mz7dqwb2hnt4vce.png",
  "source_url": "https://apidirectory.com/",
  "final_url": "https://apidirectory.com/",
  "title": "APIDirectory",
  "http_status": 200,
  "format": "png",
  "width": 1280,
  "height": 800,
  "scale": 1,
  "bytes": 212044,
  "units": 1,
  "created": "2026-10-10T18:12:00Z",
  "completed": "2026-10-10T18:12:03Z",
  "expires": "2026-11-09T18:12:00Z"
}
401Missing or invalid API key (from the gateway)
404No such template or record on this account
{
  "error": "string",
  "message": "string",
  "param": "string"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

Signed bases

GET/v1/signed-bases

List this account's signed-URL bases

Open on its own page
REQUEST
curl "https://api.imageapis.com/v1/signed-bases" \
  -H "X-API-Key: YOUR_KEY"
RESPONSE
200OK
{
  "signed_bases": [
    {
      "id": "sb_8mz2kq7xvtnw4hbc3dpe",
      "object": "signed_base",
      "name": "Blog cards",
      "template": null,
      "secret": "sbs_1f2e3d4c5b6a79880011223344556677889900aabbccddeeff00112233445566",
      "url": "https://img.imageapis.com/s/sb_8mz2kq7xvtnw4hbc3dpe/{template}.png?{query}&sig={signature}",
      "how_to_sign": "signature = hex(HMAC-SHA256(secret, '/s/sb_8mz2kq7xvtnw4hbc3dpe/tpl_4nq8vzk2hdyw7bxme3rc.png?title=Hello&exp=1760000000')); append &sig=… to the same URL",
      "created": "2026-10-10T18:20:00Z"
    }
  ]
}
401Missing or invalid API key (from the gateway)
429Plan ceiling or rate limit reached; see X-Gw-Reset (from the gateway)
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

POST/v1/signed-bases

Create a signed-URL base: images that render on demand from a URL

A signed base lets you build image URLs in your own code with no API call: https://img.imageapis.com/s/<base>/<template>.png?title=…&sig=<hmac>. The browser or crawler fetching the URL triggers the render; identical URLs are served from cache and cost nothing. Sign the path and query exactly as sent with HMAC-SHA256 and the base's secret, hex encoded. Add exp (unix seconds) to make a URL expire. Each new render costs one image against the key that created the base.

REQUEST BODY · APPLICATION/JSON
{
  "name": "Blog cards"
}
Open on its own page
REQUEST
curl -X POST "https://api.imageapis.com/v1/signed-bases" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Blog cards"
}'
RESPONSE
201Created
{
  "id": "sb_8mz2kq7xvtnw4hbc3dpe",
  "object": "signed_base",
  "name": "Blog cards",
  "template": null,
  "secret": "sbs_1f2e3d4c5b6a79880011223344556677889900aabbccddeeff00112233445566",
  "url": "https://img.imageapis.com/s/sb_8mz2kq7xvtnw4hbc3dpe/{template}.png?{query}&sig={signature}",
  "how_to_sign": "signature = hex(HMAC-SHA256(secret, '/s/sb_8mz2kq7xvtnw4hbc3dpe/tpl_4nq8vzk2hdyw7bxme3rc.png?title=Hello&exp=1760000000')); append &sig=… to the same URL",
  "created": "2026-10-10T18:20:00Z"
}
401Missing or invalid API key (from the gateway)
404No such template or record on this account
{
  "error": "string",
  "message": "string",
  "param": "string"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

DELETE/v1/signed-bases/{id}

Delete a signed-URL base; its URLs stop rendering

PARAMETERS
idpath · stringREQUIRED
The base id
e.g. sb_8mz2kq7xvtnw4hbc3dpe
Open on its own page
REQUEST
curl -X DELETE "https://api.imageapis.com/v1/signed-bases/sb_8mz2kq7xvtnw4hbc3dpe" \
  -H "X-API-Key: YOUR_KEY"
RESPONSE
200OK
{
  "id": "sb_8mz2kq7xvtnw4hbc3dpe",
  "object": "signed_base",
  "deleted": true
}
401Missing or invalid API key (from the gateway)
404No such template or record on this account
{
  "error": "string",
  "message": "string",
  "param": "string"
}
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.

Fonts

GET/v1/fonts

Fonts available to text layers

Any Google Fonts family works by name; this list is the curated set with their weights. System fonts need no loading.

Open on its own page
REQUEST
curl "https://api.imageapis.com/v1/fonts" \
  -H "X-API-Key: YOUR_KEY"
RESPONSE
200OK
{
  "fonts": [
    {
      "name": "Inter",
      "category": "sans-serif",
      "weights": "100..900"
    },
    {
      "name": "Playfair Display",
      "category": "serif",
      "weights": "400..900"
    }
  ],
  "system": [
    "Arial",
    "Georgia",
    "system-ui"
  ],
  "note": "Other Google Fonts families load at weight 400 when named"
}
401Missing or invalid API key (from the gateway)
429Plan ceiling or rate limit reached; see X-Gw-Reset (from the gateway)
Try it — sign in first
Runs on a sandbox key: 200 requests a month. Your real key is for production.