Workflows and Apps

Workflows are programmable pipelines that allow you to chain multiple AI models and tools together to automate complex creative tasks. A workflow can accept inputs, process them through multiple nodes (models/tools), and produce outputs.

Apps are workflows that can be discovered and used by anyone through the API. They provide pre-built creative pipelines that you can integrate into your applications.


Workflows

Core Concepts

  • Workflow: A pipeline definition containing nodes, inputs, and execution logic
  • Node: A step in the workflow (e.g., a model inference, transformation, or logic operation)
  • Inputs: Parameters that must be provided when running the workflow
  • Flow: The graph of nodes that defines the workflow execution order
  • Privacy: Controls who can access the workflow (public, private)
  • Status: Lifecycle state (draft, ready, deleted)

Workflow Privacy Levels

PrivacyDescription
publicDiscoverable by anyone, can be run by anyone (Apps)
privateOnly accessible by the owning project

Workflow Status

StatusDescription
draftWork in progress, cannot be executed
readyComplete and executable
deletedSoft-deleted (not returned by API)

Endpoints

List Workflows

Retrieve a list of workflows. By default, returns private workflows for authenticated users.

Endpoint:

GET /v1/workflows

Query Parameters:

ParameterTypeRequiredDefaultDescription
projectIdstringYes*-Your project ID (*optional for public workflows)
privacystringNoprivateFilter by privacy: public, private
statusstringNo-Filter by status: draft, ready
tagsstringNo-Comma-separated list of tags to filter by
pageSizeintegerNo50Number of results per page (1-100)
paginationTokenstringNo-Token for fetching the next page

Example Request:

# List your private workflows
curl -X GET "https://api.scenario.com/v1/workflows?projectId=proj_abc123&privacy=private" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>"

# List public workflows (Apps)
curl -X GET "https://api.scenario.com/v1/workflows?privacy=public" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>"

# Filter by tags
curl -X GET "https://api.scenario.com/v1/workflows?projectId=proj_abc123&tags=upscale,image-enhancement" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>"

Response:

{
  "workflows": [
    {
      "id": "workflow_abc123",
      "name": "Image Upscaler",
      "description": "Upscale images to 4K resolution with AI enhancement",
      "shortDescription": "AI-powered 4K image upscaling",
      "status": "ready",
      "privacy": "public",
      "ownerId": "proj_xyz789",
      "authorId": "user_123",
      "createdAt": "2026-01-15T10:30:00Z",
      "updatedAt": "2026-02-01T14:22:00Z",
      "tagSet": ["upscale", "image-enhancement", "tool"],
      "inputs": [
        {
          "name": "image",
          "type": "file",
          "kind": "image",
          "description": "The image to upscale",
          "required": { "always": true }
        }
      ],
      "thumbnail": {
        "assetId": "asset_thumb123",
        "url": "https://cdn.scenario.com/..."
      },
      "before": {
        "assetId": "asset_before123",
        "url": "https://cdn.scenario.com/..."
      },
      "after": {
        "assetId": "asset_after123",
        "url": "https://cdn.scenario.com/..."
      },
      "outputAssetKinds": ["image"],
      "isLocked": false,
      "flow": [...],
      "editorInfo": {...}
    }
  ],
  "nextPaginationToken": "eyJsYXN0S2V5IjoiLi4uIn0="
}

Get Workflow

Retrieve details of a specific workflow.

Endpoint:

GET /v1/workflows/{workflowId}

Path Parameters:

ParameterTypeRequiredDescription
workflowIdstringYesThe workflow ID

Query Parameters:

ParameterTypeRequiredDescription
projectIdstringNo*Your project ID (*required for private workflows)

Example Request:

curl -X GET "https://api.scenario.com/v1/workflows/workflow_abc123?projectId=proj_abc123" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>"

Response:

{
  "workflow": {
    "id": "workflow_abc123",
    "name": "Background Remover",
    "description": "Remove backgrounds from images automatically",
    "shortDescription": "AI background removal",
    "status": "ready",
    "privacy": "public",
    "ownerId": "proj_xyz789",
    "authorId": "user_123",
    "createdAt": "2026-01-10T08:15:00Z",
    "updatedAt": "2026-01-28T11:45:00Z",
    "tagSet": ["remove-background", "editing", "tool"],
    "inputs": [
      {
        "name": "image",
        "type": "file",
        "kind": "image",
        "description": "Image to remove background from",
        "required": { "always": true }
      }
    ],
    "flow": [
      {
        "id": "node_1",
        "type": "remove-background",
        "inputs": [
          {
            "name": "image",
            "type": "file",
            "kind": "image",
            "ref": {
              "node": "workflow",
              "name": "image"
            }
          }
        ],
        "status": "pending"
      }
    ],
    "thumbnail": {
      "assetId": "asset_thumb456",
      "url": "https://cdn.scenario.com/..."
    },
    "outputAssetKinds": ["image"],
    "isLocked": false,
    "editorInfo": {...}
  }
}

Create Workflow

Create a new workflow. New workflows start with draft status.

Endpoint:

POST /v1/workflows

Query Parameters:

ParameterTypeRequiredDescription
projectIdstringYesYour project ID

Request Body:

FieldTypeRequiredDescription
namestringYesWorkflow name
descriptionstringYesFull description

Example Request:

curl -X POST "https://api.scenario.com/v1/workflows?projectId=proj_abc123" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My Custom Pipeline",
    "description": "A custom workflow for image processing"
  }'

Response:

{
  "workflow": {
    "id": "workflow_new123",
    "name": "My Custom Pipeline",
    "description": "A custom workflow for image processing",
    "status": "draft",
    "privacy": "private",
    "ownerId": "proj_abc123",
    "authorId": "user_123",
    "createdAt": "2026-02-11T10:30:00Z",
    "updatedAt": "2026-02-11T10:30:00Z",
    "tagSet": [],
    "inputs": [],
    "flow": [],
    "isLocked": false,
    "editorInfo": {}
  }
}

Update Workflow

Update an existing workflow's configuration, inputs, flow, or metadata.

Endpoint:

PUT /v1/workflows/{workflowId}

Path Parameters:

ParameterTypeRequiredDescription
workflowIdstringYesThe workflow ID

Query Parameters:

ParameterTypeRequiredDescription
projectIdstringYesYour project ID

Request Body: (all fields optional)

FieldTypeDescription
namestringWorkflow name
descriptionstringFull description
shortDescriptionstringShort description for UI display
statusstringSet to draft or ready
inputsarrayArray of input definitions (see Input Schema below)
flowarrayArray of workflow nodes (see Node Schema below)
tagSetarrayArray of tag strings
outputAssetKindsarrayExpected output types: ["image"], ["video"], etc.
beforestringAsset ID for "before" preview (or null to remove)
afterstringAsset ID for "after" preview (or null to remove)
thumbnailstringAsset ID for thumbnail (or null to remove)
isLockedbooleanLock/unlock the workflow
editorInfoobjectEditor-specific metadata

Example Request:

curl -X PUT "https://api.scenario.com/v1/workflows/workflow_abc123?projectId=proj_abc123" \
  -H "Authorization: Basic <your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Enhanced Image Pipeline",
    "shortDescription": "Quick image enhancement",
    "status": "ready",
    "inputs": [
      {
        "name": "image",
        "type": "file",
        "kind": "image",
        "description": "Input image",
        "required": { "always": true }
      },
      {
        "name": "strength",
        "type": "number",
        "description": "Enhancement strength",
        "default": 0.8,
        "min": 0,
        "max": 1,
        "required": { "always": false }
      }
    ],
    "flow": [
      {
        "id": "node_upscale",
        "type": "custom-model",
        "modelId": "model_upscaler",
        "inputs": [
          {
            "name": "image",
            "type": "file",
            "kind": "image",
            "ref": { "node": "workflow", "name": "image" }
          }
        ]
      }
    ],
    "tagSet": ["upscale", "enhancement"]
  }'

Response:

{
  "workflow": {
    "id": "workflow_abc123",
    "name": "Enhanced Image Pipeline",
    ...
  }
}

Delete Workflow

Delete a workflow. Locked workflows can only be deleted by their author.

Endpoint:

DELETE /v1/workflows/{workflowId}

Path Parameters:

ParameterTypeRequiredDescription
workflowIdstringYesThe workflow ID

Query Parameters:

ParameterTypeRequiredDescription
projectIdstringYesYour project ID

Example Request:

curl -X DELETE "https://api.scenario.com/v1/workflows/workflow_abc123?projectId=proj_abc123" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>"

Response:

{
  "success": true
}

Run Workflow

Execute a workflow with provided inputs. Returns a job that tracks the execution.

Endpoint:

PUT /v1/workflows/{workflowId}/run

Path Parameters:

ParameterTypeRequiredDescription
workflowIdstringYesThe workflow ID

Query Parameters:

ParameterTypeRequiredDescription
projectIdstringYesYour project ID
dryRunstringNoSet to "true" to estimate cost without executing

Request Body:

FieldTypeRequiredDescription
inputsobjectNo*Key-value pairs matching workflow inputs (*required if workflow has required inputs)

Example Request:

curl -X PUT "https://api.scenario.com/v1/workflows/workflow_abc123/run?projectId=proj_abc123" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>" \
  -H "Content-Type: application/json" \
  -d '{
    "inputs": {
      "image": "asset_input123",
      "strength": 0.85
    }
  }'

Response:

{
  "job": {
    "jobId": "job_wf_abc123xyz",
    "jobType": "workflow",
    "status": "in-progress",
    "progress": 15,
    "ownerId": "proj_abc123",
    "authorId": "user_123",
    "createdAt": "2026-02-11T10:35:00Z",
    "updatedAt": "2026-02-11T10:35:05Z",
    "metadata": {
      "input": {
        "image": "asset_input123",
        "strength": 0.85
      },
      "flow": [
        {
          "id": "node_upscale",
          "type": "custom-model",
          "modelId": "model_upscaler",
          "status": "processing",
          "jobId": "job_node_123",
          "inputs": [...]
        }
      ],
      "isApiKey": true
    }
  },
  "workflow": {
    "id": "workflow_abc123",
    "name": "Enhanced Image Pipeline",
    ...
  }
}

Dry Run Example:

# Estimate cost without executing
curl -X PUT "https://api.scenario.com/v1/workflows/workflow_abc123/run?projectId=proj_abc123&dryRun=true" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>" \
  -H "Content-Type: application/json" \
  -d '{
    "inputs": {
      "image": "asset_input123"
    }
  }'

Dry Run Response:

{
  "statusCode": 402,
  "message": "Dry run completed",
  "estimatedCost": 12
}

Get Workflow Tags

Retrieve unique tags used in workflows for a project.

Endpoint:

GET /v1/workflows/tags

Query Parameters:

ParameterTypeRequiredDefaultDescription
projectIdstringYes-Your project ID
statusstringNoreadyFilter by workflow status

Example Request:

curl -X GET "https://api.scenario.com/v1/workflows/tags?projectId=proj_abc123" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>"

Response:

{
  "tags": [
    "upscale",
    "remove-background",
    "image-enhancement",
    "video",
    "tool",
    "editing"
  ]
}

Apps (Public Workflows)

Apps are public workflows that anyone can discover and use. They're pre-built creative pipelines optimized for specific tasks.

Discover Apps

List all available apps by filtering for public workflows.

Example Request:

curl -X GET "https://api.scenario.com/v1/workflows?privacy=public&status=ready" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>"

Use Case Examples:

# Find background removal apps
curl -X GET "https://api.scenario.com/v1/workflows?privacy=public&tags=remove-background"

# Find upscaling apps
curl -X GET "https://api.scenario.com/v1/workflows?privacy=public&tags=upscale"

# Find all tool-type apps
curl -X GET "https://api.scenario.com/v1/workflows?privacy=public&tags=tool"

Run an App

Running an app is identical to running a workflow:

Example Request:

# Run the Background Remover app
curl -X PUT "https://api.scenario.com/v1/workflows/workflow_bg_remover/run?projectId=proj_abc123" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>" \
  -H "Content-Type: application/json" \
  -d '{
    "inputs": {
      "image": "asset_photo123"
    }
  }'

Monitoring Job Execution

After running a workflow, monitor its progress using the Jobs API:

Get Job Status:

curl -X GET "https://api.scenario.com/v1/jobs/job_wf_abc123xyz?projectId=proj_abc123" \
  -H "Authorization: Basic <base64(YOUR_API_KEY:YOUR_API_SECRET)>"

Job Status Values:

StatusDescription
queuedJob is queued for execution
in-progressJob is currently executing
succeededJob completed successfully
failedJob failed with an error
canceledJob was canceled

Completed Job Response:

{
  "job": {
    "jobId": "job_wf_abc123xyz",
    "jobType": "workflow",
    "status": "succeeded",
    "progress": 100,
    "createdAt": "2026-02-11T10:35:00Z",
    "updatedAt": "2026-02-11T10:35:45Z",
    "metadata": {
      "flow": [
        {
          "id": "node_upscale",
          "status": "success",
          "assets": [
            {
              "assetId": "asset_output123",
              "url": "https://cdn.scenario.com/output/..."
            }
          ]
        }
      ]
    }
  }
}

Input Schema Reference

Workflow inputs define the parameters that must be provided when running the workflow.

Common Input Types:

File Input (Image)

{
  "name": "image",
  "type": "file",
  "kind": "image",
  "description": "Input image",
  "required": { "always": true }
}

String Input

{
  "name": "prompt",
  "type": "string",
  "description": "Text prompt for generation",
  "default": "A beautiful landscape",
  "required": { "always": true }
}

Number Input

{
  "name": "strength",
  "type": "number",
  "description": "Processing strength",
  "default": 0.75,
  "min": 0,
  "max": 1,
  "step": 0.05,
  "required": { "always": false }
}

Boolean Input

{
  "name": "enable_feature",
  "type": "boolean",
  "description": "Enable advanced feature",
  "default": false,
  "required": { "always": false }
}

Select Input

{
  "name": "style",
  "type": "select",
  "description": "Output style",
  "options": ["realistic", "artistic", "cartoon"],
  "default": "realistic",
  "required": { "always": true }
}

Node Schema Reference

Nodes define the processing steps in a workflow's flow.

Node Types

TypeDescription
custom-modelRun a custom AI model
remove-backgroundRemove image background
logicConditional logic (if/else)
transformTransform data
user-approvalRequire user approval
workflowRun a sub-workflow
generate-promptGenerate/refine prompts

Custom Model Node

{
  "id": "node_generation",
  "type": "custom-model",
  "modelId": "model_xyz123",
  "inputs": [
    {
      "name": "prompt",
      "type": "string",
      "ref": {
        "node": "workflow",
        "name": "prompt"
      }
    },
    {
      "name": "image",
      "type": "file",
      "kind": "image",
      "ref": {
        "node": "workflow",
        "name": "image"
      }
    }
  ]
}

Logic Node (If/Else)

{
  "id": "node_condition",
  "type": "logic",
  "logicType": "if-else",
  "inputs": [
    {
      "name": "condition",
      "type": "string",
      "ref": {
        "node": "workflow",
        "name": "mode"
      }
    }
  ],
  "logic": {
    "cases": [
      {
        "condition": "fast",
        "value": "output_fast"
      },
      {
        "condition": "quality",
        "value": "output_quality"
      }
    ],
    "default": "output_balanced"
  }
}

Transform Node

{
  "id": "node_resize",
  "type": "transform",
  "inputs": [
    {
      "name": "width",
      "type": "number",
      "value": 1024
    }
  ],
  "logic": {
    "transform": "resize(width, height)"
  }
}

Node References

Nodes can reference outputs from other nodes or workflow inputs:

{
  "ref": {
    "node": "workflow",        // or node ID like "node_1"
    "name": "prompt"           // input/output name
  }
}

Reference previous node output:

{
  "ref": {
    "node": "node_upscale",
    "name": "all"              // get all outputs
  }
}

Conditional references:

{
  "ref": {
    "conditional": ["node_check_1", "node_check_2"],
    "equal": "success"
  }
}

Workflow Locking

Locked workflows cannot be modified or deleted except by specific users.

Lock a Workflow:

curl -X PUT "https://api.scenario.com/v1/workflows/workflow_abc123?projectId=proj_abc123" \
  -H "Authorization: Basic <your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{ "isLocked": true }'

Lock Rules:

  • Only the workflow author or project editors can lock/unlock
  • Only the author can modify or delete a locked workflow
  • Locking prevents accidental changes to production workflows

Error Handling

Common Error Codes

Status CodeDescription
400Bad Request - Invalid parameters or body
401Unauthorized - Invalid or missing API key
403Forbidden - Insufficient permissions
404Not Found - Workflow doesn't exist
402Payment Required - Returned for dry run billing estimates

Error Response Format:

{
  "statusCode": 400,
  "error": "Bad Request",
  "message": "Invalid privacy. Must be one of: public, private, unlisted"
}

Best Practices

1. Use Draft Status During Development

Create workflows with draft status while building them. Set to ready only when complete and tested.

2. Leverage Tags for Organization

Use consistent tags to categorize workflows:

  • tool - Utility workflows (upscale, remove-background)
  • editing - Image/video editing workflows
  • generation - Content generation workflows
  • Custom domain tags (e.g., gaming, marketing)

3. Provide Clear Input Descriptions

Help users understand what each input does with clear descriptions and appropriate defaults.

4. Use Dry Run for Cost Estimation

Before executing expensive workflows, use dryRun=true to estimate costs.

5. Monitor Jobs Asynchronously

Workflows can take time to complete. Poll the Jobs API or use webhooks to monitor progress.

6. Lock Production Workflows

Lock workflows that are used in production to prevent accidental modifications.

7. Use Before/After/Thumbnail Assets

Add visual examples to help users understand what the workflow does.


Rate Limits

  • API Requests: 100 requests per minute per project
  • Concurrent Workflow Jobs: 10 concurrent executions per project
  • Workflow Size: Maximum 50 nodes per workflow

Support & Resources