Canvas REST API Documentation
Overview​
The Canvas REST API enables your organization to interact with Canvas programmatically. Use this API to register new accounts and build integration workflows between third-party applications.
This page documents the REST resources available in Canvas, including the HTTP response codes and example requests and responses.
Base URL:
DEV - https://canvastest.connectmyapps.com/api
PRD - https://canvas.connectmyapps.com/api
Authentication: API Key authentication (Public/Private key pairs)
Generate Your API Keys and IP restriction: https://canvas.connectmyapps.com/account/security/api-keys
You can send Canvas REST API requests from any server by default. If you want to restict access by IP addresses, then click edit on your api-keyes and enter your IP addresses to restriction list.
Content-Type:
application/json
Table of Contents​
- Getting Started
- Authentication
- API Metadata
- Application Management
- Workflow Templates
- Block Templates
- Account Management
- Registered Applications
- Workflow Management
- Workflow Execution
- Scheduler Management
- Webhook Management
- Vault Operations
- JavaScript Functions
- Remote API Calls
- Results & Logs
- Tag Management
- Error Handling
Getting Started​
Generate API Keys​
Before you can use the Canvas API, you need to generate API keys:
- Log in to your Canvas account
- Navigate to: https://canvas.connectmyapps.com/account/security/api-keys
- Click "Create secret key"
- Set IP restriction list, if it is needed
- Copy your Consumer and Secret Key and save it in secure store. Important: Store your secret key securely - it won't be shown again!
- Click Apply button
Authentication Headers​
All API requests require authentication headers:
SecretKey: {your-secret-key}
Consumer: {your-public-key}
If you have access to another accounts of your organization then you can manage it by ManagedAccountId header
ManagedAccountId: {managed-account-Id}
Call the endpoints from the (#account-management) section to retrieve a list of accounts you have access to.
Quick Start Example​
curl -X GET "https://<base-url>/api/Authenticate" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Authentication​
Authenticate​
Endpoint: GET /api/Authenticate
Description: Authenticates the current account using API keys and returns account information.
Request Example 1:
curl -X GET "https://<base-url>/api/Authenticate" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK:
{
"myAccount": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"email": "user@example.com",
"organizationId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organizationName": "Acme Corp",
"role": "User"
}
}
Request Example 2:
curl -X GET "https://<base-url>/api/Authenticate" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-H "ManagedAccountId: managed-account-Id"
Response 200 OK:
{
"myAccount": {
"id": "9c2866fa-4c48-44ea-878e-22a5b794e66e",
"email": "superPartner@example.com",
"organizationId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organizationName": "Acme Corp",
"role": "SuperPartner"
},
"managedAccount": {
"id": "8b7a5632-8941-4873-a3dc-3f962c88bcd4",
"email": "client@example.com",
"organizationId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organizationName": "Acme Corp",
"role": "User"
}
}
Notes:
myAccount: Your authenticated user accountmanagedAccount: The account you're currently managing (for partner/manager scenarios)- If you're not managing another account, only
myAccountis returned
Response 401 Unauthorized: Invalid or missing API keys
API Metadata​
GetMetaData​
Endpoint: GET /api/GetMetaData
Description: Returns metadata about all available API endpoints including routes, parameters, and response schemas.
Request Example:
curl -X GET "https://<base-url>/api/GetMetaData" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK: Array of endpoint metadata objects
Response Structure:
[
{
"name": "WorkflowTemplate",
"route": "/api/WorkflowTemplate/{id}",
"verb": "GET",
"description": "Retrieves workflow template details",
"authenticate": true,
"parameters": "id={guid}&isDraft={bool}",
"parametersSchema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"required": true
},
"isDraft": {
"type": "boolean",
"required": false
}
}
},
"requestBodySchema": { },
"requestBodyExample": { },
"responseSchema": { },
"responseExample": { },
"responseCodes": {
"200": "OK",
"404": "Not Found"
}
}
]
Metadata Fields:
name: Method nameroute: Full API route with path parametersverb: HTTP method (GET, POST, PUT, PATCH, DELETE)description: Human-readable descriptionauthenticate: Whether authentication is required (optional)parameters: Simple parameter string formatparam1={type}¶m2={type}(optional)parametersSchema: Detailed JSON schema for parameters (optional)requestBodySchema: JSON schema for request body (optional)requestBodyExample: Example request body (optional)responseSchema: JSON schema for response (optional)responseExample: Example response (optional)responseCodes: HTTP status codes with descriptions
Use Case: Dynamic API discovery and documentation generation
Describe​
Endpoint: GET /api/Describe?name={dtoName}
Description: Returns property descriptions for a specific DTO (Data Transfer Object).
Parameters:
name(query, required): DTO class name (e.g., "WorkflowApiDto")
Request Example:
curl -X GET "https://<base-url>/api/Describe?name=WorkflowApiDto" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK: Array of property definitions with types and descriptions
Response 404 Not Found: DTO name not found
GetSchema​
Endpoint: GET /api/GetSchema?name={dtoName}
Description: Returns JSON schema definition for a specific DTO.
Parameters:
name(query, required): DTO class name
Request Example:
curl -X GET "https://<base-url>/api/GetSchema?name=WorkflowApiDto" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK: JSON Schema object
Response 404 Not Found: DTO name not found
Use Case: Client-side validation, form generation, API contract verification
Application Management​
Applications (List)​
Endpoint: GET /api/Applications
Description: Retrieves all published applications available for registration.
Request Example:
curl -X GET "https://<base-url>/api/Applications" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK:
[
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"shortName": "salesforce",
"name": "Salesforce",
"tag": "CRM",
"description": "Customer relationship management platform",
"logoImage": "base64-encoded-image",
"credentialFields": [
{
"ShortName": "username",
"DisplayName": "Username",
"Type": "text",
"Required": true
},
{
"ShortName": "password",
"DisplayName": "Password",
"Type": "password",
"Required": true
}
],
"credentialsJson": {
"username": null,
"password": null
}
}
]
Use Case: Discover available applications before registering them
Applications (Search)​
Endpoint: POST /api/Applications
Description: Search applications with pagination and filtering.
Request Body:
{
"page": 0,
"size": 50,
"searchTerm": "salesforce",
"includeLogo": true
}
Request Example:
curl -X POST "https://<base-url>/api/Applications" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-H "Content-Type: application/json" \
-d '{
"page": 0,
"size": 50,
"searchTerm": "salesforce",
"includeLogo": false
}'
Response 200 OK:
{
"applications": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"shortName": "salesforce",
"name": "Salesforce",
"tag": "CRM",
"description": "Customer relationship management platform",
"logo": null
}
],
"total": 1
}
Parameters:
page: Page number (zero-based)size: Number of results per pagesearchTerm: Search across name and description (optional)includeLogo: Include base64-encoded logo (optional, default: false)
Response 400 Bad Request: Invalid request parameters
Workflow Templates​
WorkflowTemplates (List)​
Endpoint: GET /api/WorkflowTemplates?filterByHostedTemplates={bool}
Description: Retrieves all available workflow templates including published versions and drafts.
Parameters:
filterByHostedTemplates(optional): Filter by partner-hosted templates
Request Example:
curl -X GET "https://<base-url>/api/WorkflowTemplates" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK: Array of workflow template summary objects
[
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Sync Salesforce to Slack",
"description": "Automatically post Salesforce updates to Slack",
"version": "1.2.0",
"state": "Published",
"applications": ["salesforce", "slack"],
"variables": [
{
"shortName": "slackChannel",
"displayName": "Slack Channel",
"type": "string",
"required": true
}
]
},
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Custom Integration",
"description": "Draft template",
"version": null,
"state": "Draft"
}
]
Notes:
- Published templates have version numbers
- Draft templates have
state: "Draft"andversion: null - Templates include variable definitions for customization
WorkflowTemplate (Get Details)​
Endpoint: GET /api/WorkflowTemplate/{id}?isDraft={bool}
Description: Retrieves detailed information about a specific workflow template including complete block chain configuration.
Parameters:
id(path, required): Template GUIDisDraft(query, optional): Fetch draft version instead of published (default: false)
Request Example:
curl -X GET "https://<base-url>/api/WorkflowTemplate/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK: Complete workflow template details with block chain, variables, and configuration
Response 404 Not Found: Template not found or access denied
Block Templates​
BlockTemplates (List)​
Endpoint: GET /api/BlockTemplates?filterByHostedTemplates={bool}
Description: Retrieves all available block templates (function blocks) for custom workflow construction.
Parameters:
filterByHostedTemplates(optional): Filter by partner-hosted templates
Request Example:
curl -X GET "https://<base-url>/api/BlockTemplates" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK: Array of block template summary objects
Use Case: Build custom workflows by composing individual block templates
BlockTemplate (Get Details)​
Endpoint: GET /api/BlockTemplate/{id}?isDraft={bool}
Description: Retrieves detailed information about a specific block template.
Parameters:
id(path, required): Block template GUIDisDraft(query, optional): Fetch draft version (default: false)
Request Example:
curl -X GET "https://<base-url>/api/BlockTemplate/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK: Complete block template details with script, variables, and configuration
Response 404 Not Found: Block template not found or access denied
Account Management​
Accounts (List)​
Endpoint: GET /api/Accounts
Description: Retrieves all accounts accessible by the current user.
Authorization: Requires Manager role or higher
Request Example:
curl -X GET "https://<base-url>/api/Accounts" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK:
[
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"role": "User",
"accountState": "Active",
"organizationName": "Acme Corp",
"tags": ["tag1", "tag2"]
}
]
Response 403 Forbidden: User does not have Manager role
Accounts (Search)​
Endpoint: POST /api/Accounts
Description: Search accounts with advanced filtering and pagination.
Authorization: Requires Manager role or higher
Request Body:
{
"page": 0,
"size": 50,
"searchTerm": "john",
"accountState": ["Active", "Inactive", "Locked"],
"tags": ["tag1", "tag2"]
}
Request Example:
curl -X POST "https://<base-url>/api/Accounts" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-H "Content-Type: application/json" \
-d '{
"page": 0,
"size": 50,
"searchTerm": "john",
"accountState": ["Active"]
}'
Response 200 OK:
{
"accounts": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"email": "john.doe@example.com",
"firstName": "John",
"lastName": "Doe",
"role": "User",
"accountState": "Active",
"tags": ["customer"]
}
],
"total": 1
}
Parameters:
page: Page number (zero-based)size: Number of results per pagesearchTerm: Search by name or email (optional)accountState: Filter by account states (optional)tags: Filter by tags (optional)
Response 400 Bad Request: Invalid parameters
Response 403 Forbidden: Insufficient permissions
Account (Create)​
Endpoint: POST /api/Account
Description: Creates a new account in your organization.
Authorization: Requires DevPartner, SuperPartner, or Manager role
Request Body:
{
"email": "newuser@example.com",
"firstName": "Jane",
"lastName": "Smith",
"roleName": "User",
"countryKey": "US",
"activated": false
}
Request Example:
curl -X POST "https://<base-url>/api/Account" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-H "Content-Type: application/json" \
-d '{
"email": "newuser@example.com",
"firstName": "Jane",
"lastName": "Smith",
"roleName": "User",
"countryKey": "US",
"activated": false
}'
Response 200 OK: Returns new account GUID
"3fa85f64-5717-4562-b3fc-2c963f66afa6"
Parameters:
email: User email address (required, must be unique)firstName: User first name (required)lastName: User last name (required)roleName: User role -"User","DevPartner", or"SuperPartner"(required)countryKey: ISO country code (optional, inherits from your account if not provided)activated: Create as activated account (optional, default: false, requires special permission)
Account Activation:
activated: false: User receives activation emailactivated: true: Account ready immediately, API keys auto-generated (requires permission)
Response 400 Bad Request:
- Email already exists
- Invalid role specified
- Insufficient permissions to create activated accounts
- User role cannot create accounts
Response 403 Forbidden: Insufficient permissions
Registered Applications​
RegApplications (List)​
Endpoint: GET /api/RegApplications
Description: Retrieves all authenticated registered applications for the current account.
Response: Array of RegApplicationListApiDto objects
RegApplications (Search)​
Endpoint: POST /api/RegApplications
Description: Search registered applications with advanced filtering.
Request Body:
{
"page": 0,
"size": 50,
"searchTerm": "string",
"tags": ["tag1"],
"isFaulted": false,
"appIds": ["guid1", "guid2"]
}
Response Schema:
{
"regApplications": [],
"total": 100
}
RegApplication (Create)​
Endpoint: POST /api/RegApplication
Description: Registers a new application instance for the current account.
Request Body:
{
"applicationId": "guid",
"tagText": "My App Instance",
"credentialsJson": "{\"apiKey\":\"xxx\",\"secret\":\"yyy\"}"
}
Response:
- OAuth apps: Returns OAuth authorization URL
- Basic/API Key apps: Returns registered application GUID
RegApplication (Update)​
Endpoint: POST /api/RegApplication/{id}
Description: Updates an existing registered application.
Parameters:
id(path): Registered application GUID
Request Body:
{
"tagText": "Updated Name",
"credentialsJson": "{\"apiKey\":\"new-key\"}"
}
Response: OAuth URL (if OAuth app) or empty string
DeleteRegApplication​
Endpoint: GET /api/DeleteRegApplication/{id}
Description: Deletes a registered application.
Parameters:
id(path): Registered application GUID
Response: Boolean success indicator
Validation:
- Checks account ownership
- Prevents deletion if application is used in active workflows
- Returns detailed error with workflow IDs if deletion blocked
Workflow Management​
Workflows (List)​
Endpoint: GET /api/Workflows
Description: Retrieves all workflows (InDevelopment and Deployed).
Response: Array of WorkflowListApiDto objects
Workflows (Search)​
Endpoint: POST /api/Workflows
Description: Advanced workflow search with multiple filter criteria.
Request Body:
{
"page": 0,
"size": 50,
"searchTerm": "string",
"appIds": ["guid"],
"regAppIds": ["guid"],
"blockTemplateIds": ["guid"],
"workflowTemplateId": "guid",
"workflowState": ["InDevelopment", "Deployed"],
"tags": ["tag1"],
"isScheduled": true,
"isAutoRunPaused": false,
"isWebhookActive": true
}
Response Schema:
{
"workflows": [],
"total": 100
}
Filter Capabilities:
- Application usage
- Registered application usage
- Block template usage
- Based on workflow template
- Workflow state
- Scheduler status
- Autorun status
- Webhook status
- Tags
- Full-text search
Workflow (Get Details)​
Endpoint: GET /api/Workflow/{id}?runNumber={int}
Description: Retrieves complete workflow configuration and state.
Parameters:
id(path): Workflow GUIDrunNumber(query, optional): Specific run number to load historical state
Response: WorkflowApiDto containing:
- Workflow metadata
- Complete block configuration
- Variable values
- Application mappings
- Execution history (if runNumber specified)
Workflow (Create from Template)​
Endpoint: POST /api/Workflow
Description: Creates a new workflow instance from a template.
Request Body:
{
"workflowTemplateId": "guid",
"name": "My Workflow",
"description": "Workflow description",
"applications": {
"salesforce": "regAppGuid1",
"slack": "regAppGuid2"
},
"variables": {
"apiKey": {"value": "xxx"},
"domain": "example.com"
},
"unboundFromTemplate": false,
"chain": [
{
"uniqueBlockId": "guid",
"blockName": "Custom Name",
"script": "// custom script",
"dataSources": ["blockGuid1"],
"variables": {
"varName": {
"variableSource": "Value",
"value": "xxx"
}
}
}
]
}
Response: Workflow GUID
Variable Value Formats (both supported):
{"variableName": {"value": "actualValue"}}
{"variableName": "actualValue"}
UnboundFromTemplate:
- When
true: Disconnects workflow from template - Allows structural changes to blocks
- Sets
isCustomizedStructure = true - Marks all blocks as customized
Chain Customization:
- Modify block scripts
- Change data sources (inputs)
- Override block variables
- Link to workflow variables
Workflow (Update)​
Endpoint: POST /api/Workflow/{id}
Description: Updates an existing workflow configuration.
Parameters:
id(path): Workflow GUID
Request Body: Same structure as Create, but all fields optional:
{
"name": "Updated Name",
"description": "Updated description",
"applications": {
"salesforce": "newRegAppGuid"
},
"variables": {
"apiKey": "newValue"
},
"chain": [
{
"uniqueBlockId": "guid",
"variables": {
"varName": {
"variableSource": "Workflow",
"variableName": "workflowVar"
}
}
}
],
"unboundFromTemplate": false
}
Response: 200 OK
Restrictions:
- Cannot change block structure (dataSources) on template-based workflows unless unboundFromTemplate=true
- Cannot add undeclared variables
- Cannot modify blocks that don't exist
DeployWorkflow​
Endpoint: GET /api/DeployWorkflow/{id}
Description: Deploys a workflow from InDevelopment to Deployed state.
Parameters:
id(path): Workflow GUID
Response: Workflow GUID
ArchiveWorkflow​
Endpoint: GET /api/ArchiveWorkflow/{id}
Description: Archives a workflow (soft delete).
Parameters:
id(path): Workflow GUID
Response: Boolean success
DeleteWorkflow​
Endpoint: GET /api/DeleteWorkflow/{id}
Description: Permanently deletes a workflow.
Parameters:
id(path): Workflow GUID
Response: Boolean success
Warning: This is a hard delete operation. Consider using ArchiveWorkflow instead.
Workflow Execution​
RunWorkflow​
Endpoint: POST /api/RunWorkflow
Description: Executes a workflow immediately.
Request Body:
{
"workflowId": "guid",
"webhookId": "guid",
"runFromBlock": "block#",
"runTillBlock": "block#"
}
Response: "Workflow will now run" or error message
Parameters:
workflowId: Required. Workflow to executewebhookId: Optional. Rerun a specific webhook requestrunFromBlock: Optional. Start execution from specific block number (partial run)runTillBlock: Optional. Stop execution at specific block number (partial run)
Validation Errors:
- Workflow not found
- Workflow not deployed
- Missing required registered applications
- Invalid block IDs
Scheduler Management​
WorkflowScheduler​
Endpoint: POST /api/WorkflowScheduler
Description: Configures or updates workflow scheduler settings.
Request Body:
{
"workflowId": "guid",
"isScheduled": true,
"scheduleFrequency": "0 9 * * *"
}
Response: "Workflow Scheduler enabled" or "disabled"
Schedule Frequency Formats:
- Cron expression:
"0 9 * * *"(9 AM daily) - Named frequency:
"hourly","daily","weekly","monthly"
Cron Expression Examples:
"0 9 * * *" → Daily at 9:00 AM
"0 */2 * * *" → Every 2 hours
"0 0 * * 0" → Weekly on Sunday
"0 0 1 * *" → Monthly on 1st
Webhook Management​
WebhookSettings (Get)​
Endpoint: GET /api/WebhookSettings/{id}
Description: Retrieves webhook configuration for a workflow.
Parameters:
id(path): Workflow GUID
Response:
{
"isActive": true,
"ipRestriction": ["192.168.1.0/24"],
"urlParameters": "key=value",
"strictOrderProcessing": true,
"skipProcessingAfterErrors": 3,
"skipScript": "// validation script",
"isBatch": true,
"batchSize": 10,
"updateDateLastRun": true,
"modifyAccountId": "guid",
"modifyDateTimeUTC": "2024-01-01T00:00:00Z"
}
Returns: 204 No Content if webhook not configured
WebhookSettingsEnable​
Endpoint: POST /api/WebhookSettingsEnable/{id}
Description: Enables and configures webhook for a workflow.
Parameters:
id(path): Workflow GUID
Request Body:
{
"secret": "optional-custom-secret",
"ipRestriction": ["192.168.1.0/24"],
"urlParameters": "key=value",
"strictOrderProcessing": true,
"skipProcessingAfterErrors": 3,
"skipScript": "// custom validation",
"isBatch": true,
"batchSize": 10,
"updateDateLastRun": true
}
Response (First Time):
{
"url": "https://webhook.example.com/{workflowId}?key=value",
"secret": "generated-secret-or-custom",
"message": "Webhook settings are enabled. Please save the secret value as it will not be shown again"
}
Response (Updates):
{
"url": "https://webhook.example.com/{workflowId}?key=value"
}
Configuration Options:
- secret: HMAC secret for webhook validation (generated if not provided)
- ipRestriction: Array of allowed IP addresses/CIDR ranges
- urlParameters: Query string parameters appended to webhook URL
- strictOrderProcessing: FIFO queue processing (prevents parallel execution)
- skipProcessingAfterErrors: Number of consecutive errors before skipping request
- skipScript: JavaScript code to validate/filter webhook requests
- isBatch: Enable batch processing of multiple webhook requests
- batchSize: Number of requests to batch together
- updateDateLastRun: Update workflow's last run timestamp on webhook execution
WebhookSettingsDisable​
Endpoint: POST /api/WebhookSettingsDisable/{id}?disableWithCleanSettings={bool}
Description: Disables webhook for a workflow.
Parameters:
id(path): Workflow GUIDdisableWithCleanSettings(query): If true, deletes all webhook settings
Response: "Webhook settings are disabled" or "disabled and cleaned up"
GetWebhookQueue​
Endpoint: POST /api/GetWebhookQueue/{workflowId}
Description: Retrieves pending webhook requests in queue.
Parameters:
workflowId(path): Workflow GUID
Request Body:
{
"page": 0,
"size": 50,
"searchFrom": "2024-01-01T00:00:00Z",
"searchTo": "2024-12-31T23:59:59Z"
}
Response:
{
"items": [
{
"webhookId": "guid",
"status": "Pending",
"createDateTimeUTC": "2024-01-01T10:00:00Z",
"errorCounter": 0,
"nextScheduleDateTimeUTC": "2024-01-01T10:05:00Z",
"no": 1
}
],
"length": 100,
"isLast": false,
"workflowSettings": {
"isAutoRunPaused": false,
"isWebhookActive": true
}
}
Queue Statuses:
Pending: Waiting to be processedProcessing: Currently executingFailed: Execution failed (will retry)Skipped: Skipped due to error threshold
GetWebhookHistory​
Endpoint: POST /api/GetWebhookHistory/{workflowId}
Description: Retrieves processed webhook execution history.
Parameters: Same as GetWebhookQueue
Response: Similar structure with additional fields:
deleteFromQueueDateTimeUTC: When removed from queue- Historical status information
GetWebhook​
Endpoint: GET /api/GetWebhook/{webhookId}
Description: Retrieves specific webhook request details.
Parameters:
webhookId(path): Webhook request GUID
Response:
{
"id": "guid",
"webhookValue": {"payload": "data"},
"createDateTimeUTC": "2024-01-01T10:00:00Z",
"modifyDateTimeUTC": "2024-01-01T10:05:00Z",
"workflowId": "guid"
}
Returns: 204 No Content if not found
GetSandboxWebhookValue​
Endpoint: GET /api/GetSandboxWebhookValue/{id}
Description: Retrieves sandbox webhook test data.
Parameters:
id(path): Workflow GUID
Response: Webhook payload object or 204 No Content
Use Case: Testing webhook configuration before production
Vault Operations​
The Vault provides secure, encrypted storage for sensitive data at workflow and account levels.
MyVaultSet (Workflow-Level)​
Endpoint: POST /api/MyVaultSet/{workflowId}/{key}
Description: Stores a value in workflow-specific vault.
Parameters:
workflowId(path): Workflow GUIDkey(path): Vault key name
Request Body:
{
"jsonData": "sensitive-data"
}
Response: Success indicator
Scope: Data accessible only within the specific workflow
MyVaultGet (Workflow-Level)​
Endpoint: GET /api/MyVaultGet/{workflowId}/{key}
Description: Retrieves a value from workflow vault.
Parameters:
workflowId(path): Workflow GUIDkey(path): Vault key name
Response: Stored value
MyVaultSetGlobal (Account-Level)​
Endpoint: POST /api/MyVaultSetGlobal/{accountId}/{key}
Description: Stores a value in account-level vault.
Parameters:
accountId(path): Account GUIDkey(path): Vault key name
Request Body:
{
"jsonData": "sensitive-data"
}
Scope: Data accessible across all workflows for the account
MyVaultGetGlobal (Account-Level)​
Endpoint: GET /api/MyVaultGetGlobal/{accountId}/{key}
Description: Retrieves a value from account vault.
MyVaultRemove (Workflow-Level)​
Endpoint: GET /api/MyVaultRemove/{workflowId}/{key}
Description: Deletes a key from workflow vault.
MyVaultRemoveGlobal (Account-Level)​
Endpoint: GET /api/MyVaultRemoveGlobal/{accountId}/{key}
Description: Deletes a key from account vault.
MyVaultContains (Workflow-Level)​
Endpoint: GET /api/MyVaultContains/{workflowId}/{key}
Description: Checks if a key exists in workflow vault.
Response: Boolean
MyVaultContainsGlobal (Account-Level)​
Endpoint: GET /api/MyVaultContainsGlobal/{accountId}/{key}
Description: Checks if a key exists in account vault.
Response: Boolean
JavaScript Functions​
GetFunctions​
Endpoint: GET /api/GetFunctions
Description: Retrieves available JavaScript functions for use in workflows.
Response:
[
{
"id": "guid",
"name": "functionName",
"description": "Function description",
"category": "String Manipulation",
"package": "lodash",
"isAsync": true,
"arguments": {
"param1": {"type": "string"},
"param2": {"type": "number"}
},
"script": "// function implementation"
}
]
Use Case: Dynamic function library for custom block development
Remote API Calls​
These endpoints proxy API calls to registered applications.
ApiAuth​
Endpoint: GET /api/ApiAuth
Description: Authenticates with a registered application's API.
Headers: Requires registered application credentials
Response: Authentication token/response from target API
ApiAppVault​
Endpoint: GET /api/ApiAppVault
Description: Retrieves application-specific vault data.
Response: Vault contents for the specified application
ApiGet​
Endpoint: GET /api/ApiGet?url={appShortName}/{endpoint}&srv={baseUrl}
Description: Proxies a GET request to a registered application's API.
Parameters:
url: Format:{appShortName}/{apiEndpoint}srv: Optional base URL override
Example: /api/ApiGet?url=salesforce/accounts&srv=https://custom.salesforce.com
Response: API response from target application
ApiPost​
Endpoint: POST /api/ApiPost?url={appShortName}/{endpoint}&srv={baseUrl}
Description: Proxies a POST request to a registered application's API.
Request Body:
{
"jsonData": {"field": "value"}
}
ApiSend​
Endpoint: POST /api/ApiSend/{shortName}?newVersion={bool}
Description: Sends a custom API request to a registered application.
Parameters:
shortName(path): Application short namenewVersion(query): Use new response format (default: false)
Request Body:
{
"verb": "POST",
"requestUrl": "endpoint/path",
"baseUrl": "https://api.example.com",
"data": {"field": "value"},
"headers": {"Custom-Header": "value"},
"responseType": "Json",
"responseCodes": [200, 201]
}
Response Types:
Json: Parses response as JSONText: Returns as plain textBinary: Returns as base64
ApiProxyEmail​
Endpoint: POST /api/ApiProxyEmail
Description: Sends an email through Canvas email service. Supports HTML/plain text emails with optional attachments.
Request Body:
{
"subject": "Email Subject",
"to": ["recipient1@example.com", "recipient2@example.com"],
"cc": ["cc@example.com"],
"bcc": ["bcc@example.com"],
"body": "Email body content",
"bodyIsHtml": true,
"attachmentName": "document.pdf",
"attachment": "base64-encoded-content",
"attachmentEncoding": "base64",
"attachmentContentType": "application/pdf",
"toAccountEmail": false
}
Request Parameters:
subject(required): Email subject lineto(required): Array of recipient email addressescc(optional): Array of carbon copy email addressesbcc(optional): Array of blind carbon copy email addressesbody(required): Email body contentbodyIsHtml(optional): Whether the body contains HTML (default: false)attachmentName(optional): Name of the attachment fileattachment(optional): Base64-encoded attachment contentattachmentEncoding(optional): Encoding type for attachment (e.g., "base64")attachmentContentType(optional): MIME type of attachment (e.g., "application/pdf")toAccountEmail(optional): Send to the authenticated account's email address
Request Example:
curl -X POST "https://<base-url>/api/ApiProxyEmail" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-H "Content-Type: application/json" \
-d '{
"subject": "Monthly Report",
"to": ["manager@example.com"],
"body": "<h1>Report</h1><p>Please find the monthly report attached.</p>",
"bodyIsHtml": true,
"attachmentName": "report.pdf",
"attachment": "JVBERi0xLjQKJeLjz9MK...",
"attachmentEncoding": "base64",
"attachmentContentType": "application/pdf"
}'
Response 200 OK:
{
"Success": true
}
Response 400 Bad Request:
{
"Error": "Error message description"
}
Use Case: Send automated notifications, reports, or alerts via email from workflows
Notes:
- All recipient fields (
to,cc,bcc) accept arrays of email addresses - Attachments must be base64-encoded
- Use
toAccountEmail: trueto send to the authenticated user's email address - HTML emails should set
bodyIsHtml: true
ProxySecureShare​
Endpoint: POST /api/ProxySecureUpload
Description: Uploads files to Canvas secure share service and sends email notification with download link. Files are encrypted and protected with optional access code.
Content-Type: multipart/form-data
Request Parameters (Form Data):
files(required): One or more files to uploadnotificationEmail(required): Email address to receive the secure share linkemail(optional): Sender name/email display (default: "ConnectMyApps")copy(optional): CC email address for notificationsubject(optional): Email subject line (default: "ConnectMyApps - New Secure Share")secureNote(optional): Note to include with the secure sharecode(optional): Custom access code for file accessbodyIsHtml(optional): Send HTML formatted email (default: true)
Request Example (curl):
curl -X POST "https://<base-url>/api/ProxySecureUpload" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-F "files=@/path/to/document.pdf" \
-F "files=@/path/to/image.jpg" \
-F "notificationEmail=recipient@example.com" \
-F "email=sender@example.com" \
-F "subject=Secure Document Share" \
-F "secureNote=Please find the requested documents attached" \
-F "code=MySecret123"
Request Example (JavaScript):
const formData = new FormData();
formData.append('Files', new Blob(['some_text_data']), 'securefile.txt');
formData.append('notificationEmail', 'recipient@example.com');
formData.append('email', 'sender@example.com');
formData.append('subject', 'Secure File Transfer');
formData.append('secureNote', 'Confidential documents');
formData.append('code', 'AccessCode123');
fetch('https://<base-url>/api/ProxySecureUpload', {
method: 'POST',
headers: {
'SecretKey': 'your-secret-key',
'Consumer': 'your-public-key',
"Content-Type": "multipart/form-data"
},
body: formData
});
Response 200 OK:
"3fa85f64-5717-4562-b3fc-2c963f66afa6"
Returns the secure share ID (GUID) of the uploaded files.
Response 400 Bad Request: Upload failed or invalid parameters
Secure Share Features:
- Files are encrypted during storage
- Access protected with optional custom code
- Email notification sent automatically with download link
- Download link format:
{baseUrl}/secure-share/secure-download?shareid={id}&code={code} - Recipients receive email with access instructions
Use Case:
- Send sensitive documents securely
- Share large files with external parties
- Distribute confidential reports from workflows
- Automated document delivery with access control
Notes:
- Multiple files can be uploaded in a single request
- Files are stored securely and encrypted
- The endpoint automatically sends an email notification with the download link
- Custom access codes provide additional security
- The secure share ID is returned for tracking purposes
- No file size limit is enforced on this endpoint (DisableRequestSizeLimit)
Results & Logs​
GetRunHistory​
Endpoint: POST /api/GetRunHistory/{workflowId}
Description: Search workflow run history with pagination and filtering. Returns detailed execution records including status, duration, and error information.
Parameters:
workflowId(path, required): Workflow GUID
Request Body:
{
"page": 0,
"size": 50,
"lockVersionNumber": 42,
"status": "Ready",
"searchFrom": "2024-01-01T00:00:00Z",
"searchTo": "2024-12-31T23:59:59Z",
"orderByAsc": false,
"orderField": "startDateTimeUTC"
}
Request Parameters:
page(required): Page number (zero-based)size(required): Number of results per pagelockVersionNumber(optional): Filter by specific run numberstatus(optional): Filter by workflow status. Valid values:Ready- Completed successfullyError- Failed with error
searchFrom(optional): Filter runs starting from this date (ISO 8601 format)searchTo(optional): Filter runs ending before this date (ISO 8601 format)orderByAsc(optional): Sort order - true for ascending, false for descending (default: false)orderField(optional): Field to sort by (default:lockVersionNumber). Not case-sensitive. Valid values:lockVersionNumber- Run numberstatus- Execution statusstartDateTimeUTC- Run start timeendDateTimeUTC- Run end timedurationInMilliSec- Execution durationpauseInMilliSec- Time spent in pause/wait statesprocessorType- Execution environment- Any other value falls back to
lockVersionNumber
Request Example:
curl -X POST "https://<base-url>/api/GetRunHistory/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-H "Content-Type: application/json" \
-d '{
"page": 0,
"size": 50,
"status": "Ready",
"searchFrom": "2026-09-01T00:00:00Z",
"orderByAsc": false
}'
Response 200 OK:
{
"items": [
{
"lockVersionNumber": 42,
"status": "Ready",
"startDateTimeUTC": "2026-09-05T10:30:00Z",
"endDateTimeUTC": "2026-09-05T10:32:15Z",
"durationInMilliSec": 135000,
"pauseInMilliSec": 0,
"runBy": "API",
"processorType": "Standard-4GB",
"isExpiredByTime": false,
"errorMessage": null,
"lastExecutedBlockId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"lastExecutedBlockTitle": "Send Email"
}
],
"total": {
"totalNumber": 127,
"totalDurationMilliSec": 17145000,
"avgDurationMilliSec": 135000,
"totalPauseMilliSec": 0,
"avgPauseMilliSec": 0
}
}
Response Fields:
items: Page of matching workflow runslockVersionNumber: Unique run number (increments with each execution)status: Execution status (Ready, Error, Stopped, etc.)startDateTimeUTC: When the workflow run startedendDateTimeUTC: When the workflow run completed (null if still running)durationInMilliSec: Total execution time in millisecondspauseInMilliSec: Time spent in pause/wait statesrunBy: Trigger source (API, Scheduler, Webhook, Manual, etc.)processorType: Execution environment (Standart or Dedicated processors, Debug, etc.)isExpiredByTime: Whether execution results exceeded timeout limiterrorMessage: Error description if status is ErrorlastExecutedBlockId: GUID of the last executed blocklastExecutedBlockTitle: Name of the last executed block
total: Aggregated statistics for all runs matching the filters (not only the current page);nullwhen nothing matchestotalNumber: Total number of matching runstotalDurationMilliSec: Sum of run durations in millisecondsavgDurationMilliSec: Average run duration in millisecondstotalPauseMilliSec: Sum of pause times in millisecondsavgPauseMilliSec: Average pause time in milliseconds
Response 400 Bad Request: Invalid workflow ID or request parameters
Response 404 Not Found: Workflow not found or access denied
SearchRunNewTask​
Endpoint: POST /api/SearchRunNewTask/{workflowId}
Description: Starts an advanced (content) search over the run history of a workflow. The search looks for text inside run data (block responses, user logs, errors, webhook payloads, session data) and is executed asynchronously in batches. The endpoint returns the ID of the created search task immediately; use it with SearchRunViewTask to retrieve the matching runs.
Parameters:
workflowId(path, required): Workflow GUID
Request Body:
{
"searchCriteria": {
"uniqueBlockIds": ["7c9e6679-7425-40de-944b-e07fc1f90ae7"],
"searchInResponse": true,
"searchInUserLog": true,
"searchInError": false,
"searchInWebhook": false,
"searchInSession": false,
"searchTerm": [
{
"searchBy": "order-12345",
"isCaseSensitive": false
}
]
},
"batchSize": 100,
"searchFrom": "2026-09-01T00:00:00Z",
"searchTo": "2026-09-30T23:59:59Z",
"orderByAsc": false,
"orderField": "lockVersionNumber"
}
Request Parameters:
searchCriteria(required): What to search for and wheresearchTerm(required): Array of search terms. At least one item with a non-emptysearchByis requiredsearchBy(required): Text to search forisCaseSensitive(optional): Whether the match is case-sensitive (default: false)
searchInResponse(optional): Search in block responses (default: false)searchInUserLog(optional): Search in user log messages (default: false)searchInError(optional): Search in error messages (default: false)searchInWebhook(optional): Search in webhook data (default: false)searchInSession(optional): Search in session data (default: false)uniqueBlockIds(optional): Restrict the search to the specified blocks (GUIDs). If omitted or empty, all blocks are searched- At least one of the
searchIn*flags must betrue
batchSize(required): Number of runs processed per batch. Must be greater than 0searchFrom(optional): Search runs starting from this date (ISO 8601 format). Default: one month before the request timesearchTo(optional): Search runs up to this date (ISO 8601 format). Default: request time (UTC)orderByAsc(optional): Sort order - true for ascending, false for descending (default: false)orderField(optional): Field to sort by (default:lockVersionNumber). Not case-sensitive. Valid values:lockVersionNumber- Run numberstatus- Execution statusstartDateTimeUTC- Run start timeendDateTimeUTC- Run end timedurationInMilliSec- Execution durationpauseInMilliSec- Time spent in pause/wait statesprocessorType- Execution environment- Any other value falls back to
lockVersionNumber
Request Example:
curl -X POST "https://<base-url>/api/SearchRunNewTask/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-H "Content-Type: application/json" \
-d '{
"searchCriteria": {
"searchInResponse": true,
"searchInUserLog": true,
"searchTerm": [
{ "searchBy": "order-12345", "isCaseSensitive": false }
]
},
"batchSize": 100,
"searchFrom": "2026-09-01T00:00:00Z",
"searchTo": "2026-09-30T23:59:59Z"
}'
Response 200 OK:
"b2f6c1a4-8d3e-4f0a-9c57-1e2d3a4b5c6d"
Response: A JSON string containing the GUID of the created search task (searchRunTaskId). Pass it in searchRunTaskIds of SearchRunViewTask.
Response 400 Bad Request: Invalid request (e.g. the workflow does not belong to the account, batchSize is 0, searchCriteria is missing, no searchIn* flag is set, no non-empty searchTerm, or workflow not found)
Notes:
- The workflow must belong to the authenticated (or managed) account
- The search is asynchronous. The returned ID only identifies the task; matching runs become available through
SearchRunViewTaskas the batches are processed lockVersionNumberandstatusfilters are not applied when creating a task. Apply them inSearchRunViewTask- If no runs fall into the specified date range, the task is completed immediately with no results
SearchRunViewTask​
Endpoint: POST /api/SearchRunViewTask/{workflowId}
Description: Returns workflow run history with pagination and filtering. When searchRunTaskIds is provided, returns only the runs found by the specified advanced search tasks created with SearchRunNewTask. When searchRunTaskIds is empty or omitted, behaves like GetRunHistory and returns runs without content search. Response also includes aggregated statistics for all matching runs.
Parameters:
workflowId(path, required): Workflow GUID
Request Body:
{
"searchRunTaskIds": ["b2f6c1a4-8d3e-4f0a-9c57-1e2d3a4b5c6d"],
"page": 0,
"size": 50,
"lockVersionNumber": 42,
"status": "Ready",
"searchFrom": "2026-09-01T00:00:00Z",
"searchTo": "2026-09-30T23:59:59Z",
"orderByAsc": false,
"orderField": "startDateTimeUTC"
}
Request Parameters:
page(required): Page number (zero-based)size(required): Number of results per pagesearchRunTaskIds(optional): Array of search task GUIDs returned bySearchRunNewTask. If omitted or empty, no content search is appliedlockVersionNumber(optional): Filter by specific run numberstatus(optional): Filter by workflow status. Valid values:Ready- Completed successfullyError- Failed with error
searchFrom(optional): Filter runs starting from this date (ISO 8601 format). Default: one month before the request timesearchTo(optional): Filter runs ending before this date (ISO 8601 format). Default: request time (UTC)orderByAsc(optional): Sort order - true for ascending, false for descending (default: false)orderField(optional): Field to sort by (default:lockVersionNumber). Not case-sensitive. Valid values:lockVersionNumber- Run numberstatus- Execution statusstartDateTimeUTC- Run start timeendDateTimeUTC- Run end timedurationInMilliSec- Execution durationpauseInMilliSec- Time spent in pause/wait statesprocessorType- Execution environment- Any other value falls back to
lockVersionNumber
Request Example:
curl -X POST "https://<base-url>/api/SearchRunViewTask/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-H "Content-Type: application/json" \
-d '{
"searchRunTaskIds": ["b2f6c1a4-8d3e-4f0a-9c57-1e2d3a4b5c6d"],
"page": 0,
"size": 50,
"orderByAsc": false
}'
Response 200 OK:
{
"items": [
{
"lockVersionNumber": 42,
"status": "Ready",
"startDateTimeUTC": "2026-09-05T10:30:00Z",
"endDateTimeUTC": "2026-09-05T10:32:15Z",
"durationInMilliSec": 135000,
"pauseInMilliSec": 0,
"runBy": "API",
"processorType": "Standard-4GB",
"isExpiredByTime": false,
"errorMessage": null,
"lastExecutedBlockId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"lastExecutedBlockTitle": "Send Email"
}
],
"total": {
"totalNumber": 127,
"totalDurationMilliSec": 17145000,
"avgDurationMilliSec": 135000,
"totalPauseMilliSec": 0,
"avgPauseMilliSec": 0
}
}
Response Fields:
items: Page of matching workflow runslockVersionNumber: Unique run number (increments with each execution)status: Execution status (Ready, Error, Stopped, etc.)startDateTimeUTC: When the workflow run startedendDateTimeUTC: When the workflow run completed (null if still running)durationInMilliSec: Total execution time in millisecondspauseInMilliSec: Time spent in pause/wait statesrunBy: Trigger source (API, Scheduler, Webhook, Manual, etc.)processorType: Execution environment (Standart or Dedicated processors, Debug, etc.)isExpiredByTime: Whether execution results exceeded timeout limiterrorMessage: Error description if status is ErrorlastExecutedBlockId: GUID of the last executed blocklastExecutedBlockTitle: Name of the last executed block
total: Aggregated statistics for all runs matching the filters (not only the current page);nullwhen nothing matchestotalNumber: Total number of matching runstotalDurationMilliSec: Sum of run durations in millisecondsavgDurationMilliSec: Average run duration in millisecondstotalPauseMilliSec: Sum of pause times in millisecondsavgPauseMilliSec: Average pause time in milliseconds
Response 400 Bad Request: Invalid workflow ID or request parameters
Response 404 Not Found: Workflow not found or access denied
Notes:
- The workflow must belong to the authenticated (or managed) account
Use Case: Create a search task with SearchRunNewTask, then call SearchRunViewTask with the returned task ID to page through the runs that contain the searched text.
SearchRunTasks​
Endpoint: POST /api/SearchRunTasks/{workflowId}
Description: Returns the advanced search tasks created for a workflow with SearchRunNewTask, newest first. Each task includes its state, progress and the number of matches grouped by search place and block.
Parameters:
workflowId(path, required): Workflow GUID
Request Body:
{
"page": 0,
"size": 20,
"lockVersionNumber": 42
}
Request Parameters:
page(optional): Page number (zero-based)size(optional): Number of tasks per page. Pagination is applied only whenpageis 0 or greater andsizeis greater than 0; otherwise all tasks of the workflow are returnedlockVersionNumber(optional): Return only tasks that found matches in this run, and count only the matches in this run
Request Example:
curl -X POST "https://<base-url>/api/SearchRunTasks/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-H "Content-Type: application/json" \
-d '{
"page": 0,
"size": 20
}'
Response 200 OK:
[
{
"id": "b2f6c1a4-8d3e-4f0a-9c57-1e2d3a4b5c6d",
"prettyId": 3,
"searchCriteria": "[{\"searchBy\":\"order-12345\",\"isCaseSensitive\":false}]",
"criteriaDateFrom": "2026-09-01T00:00:00+00:00",
"criteriaDateTo": "2026-09-30T23:59:59+00:00",
"startDateTime": "2026-10-01T09:15:00+00:00",
"endDateTime": "2026-10-01T09:15:42+00:00",
"state": 1,
"uniqueBlockIds": null,
"searchInResponse": true,
"searchInUserLog": true,
"searchInError": false,
"searchInWebhook": false,
"searchInSession": false,
"progressNo": 12,
"progressTotal": 40,
"searchRunTaskResults": [
{
"searchPlace": 0,
"uniqueBlockId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"webhookId": null,
"count": 9
}
]
}
]
Response Fields: A JSON array of search tasks sorted by startDateTime descending. Each item has the same fields as the response of GetSearchRunTask (state and searchPlace are returned as numbers).
Response 400 Bad Request: Invalid workflow ID, workflow not found, or the workflow does not belong to the account
Notes:
- The workflow must belong to the authenticated (or managed) account
- The response is a plain array and does not contain the total number of tasks
- With
lockVersionNumber, tasks without matches in that run are removed after the page is selected, so a page can contain fewer thansizeitems - Returns an empty array if the workflow has no search tasks
GetSearchRunTask​
Endpoint: GET /api/GetSearchRunTask/{taskId}
Description: Returns the details and current progress of an advanced search task created with SearchRunNewTask, including the number of matches grouped by search place and block.
Parameters:
taskId(path, required): Search task GUID returned bySearchRunNewTask
Request Example:
curl -X GET "https://<base-url>/api/GetSearchRunTask/b2f6c1a4-8d3e-4f0a-9c57-1e2d3a4b5c6d" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK:
{
"id": "b2f6c1a4-8d3e-4f0a-9c57-1e2d3a4b5c6d",
"prettyId": 3,
"searchCriteria": "[{\"searchBy\":\"order-12345\",\"isCaseSensitive\":false}]",
"criteriaDateFrom": "2026-09-01T00:00:00+00:00",
"criteriaDateTo": "2026-09-30T23:59:59+00:00",
"startDateTime": "2026-10-01T09:15:00+00:00",
"endDateTime": "2026-10-01T09:15:42+00:00",
"state": 1,
"uniqueBlockIds": null,
"searchInResponse": true,
"searchInUserLog": true,
"searchInError": false,
"searchInWebhook": false,
"searchInSession": false,
"progressNo": 12,
"progressTotal": 40,
"searchRunTaskResults": [
{
"searchPlace": 0,
"uniqueBlockId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"webhookId": null,
"count": 9
},
{
"searchPlace": 1,
"uniqueBlockId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"webhookId": null,
"count": 3
}
]
}
Response Fields:
id: Search task GUIDprettyId: Sequential task number within the workflowsearchCriteria: Search terms, as a JSON-encoded string (array of{ searchBy, isCaseSensitive })criteriaDateFrom/criteriaDateTo: Date range the task searched instartDateTime: When the task was createdendDateTime: When the task finished (null while it is running)state: Task state (numeric value):0- In progress1- Completed2- Cancellation in progress3- Canceled4- Error
uniqueBlockIds: Blocks the search was restricted to (null if all blocks were searched)searchInResponse,searchInUserLog,searchInError,searchInWebhook,searchInSession: Places the search was performed inprogressNo,progressTotal: Progress counters. Their meaning depends onstate:- While in progress:
progressNois the number of processed batches,progressTotalis the total number of batches - Otherwise:
progressNois the number of matches found,progressTotalis the number of checked results
- While in progress:
searchRunTaskResults: Matches grouped by place and blocksearchPlace: Where the match was found (numeric value):0- block response,1- user log,2- error,3- webhook,4- sessionuniqueBlockId: GUID of the block that contains the match (if applicable)webhookId: GUID of the webhook that contains the match (if applicable)count: Number of runs with a match in this place
Response 400 Bad Request: Invalid task ID, task not found, or the task's workflow does not belong to the account
Notes:
- The task must belong to a workflow of the authenticated (or managed) account
- Poll this endpoint after SearchRunNewTask until
stateis no longer0, then call SearchRunViewTask to retrieve the runs - Enum values (
state,searchPlace) are returned as numbers
CancelSearchRunTask​
Endpoint: GET /api/CancelSearchRunTask/{taskId}
Description: Cancels a search task created with SearchRunNewTask. The task state is set to Canceled.
Parameters:
taskId(path, required): Search task GUID
Request Example:
curl -X GET "https://<base-url>/api/CancelSearchRunTask/b2f6c1a4-8d3e-4f0a-9c57-1e2d3a4b5c6d" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK: Empty body. The task was marked as canceled
Response 400 Bad Request: Invalid task ID, task not found, or the task's workflow does not belong to the account
Notes:
- The task must belong to a workflow of the authenticated (or managed) account
- Check the result with GetSearchRunTask (
state=3) - The task and any matches already found are kept. Use DeleteSearchRunTask to remove them
DeleteSearchRunTask​
Endpoint: GET /api/DeleteSearchRunTask/{taskId}
Description: Deletes a search task together with its batches and results.
Parameters:
taskId(path, required): Search task GUID
Request Example:
curl -X GET "https://<base-url>/api/DeleteSearchRunTask/b2f6c1a4-8d3e-4f0a-9c57-1e2d3a4b5c6d" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK: Empty body. The task was deleted
Response 400 Bad Request: Invalid task ID, task not found, or the task's workflow does not belong to the account
Notes:
- The task must belong to a workflow of the authenticated (or managed) account
- This operation cannot be undone
- A deleted task ID can no longer be used in
searchRunTaskIdsof SearchRunViewTask - Although it deletes data, the endpoint uses the
GETmethod
ClearAllSearchRunTasks​
Endpoint: GET /api/ClearAllSearchRunTasks/{workflowId}
Description: Deletes all search tasks (with their batches and results) created for a workflow.
Parameters:
workflowId(path, required): Workflow GUID
Request Example:
curl -X GET "https://<base-url>/api/ClearAllSearchRunTasks/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key"
Response 200 OK: Empty body. All search tasks of the workflow were deleted
Response 400 Bad Request: Invalid workflow ID, workflow not found, or the workflow does not belong to the account
Notes:
- The workflow must belong to the authenticated (or managed) account
- This operation cannot be undone
- Returns 200 even if the workflow has no search tasks
- Although it deletes data, the endpoint uses the
GETmethod
GetBlockResult​
Endpoint: GET /api/GetBlockResult/{workflowId}?uniqueBlockId={guid}&runNumber={int}
Description: Retrieves execution result for a specific block.
Parameters:
workflowId(path): Workflow GUIDuniqueBlockId(query): Block GUIDrunNumber(query, optional): Specific run number (default: latest)
Response:
{
"success": true,
"runNumber": 42,
"uniqueBlockId": "guid",
"result": {"output": "data"}
}
Error Response:
{
"success": false,
"runNumber": 42,
"uniqueBlockId": "guid",
"result": "Error message"
}
GetBlockUserLog​
Endpoint: GET /api/GetBlockUserLog/{workflowId}?uniqueBlockId={guid}&runNumber={int}
Description: Retrieves user-generated logs from a block execution.
Response:
{
"runNumber": 42,
"uniqueBlockId": "guid",
"result": ["log message 1", "log message 2"]
}
Use Case: Debugging custom scripts with console.log() statements
GetBlockSession​
Endpoint: GET /api/GetBlockSession/{workflowId}?uniqueBlockId={guid}&runNumber={int}
Description: Retrieves session data (state) for a block execution.
Response:
{
"runNumber": 42,
"uniqueBlockId": "guid",
"result": {"sessionKey": "sessionValue"}
}
Use Case: Accessing intermediate state/variables during block execution
Tag Management​
Tags are labels that can be attached to various entities (accounts, workflows, registered applications, etc.) for organization, filtering, and categorization purposes.
AttributeTagAdd​
Endpoint: POST /api/AttributeTagAdd/{entityType}/{entityId}
Description: Adds a tag to an entity (account, workflow, registered application, etc.).
Parameters:
entityType(path, required): Type of entity to tag. Valid values:account(0)registeredApp(1)workflow(2)application(3)blockTemplate(4)workflowTemplate(5)organization(6)role(7)
entityId(path, required): GUID of the entity to tag
Request Body:
{
"value": "production"
}
Request Example:
curl -X POST "https://<base-url>/api/AttributeTagAdd/workflow/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-H "Content-Type: application/json" \
-d '{
"value": "production"
}'
Response 200 OK: Empty response on success
Response 400 Bad Request: Invalid entity type or missing tag value
AttributeTagDelete​
Endpoint: POST /api/AttributeTagDelete/{entityType}/{entityId}
Description: Removes a specific tag from an entity.
Parameters:
entityType(path, required): Type of entity (same values as AttributeTagAdd)entityId(path, required): GUID of the entity
Request Body:
{
"value": "production"
}
Request Example:
curl -X POST "https://<base-url>/api/AttributeTagDelete/workflow/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "SecretKey: your-secret-key" \
-H "Consumer: your-public-key" \
-H "Content-Type: application/json" \
-d '{
"value": "production"
}'
Response 200 OK: Empty response on success
Response 400 Bad Request:
- Missing or empty tag value
- Invalid entity type
- Entity not found
Notes:
- The tag value must exactly match the existing tag (case-sensitive)
- No error is returned if the tag doesn't exist on the entity
Tag Filtering:
Tags can be used to filter results in search endpoints:
POST /api/Accounts- Filter bytagsparameterPOST /api/RegApplications- Filter bytagsparameterPOST /api/Workflows- Filter bytagsparameter
Error Handling​
Standard Error Responses​
All endpoints follow consistent error response patterns:
400 Bad Request
{
"code": 400,
"errorMessage": "Specific error description",
"response": null
}
Best Practices​
1. Workflow Creation Flow​
1. GET /api/Applications → List available apps
2. POST /api/RegApplication → Register needed apps
3. GET /api/WorkflowTemplates → Find template
4. GET /api/WorkflowTemplate/{id} → Get template details
5. POST /api/Workflow → Create workflow from template
6. POST /api/Workflow/{id} → Configure workflow
7. GET /api/DeployWorkflow/{id} → Deploy workflow
8. POST /api/RunWorkflow → Execute workflow
2. Pagination Pattern​
Always use pagination for list endpoints:
{
"page": 0,
"size": 50,
"searchTerm": "optional"
}
3. Workflow Variable Formats​
Both formats are supported:
// Explicit format (recommended)
{"variableName": {"value": "actualValue"}}
// Shorthand format
{"variableName": "actualValue"}
4. Error Recovery​
- Check response status codes
- Parse error messages for details
- Use validation endpoints before creation
- Handle OAuth redirects appropriately
5. Webhook Security​
- Always use
secretfor HMAC validation - Implement
ipRestrictionfor known sources - Use
skipScriptfor payload validation - Enable
strictOrderProcessingfor order-sensitive workflows
6. Vault Usage​
- Use workflow vault for workflow-specific secrets
- Use account vault for shared credentials
- Always check if key exists before retrieving
- Clean up unused keys
7. Performance Optimization​
- Use search endpoints with filters instead of listing all
- Set
includeLogo: falsewhen logos not needed - Paginate large result sets
- Cache template and application lists
Common Scenarios​
Scenario 1: Automated Workflow Provisioning​
1. POST /api/Account → Create user account
2. Authenticate as new account
3. POST /api/RegApplication → Register required apps
4. POST /api/Workflow → Create workflow from template
5. POST /api/WorkflowScheduler → Schedule execution
6. GET /api/DeployWorkflow/{id} → Deploy
Scenario 2: Webhook-Triggered Workflow​
1. POST /api/Workflow → Create workflow
2. POST /api/WebhookSettingsEnable/{id} → Enable webhook
3. External system POSTs to webhook URL
4. POST /api/GetWebhookQueue/{id} → Monitor queue
5. GET /api/GetBlockResult → Check execution results
Scenario 3: Custom Block Execution​
1. GET /api/GetFunctions → Get available functions
2. POST /api/Workflow → Create with custom blocks
3. POST /api/RunWorkflow → Execute
4. GET /api/GetBlockResult → Retrieve block output
5. GET /api/GetBlockUserLog → Check console logs
Scenario 4: Multi-Account Management (Partner)​
1. POST /api/Account (activated: false) → Create account
2. User activates via email
3. Switch context to managed account
4. POST /api/RegApplication → Register apps for user
5. POST /api/Workflow → Provision workflow
6. Configure scheduler/webhooks
Appendix​
DTO Naming Convention​
- ApiDto suffix: API-specific DTOs
- ListApiDto: Summary objects for list endpoints
- WithDetailsApiDto: Full detail objects
Key DTOs​
ApplicationListApiDto: Application summaryWorkflowTemplateListApiDto: Template summaryWorkflowTemplateWithDetailsApiDto: Full templateWorkflowListApiDto: Workflow summaryWorkflowApiDto: Full workflow configurationRegApplicationListApiDto: Registered app summaryClientListApiDto: Account summaryBlockTemplateApiDto: Block template dataChainApiDto: Block chain elementWebhookSettingApiDto: Webhook configuration
Enums​
AccountStateEnum:
inActiveactivelockedarchived
WorkflowStateEnum:
inDevelopmentdeployedarchived
WorkflowRunStatusEnum:
pendingprocessingcompletedfailedskipped
EntityTypeEnum:
accountregisteredAppworkflowapplicationblockTemplateworkflowTemplateorganizationrole
Last Updated: 2026-10-30