Documentation

Synergy Documentation

Complete guide to connecting your systems with Synergy

Quick Start

Get up and running with Synergy in 5 minutes:

Create an Account

Sign up at printwithsynergy.com/register

Create an API Key

Go to Settings → API Keys → Create New Key

Upload Your First Asset

Navigate to Assets and click Upload

Create a Pipeline

Use the visual builder to transform data

Registration

Getting started with Synergy is straightforward. Here's the complete signup process:

1. Request Access

Visit printwithsynergy.com/register to request access. During the private beta, you'll need to:

  • Enter your name and email address
  • Create a secure password (minimum 8 characters)
  • Optionally include a company name and use case

2. Email Confirmation

After submitting your registration:

  • Check your inbox for a confirmation email from Synergy
  • Click the verification link within 24 hours
  • If you don't see the email, check your spam folder
  • Request a new confirmation email from the login page if needed

3. Beta Approval

During the private beta period:

  • Your account will be reviewed by our team
  • Approval typically takes 1-2 business days
  • You'll receive an email when your account is activated

Password Reset

If you forget your password:

  1. Click Forgot Password on the login page
  2. Enter your email address
  3. Check your email for a reset link (valid for 1 hour)
  4. Create a new password and log in
14-Day Free Trial: After approval, you get full platform access for 14 days. No credit card required.

Account Setup

Your Workspace

When your account is activated, you get a dedicated workspace that contains:

  • Assets: All uploaded files with extracted metadata
  • Collections: Folders to organize your assets
  • Pipelines: Data transformation workflows
  • Connections: Saved credentials for external services
  • Webhooks: Event notification endpoints
  • Schedules: Automated pipeline runs

First Steps

  1. Create an API Key: Go to Settings → API Keys for programmatic access
  2. Upload a File: Test the asset storage and metadata extraction
  3. Build a Pipeline: Create your first data transformation workflow
  4. Set Up Webhooks: Get notified when events occur

Data Isolation

Your workspace is completely isolated from other accounts. Data never crosses workspace boundaries, and all API keys are scoped to your workspace only.

Authentication

Synergy uses API keys for authentication. All API requests must include your API key in the header:

Authorization: Bearer syn_your_api_key_here

API Key Format

API keys follow this format: syn_xxxxxxxxxxxx

  • syn_ - Standard prefix for all Synergy API keys
  • Keys are 64 characters long (including prefix)
  • Keys are hashed with SHA-256 and never stored in plain text
Security: Never share your API key or commit it to version control. Use environment variables.

Dashboard

The dashboard provides an overview of your workspace:

Total Assets

Number of files uploaded to your workspace

Storage Used

Total storage consumed by your assets

Active Pipelines

Pipelines ready to process data

API Calls

API requests this billing period

Recent Activity

The dashboard shows your recent uploads and pipeline executions for quick access.

Assets

Assets are files you upload to Synergy. We automatically extract metadata from each file.

Supported File Types

Type Extensions Metadata Extracted
Images JPEG, PNG, TIFF, PSD, WebP Dimensions, DPI, color space, ICC profile, transparency
PDFs PDF Page count, dimensions, fonts, color space, PDF/X compliance
Fonts TTF, OTF, WOFF, WOFF2 Family, weight, style, glyph count
Design AI, EPS, SVG Dimensions, layer info (where available)

Uploading Files

  1. Navigate to the Assets page
  2. Click the Upload button
  3. Drag and drop files or click to browse
  4. Files are processed automatically
  5. Metadata is extracted and made searchable

Searching Assets

Use the search bar to find assets by:

  • Filename
  • File type
  • Metadata (dimensions, color space, etc.)
  • Tags
  • Collection name

Filtering by Type

Use the sidebar filters to show only specific file types: All, Images, PDFs, Fonts, or Design Files.

Downloading Assets

Click on any asset to view details, then click Download to get the original file. Downloads use signed URLs that expire after 1 hour.

Collections

Collections help you organize assets into logical groups (like folders).

Creating a Collection

  1. From the Dashboard sidebar, click New Collection
  2. Enter a name and optional description
  3. Click Create

Adding Assets to Collections

  • When uploading: Select a collection from the dropdown
  • After upload: Open asset details → Change Collection
  • Bulk: Select multiple assets → Move to Collection

Pipelines

Pipelines are the core of Synergy. They let you transform data between systems without writing code.

What Pipelines Do

  • Receive incoming API requests or webhook data
  • Parse JSON, XML, or JDF data
  • Transform field mappings and data structure
  • Forward to external APIs
  • Respond with transformed data

Creating a Pipeline

  1. Navigate to the Pipelines page
  2. Click Create Pipeline
  3. Enter a name and description
  4. Click Open Builder to use the visual editor

Visual Pipeline Builder

The visual builder uses a drag-and-drop interface:

Input Blocks

Receive incoming data (HTTP, webhook)

Parse Blocks

Parse JSON, XML, or JDF data

Transform Blocks

Map fields, convert formats

Forward Blocks

Send data to external APIs

Flow Control Blocks

Delay, pause, and wait for triggers

Flow Control Blocks Beta

Control pipeline execution flow with pausing and waiting capabilities:

Block Description Use Case
Delay Wait for a specified duration (max 5 minutes) Rate limiting, staged processing
Pause Pause execution for manual continuation Approval workflows, human review steps
Wait for Trigger Wait for external webhook/event Multi-system workflows, async callbacks

Resuming Paused Executions

Paused executions can be resumed via API:

POST /api/v1/executions/{execution_id}/resume
{
  "resume_data": { "approved_by": "user@example.com" }
}

Triggering Waiting Executions

Send external triggers to waiting pipelines:

POST /api/v1/executions/trigger/{trigger_key}
{
  "data": { "approved": true, "notes": "Ready to proceed" }
}
Beta Feature: Flow control blocks require admin-enabled access. Contact your workspace admin to enable these features.

Pipeline Endpoints

Each pipeline gets a unique endpoint URL:

POST https://printwithsynergy.com/api/v1/pipelines/{pipeline_id}/execute

Testing Pipelines

Use the Test button in the pipeline builder to send sample data and see the transformation results.

Node Types Reference

Complete reference of all available pipeline nodes and their configuration options.

Input Nodes

Node Description Config Options
http_request Receive incoming HTTP requests method, headers, query params
webhook Receive webhook payloads from external services secret (for HMAC verification)
schedule Triggered by scheduled automation cron_expression, timezone
manual Manual execution trigger input_schema

Parse Nodes

Node Description Config Options
parse_json Parse JSON string into object strict_mode, path
parse_xml Parse XML string into object namespace_aware, trim_text
parse_jdf Parse JDF/JMF print industry format version (1.5 default), validate

Transform Nodes

Node Description Config Options
map_fields Map fields from source to destination mappings array with from/to paths
validate Validate data against rules schema, required_fields, on_fail
set_defaults Set default values for missing fields defaults object
transform Apply custom JavaScript transformations expression, template
filter_fields Include or exclude specific fields include[], exclude[]
merge_data Merge multiple data sources sources[], strategy (shallow/deep)

Forward Nodes

Node Description Config Options
forward_rest Send request to REST API url, method, headers, body_template
forward_soap Send request to SOAP service wsdl_url, operation, envelope_template
forward_jdf Send JDF/JMF to print system endpoint_url, message_type
use_connector Use saved connection credentials connector_id, path, method

Storage Nodes

Node Description Config Options
store_file Upload file to R2 storage collection_id, tags[], extract_metadata
extract_metadata Extract metadata from file include_exif, include_fonts
tag_asset Add tags to stored asset tags[], asset_id_path
retrieve_asset Beta Fetch asset from storage by ID asset_id, include_url

Generate Nodes

Node Description Config Options
to_json Convert data to JSON string pretty_print, indent
to_xml Convert data to XML string root_element, declaration
to_jdf Convert data to JDF format template_id, version

Cache Nodes

Node Description Config Options
check_cache Check if response is cached key_pattern, on_miss (continue/skip)
store_cache Store response in cache key_pattern, ttl_seconds
invalidate_cache Clear cached data key_pattern, clear_all

Output Nodes

Node Description Config Options
return_response Return HTTP response status_code, headers, body_template
send_notification Send webhook/email notification type (webhook/email), recipient, template

File Handling Nodes Beta

Node Description Config Options
file_extract Extract files from multipart request field_name, index, required
file_passthrough Split flow: file one path, data another file_output, data_output
file_router Route based on file properties routes[] with conditions
file_info Get file info without storing include_hash, include_preview
condition If/else branching based on expression expression, true_path, false_path

Flow Control Nodes Beta

Node Description Config Options
delay Wait for specified duration duration_seconds (max 300), duration_ms
pause Pause for manual continuation reason, resume_message
wait_for_trigger Wait for external trigger trigger_type, trigger_key, timeout_seconds, timeout_action
Beta Nodes: Some nodes are in beta and require admin approval. Check your workspace settings for available nodes.

Sandbox Testing

The Pipeline Sandbox lets you test pipelines end-to-end before deploying to production.

Testing Modes

Mode Description Use Case
Sandbox Uses echo endpoint, no external calls Test transformations without side effects
Production Makes real API calls to target systems End-to-end integration testing

Using the Sandbox

  1. Navigate to Sandbox in the dashboard
  2. Select a pipeline from the dropdown
  3. Choose Sandbox or Production mode
  4. Enter test payload (JSON, XML, or raw data)
  5. Add optional headers and query parameters
  6. Click Execute to run the test

Understanding Results

After execution, you'll see:

  • Status: Success, failed, or timeout
  • Duration: Total execution time in milliseconds
  • Output: Transformed response data
  • Trace: Step-by-step execution log showing each node

API Testing

Test pipelines programmatically:

curl -X POST "https://printwithsynergy.com/api/v1/sandbox/execute" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "pipeline_id": "pipe_abc123",
    "mode": "sandbox",
    "payload": { "order_id": "12345" }
  }'

Echo Endpoint

In sandbox mode, the /sandbox/echo endpoint returns your payload back. Useful for testing transformations:

curl -X POST "https://printwithsynergy.com/api/v1/sandbox/echo" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "test": "data" }'
Tip: Always test in Sandbox mode first to verify your transformations before sending data to production systems.

Scheduled Automation

Automate pipeline execution with cron schedules, time intervals, or collection watchers that trigger when new files arrive.

Trigger Types

Type Description Use Case
Cron Schedule Standard 5-field cron expression Daily batch processing at 2 AM, weekly reports
Interval Run every X minutes (min: 5) Polling external APIs, status checks
Collection Watch Trigger when new files arrive Process uploads automatically, hot folders

Creating a Schedule

  1. Navigate to Schedules from the sidebar
  2. Click New Schedule
  3. Select a pipeline to run
  4. Choose a trigger type (Cron, Interval, or Collection Watch)
  5. Configure the trigger settings
  6. Click Create Schedule

Cron Expression Examples

Expression Description
0 * * * * Every hour at minute 0
0 2 * * * Daily at 2:00 AM
0 9 * * 1 Every Monday at 9:00 AM
0 0 1 * * First day of each month at midnight
*/15 * * * * Every 15 minutes

Collection Watchers

Collection watchers monitor a specific collection for new files. When new assets are uploaded to the watched collection, the schedule triggers and processes each new file through the pipeline.

  • Watchers check for new files every 5 minutes
  • New files are processed in batch
  • Each asset is passed to the pipeline as input data
  • Run history shows processed and failed asset counts

Managing Schedules

  • Pause/Resume: Temporarily disable a schedule without deleting it
  • Run Now: Manually trigger a schedule immediately
  • View Runs: See execution history with status, timing, and asset counts
Schedules run in the background. You'll receive webhook notifications for schedule.triggered, schedule.completed, and schedule.failed events.

Connections

Connections store credentials for external services your pipelines connect to.

Connection Types

Category Examples Auth Methods
Generic Any REST API API Key, Bearer Token, Basic Auth
Cloud Storage S3, Azure Blob, Google Cloud Access Keys, Service Account
Print PrintOS, Enfocus Switch API Key, OAuth
Notifications Slack, Email, Webhooks Webhook URL, API Key

Creating a Connection

  1. Navigate to Connections
  2. Click Add Connection
  3. Select the connection type
  4. Enter the connection name and credentials
  5. Click Test Connection to verify
  6. Click Save
Credentials are encrypted at rest and never exposed after creation.

Webhooks

Receive real-time notifications when events occur in your workspace. Webhooks push data to your systems automatically.

Available Events

Event Description
asset.uploaded A new asset has been uploaded
asset.processed Asset metadata extraction completed
asset.deleted An asset has been deleted
pipeline.started Pipeline execution has begun
pipeline.completed Pipeline execution succeeded
pipeline.failed Pipeline execution encountered an error

Creating a Webhook

  1. Navigate to Webhooks
  2. Click Create Webhook
  3. Enter a name and your endpoint URL
  4. Select which events to subscribe to
  5. Optionally add a secret for HMAC verification
  6. Click Save

Payload Verification

Secure your webhooks with HMAC-SHA256 verification. When you provide a secret, Synergy includes a signature header:

X-Synergy-Signature: sha256=abc123...

Verify the signature in your code by computing HMAC-SHA256 of the raw request body with your secret.

Delivery History

View delivery attempts, response codes, and retry failed deliveries from the webhook detail page. Failed deliveries are automatically retried up to 3 times with exponential backoff.

Audit Logs

Track all actions in your workspace with comprehensive audit logging. Essential for compliance, debugging, and security monitoring.

Tracked Actions

  • Asset Actions: Upload, download, delete, metadata changes
  • Pipeline Actions: Create, update, delete, execute
  • User Actions: Login, logout, password changes, API key creation
  • Settings Changes: Profile updates, connection modifications

Viewing Audit Logs

  1. Navigate to Audit Log
  2. Use filters to narrow by date range, action type, or status
  3. Click any entry to view full details including IP address and user agent

Exporting Logs

Export your audit logs as JSON or CSV for compliance reporting or external analysis. Click Export and select your preferred format.

Log Details

Each log entry includes:

  • Timestamp and action type
  • User who performed the action
  • Resource affected (asset, pipeline, etc.)
  • IP address and user agent
  • Success/failure status
  • Additional context and metadata

Part Extraction

Extract components from complex files automatically. Get individual pages from PDFs, layers from PSDs, or embedded images from documents.

Supported Extractions

Source File Extractable Parts Output Format
PDF Individual pages, embedded images PNG, JPG
PSD Individual layers, flattened composite PNG
AI/EPS Rasterized preview PNG
Multi-page TIFF Individual frames PNG, JPG

Using Part Extraction

  1. Open an asset detail view by clicking on any compatible file
  2. Click the Extract Parts button
  3. Select which parts to extract (pages, layers, images)
  4. Extracted parts become new assets in your workspace

API Access

Extract parts programmatically:

curl -X POST "https://printwithsynergy.com/api/v1/assets/:id/extract" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "type": "pages", "pages": [1, 2, 3] }'

Print Metadata

Synergy automatically extracts print-relevant metadata from uploaded files:

  • DPI/Resolution: Dots per inch for print quality verification
  • Color Space: CMYK, RGB, Grayscale, or LAB detection
  • ICC Profiles: Embedded color profiles (sRGB, Adobe RGB, FOGRA, etc.)
  • Bleed/Trim: Bleed box and trim box detection for PDFs
  • Font Embedding: Lists all fonts and whether they're embedded
  • Transparency: Detects if the file contains transparency
  • Spot Colors: Identifies Pantone and other spot colors
Tip: Use the Search API to filter assets by print metadata, e.g., find all CMYK images with 300+ DPI.

Sharing

Share assets and collections with external users via secure, time-limited links.

Creating Share Links

  1. Select an asset or collection
  2. Click the Share button
  3. Set expiration time (optional)
  4. Optionally add password protection
  5. Copy and send the generated link

Share Options

Option Description
Expiration Link expires after set time (1 hour to 30 days)
Password Require password to access shared content
Download Allow or prevent file downloads
View Count Limit number of times link can be accessed

Managing Shares

View and revoke active shares from the asset or collection detail page. Each share shows access count and remaining time.

Desktop Agents Beta

Install a lightweight agent on your desktop to automatically sync files from hot folders to Synergy.

How It Works

  1. Download and install the Synergy Agent
  2. Authenticate with your API key
  3. Configure one or more watch folders
  4. Files dropped into folders are automatically uploaded

Agent Features

  • Hot Folder Monitoring: Watch local directories for new files
  • Auto-Upload: Automatically upload to specified collection
  • Trigger Pipelines: Execute a pipeline on upload
  • Move/Delete: Optionally move or delete files after upload
  • Filtering: Filter by file extension or pattern

Configuration

Configure watches via the dashboard or API:

curl -X POST "https://printwithsynergy.com/api/v1/agents/:agent_id/watches" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "watch_path": "/Users/prepress/hot-folder",
    "collection_id": "col_abc123",
    "pipeline_id": "pipe_xyz789",
    "file_patterns": ["*.pdf", "*.ai"]
  }'
Beta Feature: Desktop Agents require beta access. Contact support to enable.

Cloud Watches Beta

Monitor cloud storage providers and automatically import new files into Synergy.

Supported Providers

Provider Watch Type Status
Amazon S3 Bucket notifications, polling Available
Google Drive Push notifications Available
Dropbox Webhooks Available
Azure Blob Event Grid Coming Soon

Setting Up Cloud Watches

  1. Navigate to Settings → Integrations
  2. Click Add Cloud Watch
  3. Select your cloud provider and authenticate
  4. Choose the folder/bucket to monitor
  5. Select destination collection and optional pipeline

Watch Options

  • Path Filter: Only import from specific paths
  • File Filter: Filter by extension or pattern
  • Auto-Delete: Remove source file after import
  • Polling Interval: How often to check (for non-event sources)

JMF Integration Beta

Connect to print equipment using Job Messaging Format (JMF) for real-time job status and callbacks.

What is JMF?

JMF is the CIP4 standard for communication between print workflow systems. Synergy can both send and receive JMF messages, enabling:

  • Job Submission: Send jobs to JDF-compatible devices
  • Status Updates: Receive real-time job status callbacks
  • Queue Management: Query device queues and job lists
  • Error Handling: Receive and process error notifications

JMF Subscriptions

Subscribe to JMF events from print devices:

curl -X POST "https://printwithsynergy.com/api/v1/jmf/subscriptions" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "device_url": "http://press.example.com:8080/jmf",
    "events": ["Status", "Notification"],
    "pipeline_id": "pipe_xyz789"
  }'

Supported JMF Message Types

Message Type Direction Description
SubmitQueueEntry Outbound Submit job to device queue
Status Both Query or receive device status
Notification Inbound Event notifications from devices
KnownDevices Outbound Discover available devices
QueueStatus Outbound Query queue entries and status

Processing JMF Callbacks

When devices send JMF messages, Synergy can trigger pipelines to process them:

  1. JMF message arrives at Synergy callback URL
  2. Message is parsed and validated
  3. Associated pipeline is triggered with message data
  4. Pipeline can update status, send notifications, etc.
Print Industry: JMF integration enables seamless connections with RIPs, presses, and workflow systems that support CIP4 standards.

Profile Settings

Manage your account information from the Settings page.

Personal Information

  • Name: Update your display name
  • Email: Contact support to change your email

Preferences

  • Dark Mode: Toggle between light and dark themes
  • Email Notifications: Enable/disable email alerts

Security

  • Change Password: Update your password (requires current password)
  • Active Sessions: View and revoke active login sessions

API Keys

API keys authenticate your applications with Synergy.

Creating an API Key

  1. Go to Settings → API Keys
  2. Click Create API Key
  3. Enter a name (e.g., "Production Server")
  4. Copy the key immediately - it won't be shown again
Important: API keys are only shown once at creation. Store them securely!

Managing API Keys

  • View key prefix and last used date
  • Delete keys that are no longer needed
  • Create separate keys for different environments

Billing

Synergy uses usage-based pricing. Pay only for what you use.

Pricing Model

Resource Free Tier Price
Platform Fee $49/month
Storage 10 GB $0.05/GB/month
API Calls 5,000/month $0.50 per 1,000
Pipeline Runs 500/month $0.01 per run
File Processing 250/month $0.02 per file

Free Trial

New accounts get a 14-day free trial with full platform access. No credit card required to start.

Usage Dashboard

Track your usage in real-time from the Billing section of Settings:

  • Storage Used: Total GB across all assets
  • API Calls: Requests this billing period
  • Pipeline Runs: Executions this period
  • File Processing: Files processed this period
  • Estimated Bill: Projected cost for current period

Managing Your Subscription

Click Manage Subscription to:

  • Update payment method
  • View and download invoices
  • Cancel subscription
  • View billing history
Usage Alerts: We'll notify you when approaching free tier limits so there are no billing surprises.

API Overview

The Synergy API is RESTful and returns JSON responses.

Base URL

https://printwithsynergy.com/api/v1

Authentication

Include your API key in the Authorization header:

curl -H "Authorization: Bearer syn_your_key" \
     https://printwithsynergy.com/api/v1/assets

Response Format

All responses follow this structure:

{
  "success": true,
  "data": { ... },
  "meta": {
    "page": 1,
    "limit": 20,
    "total": 100
  }
}

Error Responses

{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid file type"
  }
}

Rate Limits

Global rate limit: 500 requests per minute per API key.

API Endpoints

Assets

Method Endpoint Description
GET /assets List all assets
GET /assets/:id Get asset details
POST /assets/upload Upload a file
DELETE /assets/:id Delete an asset
GET /assets/:id/download Get download URL

Pipelines

Method Endpoint Description
GET /pipelines List all pipelines
GET /pipelines/:id Get pipeline details
POST /pipelines Create a pipeline
PUT /pipelines/:id Update a pipeline
POST /pipelines/:id/execute Execute a pipeline

Collections

Method Endpoint Description
GET /collections List all collections
POST /collections Create a collection
PUT /collections/:id Update a collection
DELETE /collections/:id Delete a collection

Webhooks

Method Endpoint Description
GET /webhooks List all webhooks
POST /webhooks Create a webhook
PATCH /webhooks/:id Update a webhook
DELETE /webhooks/:id Delete a webhook

Assets API

Complete examples for managing assets via the API.

List Assets

Get a paginated list of all assets in your workspace.

curl -X GET "https://printwithsynergy.com/api/v1/assets?page=1&limit=20" \
  -H "Authorization: Bearer syn_your_api_key"

Query Parameters:

  • page - Page number (default: 1)
  • limit - Items per page (default: 20, max: 100)
  • type - Filter by type: image, pdf, font, design
  • collection_id - Filter by collection
// Response
{
  "success": true,
  "data": [
    {
      "id": "asset_abc123",
      "filename": "brochure.pdf",
      "mime_type": "application/pdf",
      "file_size": 2457600,
      "status": "ready",
      "metadata": {
        "page_count": 4,
        "dimensions": { "width": 612, "height": 792 },
        "color_space": "CMYK"
      },
      "created_at": "2026-01-02T15:30:00Z"
    }
  ],
  "meta": { "page": 1, "limit": 20, "total": 45 }
}

Get Asset Details

Retrieve full details and metadata for a specific asset.

curl -X GET "https://printwithsynergy.com/api/v1/assets/asset_abc123" \
  -H "Authorization: Bearer syn_your_api_key"
// Response
{
  "success": true,
  "data": {
    "id": "asset_abc123",
    "filename": "product-photo.jpg",
    "original_filename": "IMG_1234.jpg",
    "mime_type": "image/jpeg",
    "file_size": 3145728,
    "status": "ready",
    "metadata": {
      "width": 4000,
      "height": 3000,
      "dpi": 300,
      "color_space": "RGB",
      "has_transparency": false,
      "icc_profile": "sRGB"
    },
    "collection_id": "col_xyz789",
    "tags": ["product", "hero"],
    "created_at": "2026-01-02T15:30:00Z",
    "updated_at": "2026-01-02T15:30:05Z"
  }
}

Upload Asset

Upload a file to your workspace. Use multipart/form-data.

curl -X POST "https://printwithsynergy.com/api/v1/assets/upload" \
  -H "Authorization: Bearer syn_your_api_key" \
  -F "file=@/path/to/brochure.pdf" \
  -F "collection_id=col_xyz789" \
  -F "tags=marketing,print"

Form Fields:

  • file - The file to upload (required)
  • collection_id - Optional collection to add to
  • tags - Comma-separated tags
// Response
{
  "success": true,
  "data": {
    "id": "asset_new456",
    "filename": "brochure.pdf",
    "status": "processing",
    "message": "Asset uploaded, processing metadata..."
  }
}

Download Asset

Get a signed download URL for an asset (valid for 1 hour).

curl -X GET "https://printwithsynergy.com/api/v1/assets/asset_abc123/download" \
  -H "Authorization: Bearer syn_your_api_key"
// Response
{
  "success": true,
  "data": {
    "url": "https://storage.printwithsynergy.com/...",
    "expires_at": "2026-01-02T16:30:00Z"
  }
}

Delete Asset

Permanently delete an asset. This cannot be undone.

curl -X DELETE "https://printwithsynergy.com/api/v1/assets/asset_abc123" \
  -H "Authorization: Bearer syn_your_api_key"
// Response
{
  "success": true,
  "data": { "message": "Asset deleted successfully" }
}

Pipelines API

Create and execute data transformation pipelines.

List Pipelines

curl -X GET "https://printwithsynergy.com/api/v1/pipelines" \
  -H "Authorization: Bearer syn_your_api_key"
// Response
{
  "success": true,
  "data": [
    {
      "id": "pipe_abc123",
      "name": "Order to JDF",
      "description": "Convert e-commerce orders to JDF format",
      "status": "active",
      "execution_count": 1542,
      "last_executed_at": "2026-01-02T15:00:00Z",
      "created_at": "2025-12-01T10:00:00Z"
    }
  ]
}

Create Pipeline

Create a new pipeline with blocks configuration.

curl -X POST "https://printwithsynergy.com/api/v1/pipelines" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Order Processor",
    "description": "Process incoming orders",
    "blocks": [
      { "type": "input", "config": { "format": "json" } },
      { "type": "transform", "config": { "mapping": {...} } },
      { "type": "output", "config": { "format": "xml" } }
    ]
  }'

Execute Pipeline

Run a pipeline with input data and get transformed output.

curl -X POST "https://printwithsynergy.com/api/v1/pipelines/pipe_abc123/execute" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "order_id": "ORD-12345",
    "customer": "Acme Corp",
    "items": [
      { "sku": "BRC-001", "quantity": 500 }
    ]
  }'
// Response (transformed to JDF)
{
  "success": true,
  "data": {
    "execution_id": "exec_xyz789",
    "status": "completed",
    "output": "<JDF...>...</JDF>",
    "duration_ms": 45
  }
}

Pipeline Block Types

Block Type Purpose Config Options
input Receive incoming data format: json, xml, jdf
parse Parse string data format, encoding
transform Map and transform fields mapping, expressions
validate Validate data schema schema, strict mode
forward Send to external API connection_id, method, path
cache Cache responses ttl_seconds, key_pattern
output Return response format, template

Executions API

Track, manage, and control pipeline executions.

List Executions

curl -X GET "https://printwithsynergy.com/api/v1/executions?pipeline_id=pipe_abc123&limit=20" \
  -H "Authorization: Bearer syn_your_api_key"

Query Parameters:

  • pipeline_id - Filter by pipeline
  • status - Filter by status (pending, running, completed, failed, paused)
  • limit, offset - Pagination

Get Execution Details

curl -X GET "https://printwithsynergy.com/api/v1/executions/exec_xyz789" \
  -H "Authorization: Bearer syn_your_api_key"
// Response
{
  "success": true,
  "data": {
    "id": "exec_xyz789",
    "pipeline_id": "pipe_abc123",
    "status": "completed",
    "input": { "order_id": "12345" },
    "output": { "jdf": "..." },
    "trace": [
      { "block_id": "input_1", "status": "completed", "duration_ms": 2 },
      { "block_id": "transform_1", "status": "completed", "duration_ms": 15 },
      { "block_id": "output_1", "status": "completed", "duration_ms": 3 }
    ],
    "started_at": "2026-01-02T15:00:00Z",
    "completed_at": "2026-01-02T15:00:00Z",
    "duration_ms": 20
  }
}

Retry Failed Execution

Retry a failed execution with the same input:

curl -X POST "https://printwithsynergy.com/api/v1/executions/exec_xyz789/retry" \
  -H "Authorization: Bearer syn_your_api_key"

Resume Paused Execution

Resume an execution that was paused by a pause node:

curl -X POST "https://printwithsynergy.com/api/v1/executions/exec_xyz789/resume" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "resume_data": { "approved_by": "user@example.com" } }'

The resume_data is merged into the execution context and available to subsequent nodes.

Trigger Waiting Execution

Send data to an execution waiting on a wait_for_trigger node:

curl -X POST "https://printwithsynergy.com/api/v1/executions/trigger/trg_abc123xyz" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "data": { "approved": true, "notes": "Ready to print" } }'

The trigger_key is returned when the execution reaches the wait_for_trigger node. Share this key with external systems to continue the workflow.

Execution Statuses

Status Description
pending Queued, waiting to start
running Currently executing
completed Finished successfully
failed Encountered an error
paused Waiting for resume or trigger
timeout Exceeded maximum execution time

Collections API

Organize assets into collections.

List Collections

curl -X GET "https://printwithsynergy.com/api/v1/collections" \
  -H "Authorization: Bearer syn_your_api_key"
// Response
{
  "success": true,
  "data": [
    {
      "id": "col_xyz789",
      "name": "Marketing Materials",
      "description": "Brochures and flyers",
      "asset_count": 24,
      "created_at": "2025-12-15T09:00:00Z"
    }
  ]
}

Create Collection

curl -X POST "https://printwithsynergy.com/api/v1/collections" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Q1 Campaign", "description": "Assets for Q1" }'

Get Collection Assets

curl -X GET "https://printwithsynergy.com/api/v1/collections/col_xyz789/assets" \
  -H "Authorization: Bearer syn_your_api_key"

Add Asset to Collection

curl -X PUT "https://printwithsynergy.com/api/v1/assets/asset_abc123" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "collection_id": "col_xyz789" }'

Connections API

Manage external service connections for use in pipelines.

List Connections

curl -X GET "https://printwithsynergy.com/api/v1/connectors" \
  -H "Authorization: Bearer syn_your_api_key"
// Response
{
  "success": true,
  "data": [
    {
      "id": "conn_abc123",
      "name": "Production MIS",
      "type": "generic_rest",
      "category": "print",
      "base_url": "https://api.example-mis.com",
      "auth_type": "bearer",
      "status": "active",
      "last_used_at": "2026-01-02T14:00:00Z"
    }
  ]
}

Create Connection

curl -X POST "https://printwithsynergy.com/api/v1/connectors" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Slack Notifications",
    "type": "webhook",
    "category": "notifications",
    "config": {
      "webhook_url": "https://hooks.slack.com/..."
    }
  }'

Test Connection

curl -X POST "https://printwithsynergy.com/api/v1/connectors/conn_abc123/test" \
  -H "Authorization: Bearer syn_your_api_key"

Webhooks API

Manage webhook subscriptions programmatically.

List Webhooks

curl -X GET "https://printwithsynergy.com/api/v1/webhooks" \
  -H "Authorization: Bearer syn_your_api_key"
// Response
{
  "success": true,
  "data": [
    {
      "id": "wh_abc123",
      "name": "Order Notifications",
      "url": "https://your-server.com/webhooks/synergy",
      "events": ["asset.uploaded", "pipeline.completed"],
      "status": "active",
      "created_at": "2026-01-02T10:00:00Z"
    }
  ]
}

Create Webhook

curl -X POST "https://printwithsynergy.com/api/v1/webhooks" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Asset Notifications",
    "url": "https://your-server.com/webhooks",
    "events": ["asset.uploaded", "asset.processed"],
    "secret": "your-hmac-secret"
  }'

Update Webhook

curl -X PATCH "https://printwithsynergy.com/api/v1/webhooks/wh_abc123" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "status": "inactive" }'

Delete Webhook

curl -X DELETE "https://printwithsynergy.com/api/v1/webhooks/wh_abc123" \
  -H "Authorization: Bearer syn_your_api_key"

Webhook Payload Format

All webhook payloads follow this structure:

{
  "id": "evt_xyz789",
  "event": "asset.uploaded",
  "created_at": "2026-01-02T15:30:00Z",
  "data": {
    "asset": {
      "id": "asset_abc123",
      "filename": "brochure.pdf",
      "mime_type": "application/pdf",
      "file_size": 2457600
    }
  }
}

Schedules API

Manage pipeline schedules programmatically.

Create Schedule

curl -X POST "https://printwithsynergy.com/api/v1/pipelines/:pipelineId/schedules" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Daily Order Sync",
    "trigger_type": "cron",
    "cron_expression": "0 2 * * *",
    "timezone": "America/New_York"
  }'

List All Schedules

curl -X GET "https://printwithsynergy.com/api/v1/schedules" \
  -H "Authorization: Bearer syn_your_api_key"

Trigger Types

When creating a schedule, set the appropriate fields for your trigger type:

trigger_type Required Fields
cron cron_expression, timezone (optional, default UTC)
interval interval_minutes (min: 5)
collection_watch watch_collection_id

Pause Schedule

curl -X POST "https://printwithsynergy.com/api/v1/schedules/:id/pause" \
  -H "Authorization: Bearer syn_your_api_key"

Resume Schedule

curl -X POST "https://printwithsynergy.com/api/v1/schedules/:id/resume" \
  -H "Authorization: Bearer syn_your_api_key"

Manual Trigger

curl -X POST "https://printwithsynergy.com/api/v1/schedules/:id/trigger" \
  -H "Authorization: Bearer syn_your_api_key"

Get Schedule Runs

curl -X GET "https://printwithsynergy.com/api/v1/schedules/:id/runs?limit=20" \
  -H "Authorization: Bearer syn_your_api_key"
// Response
{
  "success": true,
  "data": {
    "runs": [
      {
        "id": "run_abc123",
        "status": "completed",
        "scheduled_for": "2026-01-02T02:00:00Z",
        "started_at": "2026-01-02T02:00:01Z",
        "completed_at": "2026-01-02T02:00:45Z",
        "assets_processed": 15,
        "assets_failed": 0
      }
    ]
  }
}

Delete Schedule

curl -X DELETE "https://printwithsynergy.com/api/v1/schedules/:id" \
  -H "Authorization: Bearer syn_your_api_key"

Format Translation API

Translate between JSON, XML, JDF, and JMF formats automatically.

Detect Format

curl -X POST "https://printwithsynergy.com/api/v1/format/detect" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "content": "<?xml version=\"1.0\"?><root>...</root>" }'

Translate Content

curl -X POST "https://printwithsynergy.com/api/v1/format/translate" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "{ \"order_id\": \"12345\" }",
    "from_format": "json",
    "to_format": "jdf"
  }'

Supported Formats

Format Description
json Standard JSON format
xml Generic XML format
jdf Job Definition Format (CIP4 JDF 1.5)
jmf Job Messaging Format for print equipment

Get JDF Templates

curl -X GET "https://printwithsynergy.com/api/v1/format/templates/jdf" \
  -H "Authorization: Bearer syn_your_api_key"

Print Packages API

Create print-ready packages and compare PDFs.

Create Print Package

Bundle multiple assets into a ZIP with metadata, preflight reports, and font lists.

curl -X POST "https://printwithsynergy.com/api/v1/assets/export-package" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "asset_ids": ["asset_abc123", "asset_def456"],
    "name": "Job-12345-Package",
    "include_metadata_json": true,
    "include_metadata_csv": true,
    "include_preflight_report": true,
    "include_font_list": true
  }'

Compare PDFs

Visual diff comparison of two PDF files, page by page.

curl -X POST "https://printwithsynergy.com/api/v1/assets/compare" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "asset_id_a": "asset_abc123",
    "asset_id_b": "asset_xyz789"
  }'
// Response
{
  "success": true,
  "data": {
    "comparison_id": "cmp_abc123",
    "status": "completed",
    "pages_compared": 4,
    "differences_found": 2,
    "pages": [
      { "page": 1, "difference_percent": 0 },
      { "page": 2, "difference_percent": 5.2 },
      { "page": 3, "difference_percent": 0 },
      { "page": 4, "difference_percent": 12.8 }
    ]
  }
}

List Packages

curl -X GET "https://printwithsynergy.com/api/v1/packages" \
  -H "Authorization: Bearer syn_your_api_key"

Bulk Operations API

Perform operations on multiple assets at once.

Bulk Add Tags

curl -X POST "https://printwithsynergy.com/api/v1/assets/bulk/tag" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "asset_ids": ["asset_abc123", "asset_def456"],
    "tags": ["approved", "print-ready"]
  }'

Bulk Move to Collection

curl -X POST "https://printwithsynergy.com/api/v1/assets/bulk/move" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "asset_ids": ["asset_abc123", "asset_def456"],
    "collection_id": "col_xyz789"
  }'

Bulk Delete

curl -X POST "https://printwithsynergy.com/api/v1/assets/bulk/delete" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "asset_ids": ["asset_abc123", "asset_def456"] }'

Tags API

Manage tags for organizing and filtering assets.

List All Tags

curl -X GET "https://printwithsynergy.com/api/v1/tags" \
  -H "Authorization: Bearer syn_your_api_key"
// Response
{
  "success": true,
  "data": {
    "tags": [
      { "name": "approved", "count": 45 },
      { "name": "print-ready", "count": 32 },
      { "name": "hero", "count": 12 }
    ]
  }
}

Add Tags to Asset

curl -X POST "https://printwithsynergy.com/api/v1/assets/:id/tags" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "tags": ["approved", "featured"] }'

Remove Tags from Asset

curl -X DELETE "https://printwithsynergy.com/api/v1/assets/:id/tags" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "tags": ["draft"] }'

Rename Tag

curl -X PUT "https://printwithsynergy.com/api/v1/tags/rename" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "old_name": "draft", "new_name": "pending-review" }'

API Keys API

Programmatically manage API keys for your workspace.

List API Keys

curl -X GET "https://printwithsynergy.com/api/v1/api-keys" \
  -H "Authorization: Bearer syn_your_api_key"
// Response
{
  "success": true,
  "data": [
    {
      "id": "key_abc123",
      "name": "Production Server",
      "key_prefix": "syn_a1b2c3d4",
      "scopes": ["read", "write"],
      "last_used_at": "2026-01-02T15:30:00Z",
      "created_at": "2025-12-01T10:00:00Z"
    }
  ]
}

Create API Key

curl -X POST "https://printwithsynergy.com/api/v1/api-keys" \
  -H "Authorization: Bearer syn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "CI/CD Pipeline",
    "scopes": ["read", "write"]
  }'
// Response - KEY IS ONLY SHOWN ONCE
{
  "success": true,
  "data": {
    "apiKey": {
      "id": "key_xyz789",
      "name": "CI/CD Pipeline",
      "key_prefix": "syn_x9y8z7w6"
    },
    "key": "syn_x9y8z7w6e5f4g3h2i1j0..."
  }
}
Important: The full API key is only returned once at creation. Store it securely immediately.

Delete API Key

curl -X DELETE "https://printwithsynergy.com/api/v1/api-keys/key_abc123" \
  -H "Authorization: Bearer syn_your_api_key"

API Key Scopes

Scope Permissions
read List and get assets, pipelines, collections, etc.
write Create, update, delete resources
execute Execute pipelines (implied by write)
admin Manage workspace settings, users, billing

Error Codes

Common error codes and how to handle them.

Code HTTP Status Description
UNAUTHORIZED 401 Missing or invalid API key
FORBIDDEN 403 API key lacks required permissions
NOT_FOUND 404 Resource does not exist
VALIDATION_ERROR 400 Invalid request parameters
FILE_TOO_LARGE 413 File exceeds 500MB limit
UNSUPPORTED_TYPE 415 File type not supported
RATE_LIMITED 429 Too many requests, slow down
QUOTA_EXCEEDED 402 Plan limits exceeded
SERVER_ERROR 500 Internal error, contact support
Tip: Check the error.message field for specific details about what went wrong.

Code Examples

Example code in popular languages.

JavaScript / Node.js

const SYNERGY_API_KEY = process.env.SYNERGY_API_KEY;
const BASE_URL = 'https://printwithsynergy.com/api/v1';

// List assets
async function listAssets() {
  const response = await fetch(`${BASE_URL}/assets`, {
    headers: {
      'Authorization': `Bearer ${SYNERGY_API_KEY}`
    }
  });
  return response.json();
}

// Upload a file
async function uploadFile(file) {
  const formData = new FormData();
  formData.append('file', file);
  
  const response = await fetch(`${BASE_URL}/assets/upload`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${SYNERGY_API_KEY}`
    },
    body: formData
  });
  return response.json();
}

// Execute a pipeline
async function executePipeline(pipelineId, data) {
  const response = await fetch(`${BASE_URL}/pipelines/${pipelineId}/execute`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${SYNERGY_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(data)
  });
  return response.json();
}

Python

import os
import requests

SYNERGY_API_KEY = os.environ.get('SYNERGY_API_KEY')
BASE_URL = 'https://printwithsynergy.com/api/v1'

headers = {'Authorization': f'Bearer {SYNERGY_API_KEY}'}

# List assets
def list_assets():
    response = requests.get(f'{BASE_URL}/assets', headers=headers)
    return response.json()

# Upload a file
def upload_file(filepath):
    with open(filepath, 'rb') as f:
        files = {'file': f}
        response = requests.post(
            f'{BASE_URL}/assets/upload',
            headers=headers,
            files=files
        )
    return response.json()

# Execute a pipeline
def execute_pipeline(pipeline_id, data):
    response = requests.post(
        f'{BASE_URL}/pipelines/{pipeline_id}/execute',
        headers={**headers, 'Content-Type': 'application/json'},
        json=data
    )
    return response.json()

PHP

<?php
$apiKey = getenv('SYNERGY_API_KEY');
$baseUrl = 'https://printwithsynergy.com/api/v1';

// List assets
function listAssets() {
    global $apiKey, $baseUrl;
    
    $ch = curl_init("$baseUrl/assets");
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Authorization: Bearer $apiKey"
    ]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    return json_decode($response, true);
}

// Upload a file
function uploadFile($filepath) {
    global $apiKey, $baseUrl;
    
    $ch = curl_init("$baseUrl/assets/upload");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Authorization: Bearer $apiKey"
    ]);
    curl_setopt($ch, CURLOPT_POSTFIELDS, [
        'file' => new CURLFile($filepath)
    ]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    return json_decode($response, true);
}

Need Help?

We're here to help you get the most out of Synergy.