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.

  1. 1Create a scoped API keyCreate it in Account, store the secret once, and use the smallest scopes your integration needs.
  2. 2Choose a templateList templates or create one through the API. Each template contains one or more variants.
  3. 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/:renderId

The 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/:id

Original 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/:slug

Supported 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:read

MCP 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_render

Render 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.