Create Workflow
Create a workflow programmatically
Enterprise Only
The Workflows API is available only to first party clients like the Orshot MCP server and workspaces on the Enterprise plan. Checkout the Enterprise Pricing to get access.
Overview#
Create a workflow from a steps array. This is the same contract the in-app builder uses, with identical validation and plan gating, so a workflow created here behaves exactly like one built in the dashboard.
A workflow is an ordered list of steps, each { key, type, config }. Use the node catalog (GET /v1/workflows/nodes) to discover every buildable node, its configSchema, and whether it is available on your plan. You can validate a steps array without writing anything via POST /v1/workflows/validate.
https://api.orshot.com/v1/workflowsRequest Body#
| Parameter | Type | Required | Description |
|---|---|---|---|
name | String | No | Workflow name, up to 200 characters. Defaults to "Untitled workflow" |
description | String | No | Optional description |
steps | Array | Yes | Ordered steps, each { key, type, config }. The first step must be a trigger or data source |
status | String | No | draft, active, paused or archived. Defaults to draft |
metadata | Object | No | Your own metadata. Server-managed keys (health, poll, share) are ignored |
Request#
await fetch("https://api.orshot.com/v1/workflows", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer <ORSHOT_API_KEY>",
},
body: JSON.stringify({
name: "Renders from new Drive files",
status: "draft",
steps: [
{
key: "google_drive_new_file",
type: "trigger",
config: { folderId: "<DRIVE_FOLDER_ID>", pollInterval: 10 },
},
{
key: "render",
type: "action",
config: {
templateId: "1443",
format: "jpg",
mapping: { headline: "name", hero_image: "image_url" },
},
},
{
key: "orshot_url",
type: "destination",
config: {},
},
],
}),
});Returns 201 Created. warnings lists anything that would block a run (for example a missing destination), so you can save a draft now and finish it later.
Activation Rules#
Creating with status: "active" enforces everything a run needs up front:
- The steps must be complete and runnable (no warnings)
- Steps gated to a higher plan tier block activation (they save fine as a draft)
- Required provider connections must already be connected in the workspace
- Your plan's active-workflow limit must not be exceeded
Error Responses#
Invalid Workflow (400)#
{
"error": "Invalid workflow",
"details": ["Step 2 (render): templateId is required"]
}Not Runnable Yet (400)#
Returned when activating an incomplete workflow.
{
"error": "Workflow is not runnable yet, finish it before activating",
"details": ["no_destination"],
"hints": ["Add a destination step so every render is delivered somewhere."]
}Missing Connection (400)#
{
"error": "Connect your Google Drive account before activating this workflow",
"code": "missing_connection"
}Plan Gated Steps (403)#
{
"error": "Some steps in this workflow require a higher plan",
"code": "plan_gated"
}Rate Limits#
- 60 requests per minute per workspace
Ready to automate?
Start rendering images, PDFs and videos from your templates in under 2 minutes. Free plan, no credit card.
Get your API key- Image, PDF and video generation via API
- Visual editor with AI and smart layouts
- Zapier, Make, MCP and 50+ integrations
- White-label embed for your own app
- 30 free credits — no credit card required