Developer platform
Build with Duply
Create and update templates, generate images or videos, connect automations, or give an AI client controlled access through MCP. Existing Duply integrations remain supported.
Public hosts
- Application and tRPC
- https://app.duply.co
- REST API v2
- https://api.duply.co/v2
- Legacy REST API
- https://api.duply.co/api/v1
- Render and share URLs
- https://render.duply.co
- Generated assets
- https://assets.duply.co
- MCP endpoint
- https://api.duply.co/api/mcp
worker.duply.co is operational infrastructure. Do not call it from customer integrations.
REST API quick start
Use bearer API keys, JSON request bodies, cursor pagination, and asynchronous render jobs for new integrations. Every response includes a request id and every error has a stable machine-readable code.
- 1Create a scoped API keyCreate it in Account, store the secret once, and use the smallest scopes your integration needs.
- 2Choose a templateList templates or create one through the API. Each template contains one or more variants.
- 3Create a render jobSend an idempotency key, store the returned job ID, and poll until the job completes.
GET https://api.duply.co/v2/templates
POST https://api.duply.co/v2/templates
PATCH https://api.duply.co/v2/templates/:templateId
POST https://api.duply.co/v2/templates/:templateId/variants
PATCH https://api.duply.co/v2/templates/:templateId/variants/:variantId
GET https://api.duply.co/v2/usage
POST https://api.duply.co/v2/renders
GET https://api.duply.co/v2/renders/:renderIdThe complete OpenAPI 3.1 contract is available at https://api.duply.co/v2/openapi.json.
Create an idempotent render
curl --request POST 'https://api.duply.co/v2/renders' \
--header 'Authorization: Bearer duply_...' \
--header 'Idempotency-Key: order-1842-social-card' \
--header 'Content-Type: application/json' \
--data '{
"templateId": "template_id",
"variantName": "Default",
"output": { "format": "png" },
"variables": { "headline": "Hello world" }
}'Render a template video
Template video renders composite the stored static layers with playable video layers. For fully generated scene-based videos, send a VideoBlueprint instead of a template ID.
curl --request POST 'https://api.duply.co/v2/renders' \
--header 'Authorization: Bearer duply_...' \
--header 'Idempotency-Key: order-1842-video' \
--header 'Content-Type: application/json' \
--data '{
"templateId": "template_id",
"kind": "video",
"output": { "format": "mp4" },
"durationSeconds": 10,
"variables": { "headline": "Hello world", "clip": "https://cdn.example.com/clip.mp4" }
}'Create and edit templates
Template metadata and variant documents are separate resources. This keeps template identity stable while allowing multiple sizes or layouts. Writes require templates:write.
Create a template
curl --request POST 'https://api.duply.co/v2/templates' \
--header 'Authorization: Bearer duply_...' \
--header 'Content-Type: application/json' \
--data '{
"name": "Weekly report",
"type": "image",
"width": 1200,
"height": 630,
"background": "#ffffff",
"variant": {
"name": "Default",
"document": { "version": 1, "canvas": {}, "elements": [] }
}
}'Update a template
curl --request PATCH 'https://api.duply.co/v2/templates/template_id' \
--header 'Authorization: Bearer duply_...' \
--header 'Content-Type: application/json' \
--data '{ "name": "Weekly customer report", "status": "published" }'Update a variant document through PATCH /templates/:templateId/variants/:variantId. Deleting a template archives it and preserves existing render history.
Legacy compatibility
Existing Zapier, n8n, Make, and custom integrations can keep their Basic authentication and original URLs. Legacy image generation waits for the worker and returns the completed file shape used by the old API. Send `Prefer: respond-async` to receive a queued job instead.
GET https://api.duply.co/api/v1/auth
GET https://api.duply.co/api/v1/usage
GET https://api.duply.co/api/v1/template
POST https://api.duply.co/api/v1/generate
GET https://api.duply.co/api/v1/generate/:id
POST https://api.duply.co/api/v1/generate-video
GET https://api.duply.co/api/v1/generate-video/:id
GET https://api.duply.co/api/v1/polling/:idOriginal Duply API compatibility
Existing integrations can keep using the original documented endpoints below. Validation returns migrated template content and the API accepts migrated binary-UUID template identifiers.
POST https://api.duply.co/v1/generate
POST https://api.duply.co/api/generate/v1/:templateId
GET https://api.duply.co/generated/api/v1?templateId=:id
POST https://api.duply.co/generated/api/v1?templateId=:id
GET https://api.duply.co/generated/api/v1/auth?apiKey=...&secretKey=...Render URLs
Query parameters whose names match editable template fields are applied before rendering. Identical template, variables, and output options reuse the generated file. Completed redirects are cached at the edge for five minutes.
GET https://render.duply.co/query/:slug/image.jpg?headline=Hello
GET https://render.duply.co/query/:slug/image.jpg?headline=Hello&format=png&is-transparent=true
GET https://render.duply.co/query/:slug/image.jpg?headline:::style:::color=%23ffffff
GET https://render.duply.co/signed/:slug/image.jpg?fill=...&sig=...
GET https://render.duply.co/share/form/:templateId/:slugSupported output options are format=jpg|jpeg|png and is-transparent=true. Legacy nested overrides use field:::style:::property, field:::background:::color, or field:::data:::property. An uncached render may briefly return HTTP 202 when the worker needs longer than the synchronous wait window; retry the same URL to receive the cached file.
Authentication
Send API keys in the authorization contract shown when a key is created in Account. Signed render URLs use their signature instead of a browser session.
Authorization: Bearer duply_...
Scopes:
templates:read
templates:write
renders:read
renders:write
usage:readMCP server
Duply exposes a stateless Streamable HTTP MCP endpoint backed by the same API keys, scopes, validation, billing, and render queue as REST. An AI client can list or inspect templates, create and update templates, enqueue renders, and check render status.
Endpoint: https://api.duply.co/api/mcp
Transport: Streamable HTTP (POST)
Authorization: Bearer duply_...
Tools:
duply_list_templates
duply_get_template
duply_create_template
duply_update_template
duply_create_variant
duply_update_variant
duply_create_render
duply_get_renderRender tools are asynchronous. Clients must call duply_get_render until the returned status is completed; a queued response is not a completed file.
Zapier, Make, and n8n
Use the REST API for reliable automation and dynamic render URLs for simple image fields. Keep the render asynchronous for batch workflows: create a render, store its job id, then poll the job until a generated file URL is available.
Zapier / Make HTTP module:
POST https://api.duply.co/v2/renders
Authorization: Bearer duply_...
Idempotency-Key: {{source_record_id}}
n8n HTTP Request:
POST https://api.duply.co/v2/renders
Body: { "templateId": "...", "variables": { "headline": "{{$json.title}}" } }Existing automations may continue to use the legacy endpoints. New workflows should use v2 idempotency keys to prevent duplicate outputs when a provider retries a step.