Work with this as data
Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/pictify-io:pictify-io-templates-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
OpenAPI Specification
openapi: 3.2.0
info:
title: Pictify Templates API
version: 1.0.0
description: 'Generate images, GIFs, and PDFs from HTML templates programmatically.
## Authentication
All API requests require a Bearer token in the Authorization header:
```
Authorization: Bearer pk_live_your_api_key
```
## Rate Limits
- Free: 60 requests/minute
- Pro: 300 requests/minute
- Business: 1,000 requests/minute
Rate limit headers are included in all responses.'
contact:
email: support@pictify.io
url: https://pictify.io
license:
name: MIT
servers:
- url: https://api.pictify.io
description: Production
security:
- bearerAuth: []
tags:
- name: Templates
description: Template management
paths:
/templates:
get:
operationId: listTemplates
summary: List templates
tags:
- Templates
parameters:
- name: page
in: query
schema:
type: integer
default: 1
- name: limit
in: query
schema:
type: integer
maximum: 100
default: 12
- name: sort
in: query
schema:
type: string
enum:
- newest
- oldest
- name
default: newest
- name: outputFormat
in: query
schema:
type: string
enum:
- all
- image
- pdf
default: all
responses:
'200':
description: List of templates
content:
application/json:
schema:
type: object
properties:
templates:
type: array
items:
$ref: '#/components/schemas/Template'
pagination:
$ref: '#/components/schemas/Pagination'
post:
operationId: createTemplate
summary: Create a template
description: 'Create a new template. Pictify supports two template engines:
- `engine: "html"` — Handlebars + HTML. Author a template with `{{variable}}` tokens,
`{{#each}}` / `{{#if}}` blocks, and the built-in helper library. Supplied `html`
is compile-validated on save; any identifier referenced in the template body
but missing from `variableDefinitions` is auto-added as a text variable and
returned in `addedVariables` on the response.
- `engine: "fabric"` (default) — FabricJS canvas. Provide `fabricJSData`.
If `engine` is omitted the server defaults to `fabric` for backwards compatibility.
New HTML templates should set `engine: "html"` explicitly.'
tags:
- Templates
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- name
properties:
name:
type: string
description: Human-readable template name. Shown in the dashboard.
engine:
type: string
enum:
- fabric
- html
default: fabric
description: 'Template engine. Set `html` to author with Handlebars + HTML.
'
html:
type: string
description: 'Required for `engine=html`. Handlebars source. Must compile.
Undeclared `{{identifier}}` references are auto-added as text variables.
'
fabricJSData:
type: object
description: Required for `engine=fabric`. FabricJS canvas JSON.
additionalProperties: true
width:
type: integer
description: Render width in px.
height:
type: integer
description: Render height in px.
type:
type: string
description: Template type tag (e.g. `og-image`, `twitter-card`). Free-form.
category:
type: string
tags:
type: array
items:
type: string
variableDefinitions:
type: array
description: 'Variable schema. For `engine=html`, identifiers referenced in the template
body but not declared here are auto-added as text variables and returned
under `addedVariables` in the response.
'
items:
$ref: '#/components/schemas/VariableDefinition'
jsEnabled:
type: boolean
default: false
description: '`engine=html` only. When true, scripts inside the template execute at
render time. Enables Chart.js, KaTeX, and animated SVG. Disables
infinite-loop protection; the 30s hard timeout still applies.
'
strictVariables:
type: boolean
default: false
description: '`engine=html` only. When true, missing root-level variables throw
HTTP 422 at render time. Leave off if you rely on `{{#if optional}}` guards.
'
outputFormat:
type: string
enum:
- image
- pdf
default: image
pdfPreset:
type: string
enum:
- A4
- A4_LANDSCAPE
- LETTER
- LETTER_LANDSCAPE
- LEGAL
- A3
- TABLOID
default: A4
description: Page preset when `outputFormat=pdf`.
pages:
type: array
description: Multi-page canvas pages (`engine=fabric` only).
items:
type: object
properties:
pageNumber:
type: integer
name:
type: string
fabricJSData:
type: object
additionalProperties: true
examples:
handlebars:
summary: Handlebars HTML template
value:
name: OG Image
engine: html
width: 1200
height: 630
html: "<div style=\"width:1200px;height:630px;padding:64px;font-family:Inter\">\n <h1 style=\"font-size:72px\">{{title}}</h1>\n <p style=\"font-size:32px;color:#6b7280\">{{subtitle}}</p>\n {{#if showCta}}<button>{{ctaText}}</button>{{/if}}\n</div>\n"
variableDefinitions:
- name: title
type: text
defaultValue: Hello world
- name: subtitle
type: text
- name: showCta
type: boolean
defaultValue: false
- name: ctaText
type: text
defaultValue: Learn more
strictVariables: false
jsEnabled: false
fabric:
summary: FabricJS canvas template
value:
name: Quote card
engine: fabric
width: 1080
height: 1080
fabricJSData:
version: 5.3.0
objects: []
responses:
'200':
description: Template created
content:
application/json:
schema:
type: object
properties:
template:
$ref: '#/components/schemas/Template'
addedVariables:
type: array
description: '`engine=html` only. Names of identifiers referenced in the template
body that were auto-added to `variableDefinitions` during save. Omitted
when the array would be empty.
'
items:
type: string
'422':
description: 'Validation failed. Typical causes for `engine=html`: unclosed Handlebars block,
unknown helper, or (when `strictVariables=true`) a referenced variable without
a definition.
'
content:
application/json:
schema:
type: object
properties:
error:
type: string
code:
type: string
context:
type: object
additionalProperties: true
/templates/{uid}:
get:
operationId: getTemplate
summary: Get template
tags:
- Templates
parameters:
- name: uid
in: path
required: true
schema:
type: string
responses:
'200':
description: Template details
content:
application/json:
schema:
type: object
properties:
template:
$ref: '#/components/schemas/Template'
'404':
description: Template not found
put:
operationId: updateTemplate
summary: Update template
tags:
- Templates
parameters:
- name: uid
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
html:
type: string
fabricJSData:
type: object
width:
type: integer
height:
type: integer
variableDefinitions:
type: array
items:
$ref: '#/components/schemas/VariableDefinition'
responses:
'200':
description: Template updated
content:
application/json:
schema:
type: object
properties:
template:
$ref: '#/components/schemas/Template'
delete:
operationId: deleteTemplate
summary: Delete template
tags:
- Templates
parameters:
- name: uid
in: path
required: true
schema:
type: string
responses:
'200':
description: Template deleted
content:
application/json:
schema:
type: object
properties:
message:
type: string
/templates/{uid}/render:
post:
operationId: renderTemplate
summary: Render a template
description: Generate an image from a template with variables
tags:
- Templates
parameters:
- name: uid
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
variables:
type: object
additionalProperties: true
description: Key-value pairs of template variable values
format:
type: string
enum:
- png
- jpeg
- webp
- pdf
default: png
description: Output image format
quality:
type: number
minimum: 0.1
maximum: 1
default: 0.9
description: Image quality (0.1-1.0)
layout:
type: string
pattern: ^[a-z0-9-]{1,64}$
description: Render a specific layout variant (e.g. 'twitter-post', 'facebook-post'). Omit for default layout.
layouts:
type: array
items:
type: string
maxItems: 20
description: Render multiple layout variants in one request. Use 'default' for the base layout. Returns an array of results.
example:
- default
- twitter-post
- facebook-post
responses:
'200':
description: Rendered image(s). Always returns a `results` array.
content:
application/json:
schema:
$ref: '#/components/schemas/RenderResponse'
/templates/{uid}/variables:
get:
operationId: getTemplateVariables
summary: Get template variables
tags:
- Templates
parameters:
- name: uid
in: path
required: true
schema:
type: string
responses:
'200':
description: Template variables
content:
application/json:
schema:
type: object
properties:
templateUid:
type: string
templateName:
type: string
variables:
type: array
items:
$ref: '#/components/schemas/VariableDefinition'
components:
schemas:
RenderResponse:
type: object
description: Render response. Always returns a `results` array, even for single-layout renders.
properties:
results:
type: array
description: Array of rendered images, one per layout
items:
type: object
properties:
layout:
type: string
description: Layout key ('default' for base layout)
example: twitter-post
name:
type: string
description: Display name of the layout
example: Twitter/X Post
url:
type: string
format: uri
description: URL of the rendered image
example: https://cdn.pictify.io/renders/abc123.png
width:
type: integer
description: Image width in pixels
height:
type: integer
description: Image height in pixels
format:
type: string
description: Image format
example: png
id:
type: string
description: Unique render identifier
errors:
type: array
description: Layout keys that failed to render
items:
type: object
properties:
layout:
type: string
error:
type: string
totalLayouts:
type: integer
description: Total number of layouts requested
totalRendered:
type: integer
description: Number of successfully rendered layouts
totalErrors:
type: integer
description: Number of failed layouts
templateUid:
type: string
description: Template ID that was rendered
VariableDefinition:
type: object
required:
- name
properties:
name:
type: string
description: Variable identifier. Must match the name used in `{{name}}` tokens.
type:
type: string
enum:
- text
- image
- color
- chart
- table
- array
- object
default: text
defaultValue:
description: 'Fallback value when the variable is not supplied at render time.
Typed according to `type` — string for text/image/color/url, number for number,
boolean for boolean, ISO date string for date, JSON array/object for array/object.
'
description:
type: string
allowRawHtml:
type: boolean
description: 'Only meaningful for `type=text` on `engine=html` templates. When true the value
is NOT HTML-escaped at render time. Use with care — treat as trusted input.
'
default: false
validation:
type: object
properties:
required:
type: boolean
minLength:
type: integer
maxLength:
type: integer
Pagination:
type: object
properties:
page:
type: integer
limit:
type: integer
total:
type: integer
totalPages:
type: integer
hasNext:
type: boolean
hasPrev:
type: boolean
Template:
type: object
properties:
uid:
type: string
name:
type: string
engine:
type: string
enum:
- fabric
- html
description: 'Which renderer owns this template.
- `fabric` — legacy canvas templates (fabricJSData)
- `html` — Handlebars + HTML templates (html field, supports `{{var}}`, `{{#each}}`, `{{#if}}`, and the built-in helper library)
'
html:
type: string
description: Handlebars source for `engine=html` templates.
fabricJSData:
type: object
description: FabricJS canvas JSON for `engine=fabric` templates.
additionalProperties: true
jsEnabled:
type: boolean
description: 'Only meaningful for `engine=html`. When true, scripts inside the template
execute during render (Chart.js, KaTeX, animated SVG). Off by default
to prevent runaway loops; a 30s hard timeout still applies.
'
default: false
strictVariables:
type: boolean
description: 'Only meaningful for `engine=html`. When true, rendering fails with HTTP 422
if a root-level variable referenced in the template was not supplied.
Leave off if you rely on `{{#if optional}}` guards.
'
default: false
type:
type: string
category:
type: string
tags:
type: array
items:
type: string
width:
type: integer
height:
type: integer
thumbnail:
type: string
format: uri
outputFormat:
type: string
enum:
- image
- pdf
default: image
pdfPreset:
type: string
description: Page preset used when `outputFormat=pdf`.
enum:
- A4
- A4_LANDSCAPE
- LETTER
- LETTER_LANDSCAPE
- LEGAL
- A3
- TABLOID
default: A4
variableDefinitions:
type: array
items:
$ref: '#/components/schemas/VariableDefinition'
pages:
type: array
description: Multi-page canvas pages (fabric engine).
items:
type: object
properties:
pageNumber:
type: integer
name:
type: string
fabricJSData:
type: object
additionalProperties: true
layouts:
type: object
description: 'Named layout variants. Keys are short identifiers matching
`^[a-z0-9-]{1,64}$` (e.g. `twitter-post`, `og-image`). Each value
overrides `width`, `height`, and renderer-specific data for that
variant. Limit: 20 layouts per template.
'
additionalProperties:
type: object
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: API key obtained from the Pictify dashboard