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": {"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 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": {"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 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: 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 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
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 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-09-10