pictify-io Templates API

Template management

Operations 7

GET /templates List templates #
POST /templates Create a template #
GET /templates/{uid} Get template #
PUT /templates/{uid} Update template #
DELETE /templates/{uid} Delete template #
POST /templates/{uid}/render Render a template #
GET /templates/{uid}/variables Get template variables #

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.
All 92 tools →

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

pictify-io-templates-api-openapi.yml Raw ↑
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