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/rendry-io:rendry-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: 3.2.0
info:
title: Rendry Templates API
version: 1.6.0
description: 'Template-based image generation API. Design a template in the visual editor (or via POST /presets), then render on-brand images with one call. Every capability the MCP server exposes as a tool is reachable over REST as well — same implementation behind both, so the two never drift. For AI agents a remote MCP endpoint is available at /mcp (streamable HTTP) — see https://rendry.io/llms-full.txt. Every refusal, on every door, is one JSON object {error: machine code, message: sentence, …fields} with the HTTP status of its class — see the Refusal schema; an MCP tool error carries the same object as its text.
Authentication: four bearer credentials open the render and template doors — a persisted live or test API key (sk_live_… / sk_test_…), the browser session of the signed-in owner (the JWT POST /auth/login returns) a connector token (the JWT the OAuth flow issues to an MCP client), and an ephemeral editor session (em_…). Browser/OAuth credentials may select a current team membership with X-Rendry-Account; API keys and embed sessions are bound to their persisted account and cannot switch accounts. GET /principal returns the resolved authority. Roles and scopes intersect; a removed member immediately loses access. Test mode is persisted on the credential: renders retain all admission limits, cost zero credits and carry a RENDRY TEST watermark; test credentials cannot publish public links. Operations that list the `session` scheme alone are the account cabinet: an API key is refused there with 401, a connector token with 403 `browser_session_required` (account deletion: `account_deletion_needs_session`). Operations with an empty `security` are public.
Also served, not described operation by operation: GET /templates/{id}/preview.png and GET /template-assets/{name} (public; the gallery''s pictures), GET /assets/library (public; the built-in image stock), GET /plans, GET /billing/config and GET /version (public; prices and the running build), GET /openapi.json (public; this document), POST /feedback (public, rate-limited by IP) and POST /feedback/agent (render credentials), the OAuth 2.1 doors under /oauth (the three /.well-known discovery documents, /register, /authorize, /client-info, /token — public; POST /oauth/decision takes the owner''s session), the guest batch under /batch-tasks/guest (public, rate-limited by IP: POST /preview, POST, GET /{token}, GET /{token}/archive), the sign-in, sign-up, e-mail verification and password doors under /auth (public; POST /auth/verify/resend takes the owner''s session), the cabinet''s POST /user/password, POST /checkout, GET /billing/history, GET /billing/subscription, GET /photos/search and POST /photos/used (owner''s session only), the payment webhooks POST /billing/webhook and POST /billing/webhook/{provider} (signed by the provider), the /internal/* doors of the render nodes (internal token) and the /admin group (administrators, session only).'
contact:
url: https://rendry.io
servers:
- url: https://rendry.io/api/v1
description: Production
security:
- apiKey: []
- session: []
- connector: []
- embed: []
tags:
- name: Templates
paths:
/templates:
get:
summary: Public template gallery
description: 51 ready-made designs (images and paginated PDF documents) with input variables, sample data and a composition (layer count per type). kind=document entries carry authored_pages and copy through POST /documents {template_id}; image entries copy through POST /templates/{id}/clone. No authentication required.
security: []
parameters:
- name: category
in: query
required: false
schema:
type: string
description: 'Filter by category: documents, events, marketing, og, product, social, youtube'
responses:
'200':
description: Templates
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/TemplateIndex'
operationId: listTemplates
tags:
- Templates
/templates/{id}:
get:
summary: Full template JSON (canvas + layers)
description: Full image template or complete document starter. Image content can be saved with POST /presets; kind:document starter pages/master/samples use POST /documents or save_document {template_id}. Document IDs cannot be cloned through image actions.
security: []
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Template DSL
'404':
description: Template not found
operationId: getTemplate
tags:
- Templates
/templates/{id}/clone:
post:
summary: Clone a gallery template into the account
description: Copies a gallery template into your presets together with its sample data and returns a renderable preset_id. Consumes a template slot.
parameters:
- name: id
in: path
required: true
schema:
type: string
- $ref: '#/components/parameters/AccountSelector'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: Name for the new preset
responses:
'200':
description: Preset created
content:
application/json:
schema:
$ref: '#/components/schemas/ClonedPreset'
'401':
description: Missing/invalid API key
'400':
description: '`unknown_field` (a key the tool does not read; a near miss is renamed and reported in `autofixed_fields`) or `invalid_input`.'
'403':
description: '`preset_limit_exceeded`: template slots exhausted — delete a preset or upgrade. The same refusal, with the same fields (used, limit, freeable, upgrade_url), as POST /presets.'
'404':
description: '`template_not_found`.'
operationId: cloneTemplate
tags:
- Templates
components:
parameters:
AccountSelector:
name: X-Rendry-Account
in: header
schema:
type: string
description: Browser/OAuth current member account selector. API keys/embed credentials are bound to their persisted account and reject another account. Omitting this header selects the browser actor personal account.
schemas:
ClonedPreset:
type: object
description: 'The reply of POST /templates/{id}/clone: a renderable preset made from the gallery template.'
required:
- preset_id
- name
- variables
properties:
preset_id:
type: string
description: The new template's group id — pass it to /render/*
name:
type: string
variables:
type: array
items:
type: string
description: Every {variable} the template accepts in dynamic_data
sample_data:
type: object
additionalProperties:
type: string
description: Realistic sample values for every variable
hint:
type: string
duplicate_note:
type: string
description: 'Sent when the account already holds a clone of this template: the slot was spent again'
TemplateIndex:
type: object
properties:
id:
type: string
name:
type: string
category:
type: string
description:
type: string
canvas_size:
type: string
example: 1080x1080
preview_url:
type: string
variables:
type: array
items:
type: string
description: Variable names the template accepts via dynamic_data
sample_data:
type: object
additionalProperties:
type: string
description: Realistic example values for every variable
composition:
type: object
additionalProperties:
type: integer
description: 'Top-level layer count per type, e.g. {"text": 2, "image": 1}; group children are not counted'
kind:
type: string
enum:
- document
description: Present for PDF document starters; absent for existing image templates
authored_pages:
type: integer
minimum: 1
maximum: 20
description: Authored pages before table continuation; document starters only
securitySchemes:
apiKey:
type: http
scheme: bearer
description: 'API key sk_live_... or sk_test_... — create at Settings → API Keys. Every key has a scope (read, render or full — see the APIKey schema); a call the scope does not cover answers 403 with `error` = `api_key_scope_insufficient`, the refused `tool`, the key''s `scope`, and a `message` naming what the key can call. A key limited to a list of presets answers a preset outside it with 403 `api_key_preset_not_allowed` and the refused `preset_id`; such a key renders and edits only its listed presets, and an inline design (canvas + layers, a document page or master of its own), a draft or a new template is refused with 403 `api_key_limited_to_presets` and a `reason` (inline_design, draft, create_template, inline_page). RESERVED: no door issues a key limited to presets yet — POST /user/api-keys hands out keys for the whole account — so `api_key_preset_not_allowed` and `api_key_limited_to_presets` are documented for clients built ahead of that door and are not answered by any key issued today.'
session:
type: http
scheme: bearer
bearerFormat: JWT
description: 'The browser session of the signed-in owner: the JWT POST /auth/login (or the SSO door) returns, sent as `Authorization: Bearer <jwt>`. Opens every render and template door and, alone, the account cabinet (API keys, account deletion, password, billing).'
connector:
type: http
scheme: bearer
bearerFormat: JWT
description: 'The token the OAuth 2.1 flow under /oauth issues to an MCP client (claude.ai connectors): the same JWT shape as a session, tagged as issued to a connector. Opens the render and template doors and /mcp; every cabinet door refuses it with 403 `browser_session_required`, account deletion with 403 `account_deletion_needs_session`.'
embed:
type: http
scheme: bearer
description: Ephemeral em_... token redeemed by the origin-restricted embedded editor. Its account, trusted subject, role and live/test mode are persisted server-side. It cannot access account administration, billing, account-wide batch services or public links. Never persist or put it in a URL.
x-rendry-service-policy:
rates:
rest_render:
requests: 10
window_seconds: 1
burst: 10
scope: account
consistency: api_process
mcp_request:
requests: 10
window_seconds: 1
burst: 10
scope: account
consistency: api_process
ui_request:
requests: 10
window_seconds: 1
burst: 10
scope: account
consistency: api_process
public_link:
requests: 60
window_seconds: 60
burst: 60
scope: ip
consistency: api_process
embed_frame:
requests: 10
window_seconds: 60
burst: 10
scope: ip
consistency: api_process
embed_redeem:
requests: 10
window_seconds: 60
burst: 10
scope: ip
consistency: api_process
sync_concurrency:
account: 4
subject: 2
consistency: api_process
scope: synchronous_render
document_queue:
pending_per_account: 4
long_pending_per_account: 1
long_above_pages: 20
consistency: postgres_transaction
scope: account; queued and processing documents
retention:
authenticated_days: 365
guest_hours: 72
url_cache_days: 30
starts_at: 'authenticated: completion; guest: batch creation'
end_user:
header: X-End-User
max_bytes: 64
pattern: ^[A-Za-z0-9_.:@-]{1,64}$
authority: analytics only; trusted embedded subject takes precedence
notes:
- REST, MCP and UI request buckets are separate; each account bucket is shared by members, keys and embedded subjects
- API keys bypass only the UI bucket; authenticated embedded sessions use it
- Sync concurrency is per API process; queued document admission is separately reserved in PostgreSQL
- Retention is the source policy; deployment of storage lifecycle rules requires a separate operator action