Skip to main content

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​

Generate API Keys​

Before you can use the Canvas API, you need to generate API keys:

  1. Log in to your Canvas account
  2. Navigate to: https://canvas.connectmyapps.com/account/security/api-keys
  3. Click "Create secret key"
  4. Set IP restriction list, if it is needed
  5. Copy your Consumer and Secret Key and save it in secure store. Important: Store your secret key securely - it won't be shown again!
  6. 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 account
  • managedAccount: The account you're currently managing (for partner/manager scenarios)
  • If you're not managing another account, only myAccount is 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 name
  • route: Full API route with path parameters
  • verb: HTTP method (GET, POST, PUT, PATCH, DELETE)
  • description: Human-readable description
  • authenticate: Whether authentication is required (optional)
  • parameters: Simple parameter string format param1={type}&param2={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

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 page
  • searchTerm: 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" and version: 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 GUID
  • isDraft (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 GUID
  • isDraft (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

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 page
  • searchTerm: 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 email
  • activated: 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

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

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 GUID
  • runNumber (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 execute
  • webhookId: Optional. Rerun a specific webhook request
  • runFromBlock: 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 GUID
  • disableWithCleanSettings (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 processed
  • Processing: Currently executing
  • Failed: 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 GUID
  • key (path): Vault key name

Request Body:

{
"jsonData": {"value": "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 GUID
  • key (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 GUID
  • key (path): Vault key name

Request Body:

{
"jsonData": {"value": "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 name
  • newVersion (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 JSON
  • Text: Returns as plain text
  • Binary: 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 line
  • to (required): Array of recipient email addresses
  • cc (optional): Array of carbon copy email addresses
  • bcc (optional): Array of blind carbon copy email addresses
  • body (required): Email body content
  • bodyIsHtml (optional): Whether the body contains HTML (default: false)
  • attachmentName (optional): Name of the attachment file
  • attachment (optional): Base64-encoded attachment content
  • attachmentEncoding (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: true to 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 upload
  • notificationEmail (required): Email address to receive the secure share link
  • email (optional): Sender name/email display (default: "ConnectMyApps")
  • copy (optional): CC email address for notification
  • subject (optional): Email subject line (default: "ConnectMyApps - New Secure Share")
  • secureNote (optional): Note to include with the secure share
  • code (optional): Custom access code for file access
  • bodyIsHtml (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 page
  • lockVersionNumber (optional): Filter by specific run number
  • status (optional): Filter by workflow status. Valid values:
    • Ready - Completed successfully
    • Error - 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: startDateTimeUTC)

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": 127
}

Response Fields:

  • lockVersionNumber: Unique run number (increments with each execution)
  • status: Execution status (Ready, Error, Stopped, etc.)
  • startDateTimeUTC: When the workflow run started
  • endDateTimeUTC: When the workflow run completed (null if still running)
  • durationInMilliSec: Total execution time in milliseconds
  • pauseInMilliSec: Time spent in pause/wait states
  • runBy: Trigger source (API, Scheduler, Webhook, Manual, etc.)
  • processorType: Execution environment (Standart or Dedicated processors, Debug, etc.)
  • isExpiredByTime: Whether execution results exceeded timeout limit
  • errorMessage: Error description if status is Error
  • lastExecutedBlockId: GUID of the last executed block
  • lastExecutedBlockTitle: Name of the last executed block

Response 400 Bad Request: Invalid workflow ID or request parameters

Response 404 Not Found: Workflow not found or access denied

GetBlockResult​

Endpoint: GET /api/GetBlockResult/{workflowId}?uniqueBlockId={guid}&runNumber={int}

Description: Retrieves execution result for a specific block.

Parameters:

  • workflowId (path): Workflow GUID
  • uniqueBlockId (query): Block GUID
  • runNumber (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 by tags parameter
  • POST /api/RegApplications - Filter by tags parameter
  • POST /api/Workflows - Filter by tags parameter

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 secret for HMAC validation
  • Implement ipRestriction for known sources
  • Use skipScript for payload validation
  • Enable strictOrderProcessing for 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: false when 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 summary
  • WorkflowTemplateListApiDto: Template summary
  • WorkflowTemplateWithDetailsApiDto: Full template
  • WorkflowListApiDto: Workflow summary
  • WorkflowApiDto: Full workflow configuration
  • RegApplicationListApiDto: Registered app summary
  • ClientListApiDto: Account summary
  • BlockTemplateApiDto: Block template data
  • ChainApiDto: Block chain element
  • WebhookSettingApiDto: Webhook configuration

Enums​

AccountStateEnum:

  • inActive
  • active
  • locked
  • archived

WorkflowStateEnum:

  • inDevelopment
  • deployed
  • archived

WorkflowRunStatusEnum:

  • pending
  • processing
  • completed
  • failed
  • skipped

EntityTypeEnum:

  • account
  • registeredApp
  • workflow
  • application
  • blockTemplate
  • workflowTemplate
  • organization
  • role

Last Updated: 2026-09-10