# Enterprise Integration Platform

DCKAP Integrator, an enterprise ERP integration tool connects and synchronizes data across various platforms.

The success of any business is entirely dependent on customers being able to use the product in the most seamless way and attain top-notch cloud experience across a multitude of devices.&#x20;

With real-time synchronization of data from ERP to eCommerce, CRM, EDI, and other marketing tools, DCKAP Integrator makes multi-platform integration simple and robust.&#x20;

### ***The Concept of Integration***

When two independently designed applications are combined or linked to work together, it is called Integration. CRM, ERP and eCommerce, are the three major application systems that are extensively integrated, and rely greatly on the benefits and adaptability of cloud technology.&#x20;

### B2B (Business-to-Business) Integration&#x20;

The term B2B integration is used when a business process involves the linking and streamlining of data between two businesses, thus enabling data management for day-to-day operations.&#x20;

Example of a B2B Integration process: "Integrating an eCommerce website set up on BigCommerce to an ERP system built using P21".

In simple terms, an ERP is the data hub of a business, that includes inventory, customer and shipping information, product database, order details, etc.  Automating the integration between an eCommerce platform with ERP can save business owners time, money and manpower. Businesses can concentrate on the core business while letting the integration tool manage transactions end-to-end.&#x20;

Integrating applications over the cloud inflates productivity and performance, and also reduces costs. Data Integration is capable of establishing the following:&#x20;

* Consistently maintain data across applications
  * Customers will have access to real-time data
  * Lessened human errors since inventory are automatically maintained
  * Faster order fulfillment&#x20;
* Coordinate the back and forth communication between multi-platform systems
* Establishing an interface tool or service, that makes data and process accessibility from a multitude of systems, effortless

### How do I get started?

Navigate to the user guide below for product features:

{% content-ref url="/pages/-LvPWR32dqgBg0WhKROw" %}
[The Basics](/user-guide/getting-started)
{% endcontent-ref %}

If you looking to learn and develop integrations using DCKAP Integrator, navigate to the Integrations section below:

{% content-ref url="/pages/-M-E\_q90dYmvKeKdAdeg" %}
[Integrations](/project-manager/integrations)
{% endcontent-ref %}


# What is DCKAP Integrator?

DCKAP Integrator is an Enterprise ERP integration platform with unlimited potential to connect, sync and automate ERP, eCommerce, and CRM applications from one console.

For a quick video explainer of DCKAP Integrator Overview, [click here.](https://www.youtube.com/watch?v=aLgTMVW1ePU)

<figure><img src="/files/GRG9CDusyxoQ4mQM2XnL" alt=""><figcaption></figcaption></figure>

Consider DCKAP Integrator as a plug & play integration solution, delivered on the cloud that helps multiple applications talk to each other.

DCKAP Integrator offers a robust and flexible system to enable an organization's development team run integrations efficiently, thereby eliminating any manual errors and down-time.

<div data-full-width="false"><figure><img src="/files/dCQ7kMOvoIi1nAteZQhP" alt=""><figcaption><p>DCKAP Integrator</p></figcaption></figure></div>

### *What can I do with* DCKAP Integrato&#x72;*?*

DCKAP Integrator is an iPaaS platform that can connect any number and type of business applications ranging from ERP, eCommerce, CRM, EDI, databases and much more.

### **Why** DCKAP Integrato&#x72;**?**&#x20;

Simplicity and scalability are the USP's of DCKAP Integrator. With an easy to use interface, DCKAP Integrator promises consistent integration across various platforms.&#x20;

Some highlights of DCKAP Integrator include:&#x20;

* **iPaaS** (Integration Platform as a Service): With DCKAP Integrator, integration over the cloud is executed seamlessly thus eliminating the need to use different environments to deploy your technology.
* Versatile and simple interface: No special coding knowledge is necessary to implement your integration. The entire process can be built and automated by developing integrations seamlessly, making the tool extremely user compatible.
* Custom API's to integrate multiple systems &#x20;
* Drag and Drop feature facilitating easy project development.
* Supports the unique needs of every business by Mapping data.
* Clear-cut and insightful results to comprehend your business requirement&#x73;*.*

Get Started with our [Quick Start Guide.](/getting-started/quick-start-guide)&#x20;


# Integrator Architecture

The logical arrangement of elements that define how DCKAP Integrator  operates, while facilitating accurate integrations, faster response time, secure transactions and scalable deployments.

DCKAP Integrator architecture incorporates a structural design consisting of different components, arranged in hierarchical layers to satisfy users' integration needs.  It is designed and developed with units such as APIs, Flows, schedulers and other elements that communicate with each other to establish and synchronize data between different systems. The DCKAP Integrator architecture facilitates scalability as *"n"* number of systems can be connected to the underlying framework.

![High Level Architecture Diagram](/files/-M-JI1bcroMhj5asYq7q)

## Application Layers

The various DCKAP Integrator components can be categorized into four layers - Presentation Layer, Business Layer, Domain Layer, and Database Layer.

### Presentation Layer

Users are directly involved with the Presentation layer. It is the topmost layer in the four-layer stack and does not hold any business logic. This layer basically contains HTML templates, CSS and JS files. Dynamic calls can also be made from the browser or via AJAX calls.&#x20;

The Presentation Layer acts as an interface between the users and the product itself. Users can initiate any action from this layer, which then flows into further layers and gets accomplished completely.&#x20;

The Presentation layer communicates with the Processor and the listener of the Business layer to implement the respective business logic. Service Consumers can communicate with the business layer only if it is authorized. DCKAP Integrator supports authentication mechanisms like [JSON Web Tokens(JWT, RFC 7519)](https://jwt.io/)  and access tokens to authenticate service consumers.

### Business Layer

This layer holds the whole application's business logic for synchronizing data between systems. The Processor uses different modules (Flows, API & System Builder) to implement the connection between systems. This layer communicates with the Domain layer for database related activities.

This layer also contains the Listener which actively listens for dynamic calls from different systems. Also, Processor directly communicates with Auto Pilot Scheduler to schedule and run the synchronization at configured intervals.

This layer establishes communication with different systems (such as ERP, CRM, eCommerce, etc.) based on the Flows configured to the pipe. The authentication mechanism varies from system to system like [OAuth1(RFC 5849)](https://en.wikipedia.org/wiki/OAuth#OAuth_1.0), [OAuth2(RFC 6749)](https://en.wikipedia.org/wiki/OAuth#OAuth_2.0), [Basic Authentication(RFC 7617)](https://en.wikipedia.org/wiki/Basic_access_authentication), [Bearer Token(RFC 6750)](https://tools.ietf.org/html/rfc6750), [NTLM Authentication](https://en.wikipedia.org/wiki/NT_LAN_Manager) and so on.

### Domain Layer

Domain layer is made up of ORM (Schema Models), Serializers and De-serializers. This acts as an intermediate layer between the Business layer and Database layer since the former layer should not directly communicate with the Database layer.&#x20;

Schema Models helps in validating, formatting and customizing the data.

### Database Layer

Database layer is the underlying layer which holds the application data.&#x20;


# Integrator Security

DCKAP Integrator aims at protecting and encrypting the wealth of data that flows through it, for the entire integration lifecycle. As a middleware, DCKAP Integrator only acts as an interface to transfer data between systems and does not store a copy of the data.

Without compromising the speed of data transfer or the scalability of connecting multiple systems, DCKAP Integrator safeguards every byte of valuable and sensitive information that it processes.

By providing Access Control, DCKAP Integrator enables data authentication and authorization and further assures securing of critical information which is otherwise vulnerable to security breaches.

## DCKAP Integrator **Security Protocols**&#x20;

![](/files/1eAvcLtvqVU3CcubYwTZ)

## Data Security

By default, DCKAP Integrator saves only the entity ID (for logs and failure record reprocessing) and the data logged in flows. DCKAP Integrator does not store any other data transferred between systems.

All our files and data are stored in Amazon Web Services (AWS) Cloud. The following is a partial list of assurance programs with which AWS complies:&#x20;

* SOC 1/ISAE 3402, SOC 2, SOC 3&#x20;
* FISMA, DIACAP, and FedRAMP&#x20;
* PCI DSS Level 1&#x20;
* ISO 9001, ISO 27001, ISO 27017, ISO 27018

To learn more about AWS Security and Compliance, [click here](https://docs.aws.amazon.com/whitepapers/latest/aws-overview/security-and-compliance.html).

### **1. Cloud Data Encryption**

#### User Credentials&#x20;

All the credentials provided by the users are encrypted using AES-128 Cipher and stored in the cloud.

#### Console Logs

As stated earlier, DCKAP Integrator does not store the actual data transferred between systems. However, developers often need to see or understand the data which is flowing through DCKAP Integrator. To improve debugging techniques, we log console information of any given pipe only when it is enabled by the user in their respective account.

While moving to production, the user can disable the console logs and the saved console logs can be deleted at any point in time.

The configured console logs of the respective integration pipes are stored in the cloud(AWS S3 Bucket). The download link for the files will be created with secure keys and it will expire in 5 minutes.

### **2.** Session Data

All the session information is stored on the server.

### 3. **Logs and Failure Records Reprocessing**

DCKAP Integrator saves the meta information like entity ID of failed records(to rerun the synchronization), execution time, number of records processed, number of records failed, status and so on.

All the logs data are automatically deleted at a regular interval(based on the user plan) and also the user has the ability to delete the data manually.

## **Application Security**

### **1. Account Passwords**&#x20;

All user authentication is securely managed through AWS Cognito, our identity provider, ensuring robust access control, encrypted communication, and compliance with industry-standard security practices. Data is encrypted both at rest and in transit.

<https://docs.aws.amazon.com/cognito/latest/developerguide/data-protection.html#data-encryption>

### **2. Project Access**

The project owner can provide/revoke the project access to any user or user group at any point in time. The project owner has complete control over the user management for the project.

The project access level provided can vary from user to user based on the following two options:

* **Administrator** - This access level has all the provisions similar to the Project Owner except the ability to delete or transfer the project.
* **Standard User** - This access level doesn’t have access to delete or transfer or provide project access to other users. They are also not allowed to modify the project configuration.

The Project Owner has the ability to switch the above privileges for any user anytime.

Without access provided by the project owner or Administrators, no other user can access the project information. User Access Privilege is ensured in all the pages.

### 3. **Other Systems**

DCKAP Integrator can establish communication with different systems (such as ERP, CRM, eCommerce, etc.) based on the flows configured to the pipe.

Some authentication mechanisms include [OAuth1(RFC 5849)](https://en.wikipedia.org/wiki/OAuth#OAuth_1.0), [OAuth2(RFC 6749)](https://en.wikipedia.org/wiki/OAuth#OAuth_2.0), [Basic Authentication(RFC 7617)](https://en.wikipedia.org/wiki/Basic_access_authentication), [Bearer Token(RFC 6750)](https://tools.ietf.org/html/rfc6750), [NTLM Authentication](https://en.wikipedia.org/wiki/NT_LAN_Manager) and so on. They vary from system to system.

### **4. Service Consumers (Dynamic Calls)**

Service Consumers can communicate with the application only if it is authorized. DCKAP Integrator supports authentication mechanisms like [Json Web Tokens(JWT, RFC 7519)](https://jwt.io/) and access tokens for authenticating external requests.

All the requests are processed by AWS Lambda serverless compute service.

## **Network Security**

AWS Security Group Implemented

* AWS Security Group Implemented
  * control inbound and outbound traffic
  * provides security at the protocol and port access level
* SSL/TLS 1.2 Implemented
  * Encrypts information that is sent over the internet and provides identity assurance
* All of the AWS APIs are available via SSL-protected endpoints which provide server authentication.
* Port scans of Amazon EC2 instances are generally ineffective because, by default, all inbound ports on Amazon EC2 instances are closed and are only opened by the DCKAP Integrator Infrastructure Manager.&#x20;
* Connections to Databases are highly secured and are allowed only from certain whitelisted IPs.


# Quick Start Guide

A step by step manual that will get you started with the DCKAP Integrator  application.

This Quick Start Guide will help you get started with DCKAP Integrator and discuss the steps involved in setting up a Project in DCKAP Integrator and how to create new Integration pipes and schedule the data synchronization.&#x20;

## 1. Registration and Setup

### 1.1 Registration and Login

You can create a new account through the registration page, to monitor and manage Integration transactions.

Following are the details required to register yourself in the DCKAP Integrator application:

* First name and Last name of account holder
* Email address of account holder

<figure><img src="/files/cKsQP5aWHerdZbDSPXQs" alt=""><figcaption></figcaption></figure>

Once registered, an email with the activation link will be sent to the email address provided. Click on the link and activate your account to get started.

### Project Invitations

A new feature in DCKAP Integrator also allows Project Owners to send [**Project invitations**](/user-guide/invitations) to DCKAP Integrator as well as non-DCKAP Integrator users, enabling them to access Projects straight away. DCKAP Integrator users can manage invitations in one of the following ways:

a) Clicking on the Invitations icon in the upper right corner.

b) Clicking on the Project Invite link from the Invitation email.

### 1.2 DCKAP Integrator Dashboard

Once you activate your account, you will be redirected to the DCKAP Integrator projects page, which is also the home page of the DCKAP Integrator application.&#x20;

More details in[ 2. Dashboard/Projects](#2.-dashboard-projects)

### 1.3 DCKAP Integrator Analytics

The analytics page provides you with high-level insights about different metrics of projects managed under that user account.

<figure><img src="/files/a3Qyf3x3GLjLmjHc9Pfl" alt=""><figcaption></figcaption></figure>

The following Project metrics can be viewed on the dashboard:

* **Timeline:** Allows the user to change the timeline of data displayed on the DCKAP Integrator dashboard.
* **Total Records Processed:** Number of API calls made to other systems.
* **Success Rate:** Percentage of records processed successfully.
* **New Customers:** Number of new customers over the selected time period.
* **New Orders**: Number of new orders in the selected timeframe.
* **Traffic graph - Customers & Orders:** A graphical representation that shows how many new customers and orders have been synchronized within the selected time frame.
* **Project Filter:** By selecting a project from the drop-down list in the top left corner, the dashboard screen displays metrics for that particular project.

### 1.4 Account Settings

Users can manage their account configuration settings from here.

Click on Account Settings from the drop-down list in the top right corner.&#x20;

<figure><img src="/files/bRgab63EgX3AdtBnn3xy" alt="" width="302"><figcaption></figcaption></figure>

&#x20;These settings will be applicable to all the projects the user has access to:

**General**

* **Override Project Timezones :** If yes, all the date and time are displayed in the chosen timezone below.
* **Timezone:** Manage all date related information in the product in the selected timezone.
* **Allow Force Login:** To allow DCKAP Integrator Admin to login to your account.

![](/files/-M8z1Jaw1Czn6-eShVYv)

Once the options are chosen, click on Save Configuration to save the settings.

### 1.5 Change Password

This page allows the user to update the password of the account in which they have currently logged in. The user can simply enter the existing password, followed by the new password and press the update button.

### 1.6 View/Edit Profile

This page allows the user to update the account information provided during the user registration.

## 2. Dashboard / Projects

All projects are displayed as individual cards with details - project name and project owner name.&#x20;

Click anywhere on the project card to navigate to the project space, where the user can access, edit and create different features (Integrations, Systems, Flows and so on) of the project.

<figure><img src="/files/JcmAZcSe9lUs7PC46f7P" alt=""><figcaption></figcaption></figure>

## 3. Projects & Integrations

The Projects page is considered the epicenter of the integration process, where users can create, edit and view all the projects they have access to.

Clicking on this icon from the Dashboard will take users to the Projects page which consists of a list of all the projects that they have created or have been given access to. ![](/files/LWlVyEHqwz2SbCOvXD99)

At first glance, it provides an outline of basic information about a project in tabular form, such as Project Name, Project Description and Created by.

Users can also do the following from the Projects list:

* **Manage Button:** To navigate to the Project space, where the user can access, edit and create different aspects (Integrations, Credentials, Flows and so on) of the project.
* **Transfer Ownership**: To make another user the "Project Owner" of that Project.

### 3.1 Managing Projects

Every DCKAP Integrator project is made up of integration units called Pipes. These units, in turn, contain flows and mapping configurations.

Click on the project to go to the Integrations page which is the hub of the project. From here users can edit and play with the development of the project as needed.

The following icons are available on the left side of this page:

* **Integrations**: Quick access to all integration units (pipes) and also to create new integrations, to synchronize data transfer, view logs, and edit integrations
* **Credentials**: View, edit and add system credentials
* **​Logs**: View high-level and detailed log messages, and results of the sync process
* **Project Settings:** Edit project settings such as timezone, dashboard settings, email notifications, and other notification settings
* **Advanced**: Developer related modules to build Flows and manage APIs

### 3.2 Systems

The Systems page is where users can add, edit, and maintain systems with its APIs and credentials for a project. These APIs will be used in building Flows and Integration pipes.

The individual platforms that DCKAP Integrator directly connects to, or connects using APIs are known as systems. *For example*, ERP is a system. These systems need to be configured in DCKAP Integrator in order to be able to communicate with them (read, write, and update data).

* **Add New:** This button allows the user to set up a new system in this account for integration. Enter the following details:

{% content-ref url="/pages/-MMV5CiNb44lw4cOqkmD" %}
[Systems (Old)](/project-manager/systems)
{% endcontent-ref %}

### 3.3 Integrations

The Integrations section is where users will configure and set up pipes. Every pipe contains a name and credentials, is linked with a Flow, and may or may not have a Mapping configuration.

**What is a Pipe?**

Simply put, a Pipe is a single integration unit, i.e., the sub unit of every system integration, responsible for synchronizing all entities (Customers, Orders, Products, etc.). Each pipe should be mapped with a Flow to carry out the underlying integration logic.

#### **Pipe Types**

**Batch ​**

Data synchronization will be handled periodically at certain configured time intervals.

&#x20;<img src="/files/kNbi3MqxoOAGmEwuJXFw" alt="" data-size="line">

*Example: Every 2 hours*

**Dynamic** ​

Data synchronization is done in real-time using an API call from any system through DCKAP Integrator. For example, services like Pricing may be configured as a Dynamic Pipe to fetch the prices in real-time.&#x20;

<div align="left"><img src="/files/aMGypARF77My5pLizr6k" alt="" width="188"></div>

The URL can be got by clicking on the ***COPY URL*** button in the Integrations page.

#### **Manage Pipes**

The pipes are displayed either as a Grid or a table.

<figure><img src="/files/4sDOOgs6fzPZxxsdVKTC" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/e0OmOjPF0EIr7OMTF6OY" alt=""><figcaption></figcaption></figure>

In the Integrations page, the following information is present in grid/tabular form:

* **​Status**: Enables or disables the working of a pipe, used especially during scheduled synchronization
* **Pipe Name:** Displays the name of Integration Pipe
* **Systems**: Systems connected in the pipe
* **Type of Integration:** ​Batch / ​Dynamic
* **Sync status:** Displays the time at which the last sync was performed and if the sync was complete or not
* **Sync Now or Copy URL button:**
  * For Batch type Integration ⇒ Start the integration process by manually clicking on the Sync Now button.
  * For Dynamic type Integration ⇒ Copy URL and share across different systems to access data from the system
* **View Logs:** To view Logs or results of the data synchronization
* **Enable/Disable Autopilot Mode:** To enable or disable Autopilot mode (Only for Batch type Integration).

{% hint style="warning" %}
*For Dynamic pipe, scheduling is disabled.*
{% endhint %}

**Enable/Disable Console Logs:** To enable or disable console logs for this Integration

* **Auto Pilot Mode and Scheduler:** The Sync process for Batch type integration can be automated by scheduling it. This is done by clicking on the Enable Auto Mode link present just below the pipe name or clicking the icon and then editing the synchronization time.

### 3.4 Creating a New Integration Pipe

From the Integrations page, click on the **Add New** button in the top left section of the page. This is where users will Add a new Pipe by defining the Mapping and Modifier functionalities.

**Step 1:** Enter a suitable name for the pipe.

*Example: Customer Update, Create Order, Fetch Subscription Details*

**Step 2:** Choose the type of Integration: Batch or Dynamic.

**Step 3:** Choose Credentials (Systems to Integrate) from the drop-down list.

**Step 4:** Once the credentials are selected, the Flows with API calls to the systems (Credentials) selected will be displayed in grid format on the right side. Choose a Flow from the grid.

**Step 5:** When the Flow is selected, the Mapping nodes associated with the Flow are available to the user to configure.

### 3.5 Mapping and Modifiers

Once the Flow is selected, the associated Mapping nodes are available to the user, i.e., if it has been added in the Flow. Clicking Configure on the Mapping card, opens a Mapping window where the user can map and modify data as required.

Mapping is used to steer data from source to destination systems. Here, the source and destination fields listed on either side. These fields are taken from the API Manager - Source and Response fields respectively. In addition to these fields, the user can add custom fields as needed. Users can drag and drop the fields to be mapped as shown below:

<figure><img src="/files/Tlw5Unuh7nARKCtXnQk6" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/WwZsY4LxCAF2lojRAw0T" alt=""><figcaption></figcaption></figure>

The data can also be formatted using the Modifier functions. For more information on [Mapping and Modifiers, click here](https://docs.cloras.com/user-guide/projects/integrations/mapping-and-modifiers).

### 3.6 Logs

DCKAP Integrator will have a detailed record of each of the transactions happening between the two systems. Each record will have information about the entity ID, Status, Message and the Steps which will vary based on the type of transaction. For failed transactions, the Messages tab will show the reason for error for the respective transaction, which can be customized according to the business requirements for easy troubleshooting.

<figure><img src="/files/9CkTiyJEdBFwuN1VkkFn" alt=""><figcaption></figcaption></figure>

Click below for a detailed procedure on how to create Integration Pipes

{% content-ref url="/pages/-M-Swk9Qa-T1wcQeMkF5" %}
[Create a new Integration Pipe](/tutorials/create-an-integration-pipe)
{% endcontent-ref %}

For details about Project and User Invitations, click below:&#x20;

{% content-ref url="/pages/-M15UfXIeBYdQq8JNEQ6" %}
[Project Invitations](/user-guide/invitations)
{% endcontent-ref %}


# New User Registration

User Sign-Up instructions

## Requirements and Installation

DCKAP Integrator is a cloud (web) based application and can directly be accessed using any web browser. See below for steps on how to register/ login to DCKAP Integrator.

## How to Register?

Navigate to the registration page and provide the below details to create an account.&#x20;

* First Name&#x20;
* Last Name&#x20;
* Email Address

**Or Using Project Invitations**

A Project Owner in DCKAP Integrator can send out invitations to Integrator as well as Non-Integrator users to access a project.&#x20;

1. If you are a user who doesn't already have an Integrator account, and you have received a Project Invite email, click on the Manage Invite link in the invitation email.&#x20;
2. You will be taken to the DCKAP Integrator registration page, where you must enter the basic details and sign-up for a DCKAP Integrator account.
3. Once you login, the new Project Invite will appear as a pop-up where you can either accept or reject the invite.&#x20;

More on [Project Invitations can be found here.](/user-guide/invitations)&#x20;


# Available Plans

Subscription plans available to users

## Lite Plan&#x20;

The Lite plan is specifically designed for users who wish to use the Developer Modules of DCKAP Integrator at zero cost. Lite plan users have the following permission levels:

* Lite plan allows users to access only projects that they have been given access to by the project owner.&#x20;
* The user will not have permission to add projects.&#x20;
* The user is not allowed to access any other functionalities

This plan is completely free, thus the user will not have any trial period.&#x20;

{% hint style="info" %}
The Lite plan can be upgraded to any other plan (Standard, premium or enterprise) as needed.
{% endhint %}

For information about other plans, please click here: <https://www.dckap.com/integrator/pricing/>


# Integrator Dashboard

The dashboard is the landing page or the first point of access to the DCKAP Integrator Application

At this point, the project page is the default landing page. In future releases, Users will be provided with the ability to choose a different dashboard page from the available options like projects, analytics, support page and so on.

{% content-ref url="/pages/pgqsGoms1RfVSSOdXdD3" %}
[Projects](/user-guide/projects)
{% endcontent-ref %}


# Analytics

The Analytics page provides a high-level overview of the project(s). You can view the statistics of all your projects combined or as individual projects.

Track synchronization, storage, data transfer, resource utilization and execution details with intuitive charts for better insights. There are two levels of analytics.

### User-Level Analytics

The analytics icon is located on the left-side menu. This section offers valuable insights into resource utilization, helping the logged in user to identify which projects or integrations are consuming the most resources. This section offers a comprehensive visualization of data across all projects owned by the user, with options to filter by projects and analyze data over specific time periods.

{% hint style="warning" %}
This section allows you to view only the self-owned projects.
{% endhint %}

### Project-Level Analytics

To view analytics for a specific project, navigate to the project and click on the analytics icon. Project-level analytics are accessible to all users associated with the project.

## Analytics Dashboard - Overview

### Summary

The summary tab displays general key metrics.

#### Synchronizations

This curve graph displays the number of success records and failure records over a specific time period. This count includes all types of integrations - pipes and workflows—batch, scheduled, and dynamic.

<figure><img src="/files/srJfpHKdCQL6UW9VRX7Q" alt=""><figcaption></figcaption></figure>

#### API Hits / Code Runner Hits / Email Hits

This curve graph provides details on&#x20;

* API Hits: Number of API calls sent to different systems
* Code runner Hits:  Number of workflow code runner invocations
* Email Hits: Number of emails sent from your project. This includes failure alerts, health checkup and so on.

<div><figure><img src="/files/vBAQrqFghmAWPZfSQOHX" alt=""><figcaption></figcaption></figure> <figure><img src="/files/XO7oMXP5gfpzzkoQ9uwH" alt=""><figcaption></figcaption></figure> <figure><img src="/files/BtyZSWtWNuYYf1YOtgp5" alt=""><figcaption></figcaption></figure></div>

#### API Duration

This curve graph provides insights into the time consumed for all API calls sent in the project during the specified time period.

<figure><img src="/files/ZGM3ETQJ781Z21KpEv7b" alt=""><figcaption></figcaption></figure>

#### Trigger

The Trigger section illustrates the number of scheduled synchronizations, manual synchronizations, Lightning Dynamic Calls, DCKAP Integrator Hooks, Lightning Hooks, and DCKAP Integrator Dynamic Calls made during the specified time period.

<figure><img src="/files/TlroqqYpSA0EyMC5YNIZ" alt=""><figcaption></figcaption></figure>

### Execution

The Execution tab displays metrics related to computation performance. &#x20;

#### Execution Time

This graph provides insights into the time consumed by workflows for handling integrations.

<figure><img src="/files/zQjyQSuiauGIkurRFeWO" alt=""><figcaption></figcaption></figure>

#### Code Runner Time

This graph illustrates the execution time taken by various code runners at a specified time interval.

<figure><img src="/files/RftAFoPB7NUWIhRLrnSs" alt=""><figcaption></figcaption></figure>

### Storage

The storage tab helps to visualize the amount and frequency of data stored. The unit of measurement in the graph dynamically adjusts based on the data size, displaying in Bytes (B), Kilobytes (KB), Megabytes (MB), or Gigabytes (GB) as appropriate.

#### Console Logs

A part of the sample console log is mentioned in the below screenshot.&#x20;

<figure><img src="/files/69wP30Fg89kUVkqKOXbK" alt=""><figcaption></figcaption></figure>

This graph provides information about the storage occupied by the console logs generated by synchronizations.&#x20;

<figure><img src="/files/N9IhI1eBn56anvs61yOB" alt=""><figcaption></figcaption></figure>

#### Logs

Inside a project, on clicking the logs icon from the side-menu, all logs will be listed.&#x20;

<figure><img src="/files/CIGuKM7uG2qJxbiCLF8N" alt=""><figcaption></figcaption></figure>

This graph logs information about the storage occupied to store these log records in the database.

<figure><img src="/files/S7GRT1DeNYbjuml3qnwq" alt=""><figcaption></figcaption></figure>

#### Detailed Logs

Detailed logs store entity level information inside the logs.

<figure><img src="/files/n7vHDUFspCezPMpGc6my" alt=""><figcaption></figcaption></figure>

&#x20;The storage details of detailed logs is visible in this curve graph.&#x20;

<figure><img src="/files/853IlRjknIPKufyQy0Sw" alt=""><figcaption></figcaption></figure>

### Data Transfer

The data transfer tab helps to visualize the amount of data sent and received in the API calls of integrations. The unit of measurement in the graph dynamically adjusts based on the data size, displaying in Bytes (B), Kilobytes (KB), Megabytes (MB), or Gigabytes (GB) as appropriate.

#### Data Sent

The amount of data sent to different systems is shown in the graph. Example: The data sent in a POST API call.

<figure><img src="/files/IBWYrsfv7ccGmilmQzqr" alt=""><figcaption></figcaption></figure>

#### Data Received

The amount of data received from the system is reflected in the graph. Example: The data received in a GET/POST API call.

<figure><img src="/files/UrgmS43c1Ef7QXtnV6lO" alt=""><figcaption></figcaption></figure>


# The Basics

A quick introduction of how to navigate and use the DCKAP Integrator application.

### Using the DCKAP Integrator App

The DCKAP Integrator web app is designed in a way to make user navigation self-reliant and easy to access. The design of the Dashboard and  Project modules follow a procedural approach, in order to cater to every element in the Data Integration Life-Cycle.&#x20;

### General Menu

On the left side of the page, a Quick Navigation Bar is available with the following icons:&#x20;

| Menu Name          | Icon                                                         | Description                                                   |                                         |
| ------------------ | ------------------------------------------------------------ | ------------------------------------------------------------- | --------------------------------------- |
| Projects/Dashboard | ![](/files/aEze1pdNUDggz5aO3Kn7)                             | Create and manage projects                                    | [Navigate](/getting-started/dashboard)  |
| Analytics          | <p></p><p><img src="/files/5qqtJXWQnQitjtGz1Ftm" alt=""></p> | A quick overview of project stats                             | [Navigate](/getting-started/analytics)  |
| Invitations        | ![](/files/0Clx51ivcjH32MtuT9A0)                             | Respond to Project and User Group invitations                 | [Navigate](/user-guide/invitations)     |
| Help and Support   | ![](/files/1m2yigpik3R9H8zu5DcL)                             | Access to Customer Support and DCKAP Integrator Documentation | [Navigate](/user-guide/contact-support) |

*(Click on the Navigate link in each row to read more about each of the respective modules.*)


# Account Management

Managing user information and account settings from the drop-down menu that is accessed by clicking the User Name, located at the top right section of the page.

## Account Menu

Upon clicking the grey drop-down arrow next to the username (top right section), you will see the following options:&#x20;

| Menu Name                                                 | Icon                                                                                                                                                                            | Description                                                                                                                                                                                                                                                      |
| --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Edit Profile                                              | ![](https://lh3.googleusercontent.com/jQMRgY5uRaVNaP5q3PfvD1mZOybHFkZ4xdQMyLmVaUZSJn-JOFY8xIO-M2-IegJibr7BkqlppPdtdtC5NaBeiXKBkjdBK9-rOviWD4VI7HDKDFt4MKOS7sScdUiBKCllTy9uXDaf) | <p>Make changes to your profile including: </p><ul><li>First Name</li><li>Last Name </li><li>Email Address</li><li>Company</li><li>Website</li><li>Phone Number</li></ul>                                                                                        |
| Account Settings                                          | <p></p><p><img src="/files/-M51EyoSDmB4HaFoOh9c" alt=""></p>                                                                                                                    | <p>Manage your account settings such as: </p><ol><li>Timezone - Schedule and manage everything in the selected timezone, </li></ol><p>Selecting Yes in the Override Project Timezones will display all the projects data and time in the selected timezone. </p> |
| [User Groups](/user-guide/account-management/user-groups) | ![](/files/-M51FATgIL6MgRye5O9e)                                                                                                                                                | Create and Manage User Groups that you have created. More on User Groups can be found [here](/user-guide/account-management/user-groups).                                                                                                                        |
| [API Keys](/user-guide/api-access-keys)                   | ![](https://lh5.googleusercontent.com/6bENXSFv-yYmyaQrAcM0srfBvvAFR2ItDiA-epUzvqDKykqSsMyh_fInRrdUQEP4PHtP-tcXmwkA9XTsJVGtoDJWYmViD_XBt9lX-pK3gQTWz4ICDoskY4XC62xQuw4HFUKSY8o6) | Create and Manage tokens to provide limited access to third party systems                                                                                                                                                                                        |
| Change Password                                           | ![](https://lh5.googleusercontent.com/e7AFyTqeHhvJ_kGN22OkTP1jtu28s3tHrYGq7jBPnth8lX44NdPxcN9KwSeUJJ4YLRcaK7zAL5q6tw4RaOPgjEsxdBjwxXLXc8EBoc_3RMFTzGnoH_kXoh73noMve2-_-q1HNgWn) | Change login password                                                                                                                                                                                                                                            |
| Signout                                                   | ![](https://lh6.googleusercontent.com/l9EvN7kBfmEqwizkEwl7GMavoqd9oL4V7u3xiqMdTneiXUbo_cMORPq8RbmXFTDv_vNOkY6CHIWEWO7ZcriCJlFIjeYhEIQkC35sL-2keaDMqKq5YkQukqspvMyHe_g1YB8jBA7e) | Logout from application                                                                                                                                                                                                                                          |


# User Groups

This is where project owners/administrators can add and maintain a User Group.  User Group is a set of users who have similar access levels to any project.

## Purpose&#x20;

User groups simplify a Project Owner's task of managing users for his project.  This gives all the users in the group the same permission and access levels to the assigned project.&#x20;

{% embed url="<https://youtu.be/H2V3ObD5rnI?si=-ZRGsmc1-GLTITG1>" %}

## Managing User Groups

Click on the user icon in the top right section and click on Account Settings.&#x20;

<div data-full-width="false"><figure><img src="/files/ybTegRSZDvq0azWMsITy" alt=""><figcaption></figcaption></figure></div>

Clicking on the "User Groups" will open the User Groups page with the following details in tabular form:&#x20;

* Group Name&#x20;
* Description
* Created By
* Action (Edit/Clone/Delete)

<figure><img src="/files/44gD95mZjq8ZrqJw7Sa7" alt=""><figcaption></figcaption></figure>

To create a new user group click on the **Create User group** button in the top right section of the page or the **Edit** button under the Action field.

<figure><img src="/files/tuadZWH8Gc4OGGleR08Q" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/2ayBCw8dqD2e7oPn46tN" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/BMsyxxDCKabuNwm2P2lo" alt=""><figcaption><p>Managing Users</p></figcaption></figure>

Fill out the following fields in the Add New page:

| Field Name                                                               | Description                                                                                                                                                                                                       |
| ------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Group Name                                                               | Provide a suitable name for your user group                                                                                                                                                                       |
| Group Description                                                        | Provide a brief description for your user group                                                                                                                                                                   |
| [Access Level](/user-guide/account-management/user-groups#access-levels) | <p>Choose from three options: Admin, Standard, Custom.</p><p>To learn more about permissions for each access level, click <a href="/pages/-M-E_YZJWRcOM0W4jUFe#access-levels">here</a>. </p>                      |
| Access Control                                                           | This shows up only for the Access Level: [***Custom***](/user-guide/account-management/user-groups#custom). Here you can customize the group's permission level for each of the project resources.                |
| Add User                                                                 | <p>Add users to the group by providing their email address. </p><p></p><p>An invitation is sent to the User asking for confirmation. Only after the user accepts the invitation, they are added to the group.</p> |

{% hint style="warning" %}
The group owner may remove a user from the group by clicking on the Remove button.&#x20;
{% endhint %}

{% hint style="success" %}
Non-DCKAP Integrator users may also be added to the project. An invitation will be sent out to them to sign up for a DCKAP Integrator account.&#x20;
{% endhint %}

### Access Levels

Access levels denote the permission rights of user groups for a project. A user group may be assigned to one of the three available access levels:

#### Admin

Has complete access to the project except deleting and transferring the project ownership. The admin has the ability to provide project access to any user or user group.

#### Standard

Has standard access to the project and the ability to do all basic things. This access level is one level below the admin. The standard user has some restrictions which include:

* cannot delete the project
* cannot transfer the project
* cannot change project settings/configuration
* cannot provide project access to any other users/groups

####

For step-by-step instructions on how to create user groups and also give access permissions to User groups, click below:&#x20;

{% content-ref url="/pages/-MCLQLk-LYniiwEd3mDi" %}
[Managing User Groups](/tutorials/managing-user-groups)
{% endcontent-ref %}


# Account Settings

Users' account configuration can be managed from here and the user can manage timezone, notifications and so on. This configuration will be applicable to all the projects the user has access to.

Click on the user icon in the top right section and click on Account Settings. Under "General Settings", users can manage the below options.

![](/files/-M7gfOruxH-NLtujoZ8k)

### General

#### Override Project Timezones&#x20;

If yes, all the date and time are displayed in the chosen timezone below.&#x20;

#### Timezone

To manage all date related information in the product in the selected timezone.

#### Allow Force Login

To allow DCKAP Integrator Admin to login to your account.&#x20;

Once the options are chosen, click on **Save** Configuration to save the settings.


# Two-Factor Authentication

Additional layer of security to access DCKAP Integrator

The Two-Factor Authentication feature offers an additional level of security to access DCKAP Integrator. Two-Factor Authentication adds an additional layer of security to your account by requiring more than just a password to sign in.

**Steps to enable the 2-factor authentication:**&#x20;

1. Log in to DCKAP Integrator.
2. Click on the user's name in the top right section of the Dashboard page.
3. Click on Account Settings
4. Under "Two Factor Authentication", click on "Enable Two-Factor Authentication".

![](/files/DuhSE5TNeZlbd5LZDhpx)

5\. Choose one of the two methods in order to enable two-factor authentication:

![](/files/Yc24irle2u2vCf84QJXG)

1. **Method 1 (Recommended): Setup using Authentication App**&#x20;
   * &#x20;Use an application on your phone to get two-factor authentication codes when prompted.&#x20;
   * We recommend using cloud-based TOTP apps such as 1Password, Authy, LastPass Authenticator, or Microsoft Authenticator.&#x20;
   * Click on "Setup using Authentication App" and hit Next.
   * A QR code will be displayed.
   * Use any Authenticator app on your phone to scan the QR code.
   * After scanning the QR code image, the app will display a 6-digit code.
   * Enter the code from the application in the space provided and hit "Verify".
   * Two-factor authentication is now enabled for your account.
   * Every time you log in to DCKAP Integrator, you will be prompted to enter the Authentication code sent to your Authenticator app.
2. **Method 2: Setup using Email**&#x20;
   * DCKAP Integrator will send you an email with a two-factor authentication code when prompted.
   * Click on "Setup using Email" and hit Next.
   * DCKAP Integrator will send an Authentication code to your email address.&#x20;
   * Enter the code in the space provided.
   * Two-factor authentication is now enabled for your account.
   * Every time you log in to DCKAP Integrator, you will be prompted to enter the Authentication code sent to your email address.

{% hint style="info" %}
Two-factor Authentication may be disabled from the Account Settings page if not required.
{% endhint %}


# Projects

The Projects page is considered the epicenter of the integration process, where users can create, edit and access all the projects that they have access to.

<figure><img src="/files/Qzg8383r19BU3duofjaW" alt=""><figcaption></figcaption></figure>

All projects are displayed as individual cards with details - project name and project owner name. Click anywhere on the project card to navigate to the project space, where the user can access, edit, and create different features (Integrations, Systems, Flows and so on) of the project.

## Starred Projects

Users can star the most used or favourite projects to make them stand out and easily accessible on the project's screen.

## **My Projects**

All the projects which the logged-in user owns will be listed here

## **Shared With Me**

All the projects to which the logged-in user got shared access to will be listed here. Please note that the project will be displayed here only after the user accepted the project invite.

{% hint style="info" %}
The above tabs will be displayed only if it has any project. If the user doesn't own any project, the "My Projects" tab will not be displayed. If the user doesn't have any shared access, "Shared With Me" will not be shown.
{% endhint %}

## Project - More Options

### Quick Overview

Users can take a look at the project details from this screen itself by clicking the "Quick Overview" of that project. This shows the details like project description, shared access details, project documents, and connected systems.

<figure><img src="/files/eTgIWpvEjxMsJErWpmiN" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/R0PACa20fLubCE902cYM" alt=""><figcaption></figcaption></figure>

###

### Transfer Ownership

This allows the user to transfer the ownership of the project to another user. Please note the other user should be an administrator of that project. Ownership transfer is allowed only for the projects that the user owns. [Learn more](/user-guide/projects/transfer-project-ownership)

{% hint style="info" %}
All project data will be immediately transferred except logs and detailed logs. These logs will be transferred in the background and may take some time.
{% endhint %}

### Leave Project

Users can leave access to a shared project. Once left, the user can no longer access the project.

## Switch Projects

Once the user is inside the project, the user can switch to a different project by clicking the project name in the top left corner.

<figure><img src="/files/cbEDeMLmYBCnU8b5bcR1" alt=""><figcaption></figcaption></figure>

A popup will appear with all the projects to which the user has access. The user can search and choose the project to switch.

## Add New Project

{% content-ref url="/pages/2l6YNbvEIgvN9Hu5MPwD" %}
[Add New Project](/user-guide/projects/add-new-project)
{% endcontent-ref %}


# Add New Project

Creating a project is the first step in setting up your integrations. The project name is sufficient to create a new project.&#x20;

<figure><img src="/files/gDSYMbHjHEX8o6HmQBik" alt=""><figcaption></figcaption></figure>

Users also have the ability to provide additional details while creating the project. Click "More Options" in the above popup.

<figure><img src="/files/zvH2nO11ffNYgJjBYEJJ" alt=""><figcaption></figcaption></figure>

**Additional Details:**

1. Project Name - Name of the Project
2. Project Description - Description of the Project
3. Timezone - To schedule and manage everything in the user's timezone.
4. Console Logs - To enable or disable console logs to be displayed on the Logs page.
5. Console Logs Options -  Various log display options are available to the user to choose from

   1. API Method and URL
   2. API Request Information
   3. API Response Information
   4. API Header Information
   5. API Params Information

   Selected options will be logged for all pipes in the Project.&#x20;
6. Activity Logs - DCKAP Integrator enables Project Owners and Administrators to view and track activities performed in every individual module of the Project. To see those activities details you will need to enable that
7. Email Failure Alerts - To enable or disable synchronization-failure email alerts. These emails are sent if an error occurs during the data synchronization.&#x20;
8. Email Address - Provide one or more email addresses to which failure alerts have to be sent.
9. Failure Alert Trigger Options - Choose one of three options to trigger emails when the selected events happen:&#x20;
   1. For Pipes with Any Errors (Both Partial and Completely Failed)
   2. For Partially Failed Pipes Only
   3. For Completely Failed Pipes Only
10. Project Documents - You can add the necessary documents for the respective project

Now click "Create Project" to create the project. After creating the project you will be navigated to the project Integration Page<br>


# Managing Projects

Every DCKAP Integrator project is made up of integration units called Pipes. These units, in turn, contain flows and mapping configurations.

The Projects page consists of a list of all the projects that the user has created or has been given access to. More information can be found [here](/user-guide/projects).&#x20;

Click on the **project** to go to the **Integrations** page which is the hub of the project. From here users can edit and play with the development of the project as needed.&#x20;

On the left side of this page, icons for easy navigation and access to various components of the project are present. These icons include: <br>

| Menu Name                   | Icon                             | Description                                                                                                                                       |                                               |
| --------------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- |
| Integrations                | ![](/files/2KFu245Wq3zxgN0J86PX) | Quick access to all integration units (pipes) and also to create new integrations, to synchronize data transfer, view logs, and edit integrations | [Navigate](/project-manager/integrations)     |
| Systems                     | ![](/files/FQUkFmTIGfdKRDTzMrfa) | View, edit and add systems & its credentials                                                                                                      | [Navigate](/project-manager/systems)          |
| Logs                        | ![](/files/YzuVKDmTu09AOgdmmhx0) | View high-level and detailed log messages, and results of the sync process                                                                        | [Navigate](/project-manager/logs)             |
| <p>Project Settings<br></p> | ![](/files/JYAWtu8WaFcJunZcpMg7) | Edit project settings such as timezone, dashboard settings, email notifications, and other notification settings                                  | [Navigate](/project-manager/project-settings) |
| Advanced                    | ![](/files/TFBDfcOR9DYpY4xcJeLN) | Developer related modules to build Flows and manage APIs                                                                                          | [Navigate](/project-manager/advanced)         |

## Activity Logs

A new feature in DCKAP Integrator enables Project Owners and Administrators to view and track activities performed in every individual module of the Project.&#x20;

![](/files/-MEbeT9yIndV8x_zWZZ5)

The Activity History button is found on the top-right section of the Integrations, Credentials, Flows, and API Manager pages. Users may track the activities of these modules as a whole, or on individual entities within the modules.&#x20;

> For example, Activity History of all the Project Credentials or for a single Credential within a Project.

![Activity Logs for all the Credentials in a Project](/files/-MEgVlCQCe4xyT_1PJlz)

![Activity Logs for an individual Credential entity](/files/-MEgVstYRUW--t_S_vkA)

The main purpose of the Activity Logs is, whenever a user creates, updates, or deletes any entity within the project, the Project Owner and Administrator can track said changes along with their date and time. It serves as a version history for the Project, thus helping Project owners retrieve details in the future as well.&#x20;

Apart from the defaults events that are tracked in Activity Logs, the following additional events are also tracked:&#x20;

* Console Log Enable/Disable&#x20;
* Automode Enable/Disable&#x20;
* Changing Automode Schedule&#x20;
* Time Status Enable/Disable

{% hint style="info" %}
By default, the Activity Logs are disabled. To enable Activity Logs, navigate to your Project Settings and enable Activity Logs.
{% endhint %}


# Transfer Project Ownership

Users can transfer the ownership of the project to another user. Ownership transfer is allowed only for the projects that the user owns. Please note the other user should be an administrator of that project.&#x20;

All project data will be transferred immediately except logs and detailed logs. These logs will be transferred in the background and may take some time. Both previous and new project owners will be notified when the transfer is complete.

Follow the below guidelines while transferring the project to ensure a smooth transition.

## Guidelines

### Before transfer

* Disable all the pipes and ensure no synchronization is running to avoid any data loss. If any synchronization is running, either kill it or wait for it to complete.
* Be aware that dynamic service calls or webhooks will not work during the transfer.
* Notify other project members to avoid any activities in the project during the transfer.

### After transfer

* Enable the pipes and ensure everything is running as expected.
* It is recommended to change the authentication keys of dynamic service calls to the new user key.&#x20;

{% hint style="warning" %}
Console logs transfer is not supported for now. Once the project is transferred, project members can no longer access the old console logs. This will be addressed in the upcoming releases.
{% endhint %}

In case of any errors during the project transfer, kindly raise a ticket in Support Ticketing Portal.


# API Access Keys

Token generation for Dynamic Calls

DCKAP Integrator supports **dynamic calls** from various systems to synchronize data on the go. (Read about [Dynamic Pipes here](/project-manager/integrations#dynamic).)&#x20;

The URL that is copied from the Dynamic Pipe is called from a system in order to read or write data. This URL is in turn made up of [API calls](/project-manager/systems/api-manager) (written inside Flows), which communicate with the respective systems to fetch data.&#x20;

For additional security purposes, DCKAP Integrator also sets authentication in place.&#x20;

{% hint style="success" %}
Users can use the below authentication method while making API calls

* **Token Authentication**: The dynamic token generated with an expiry time by DCKAP Integrator
  {% endhint %}

### Token Authentication

A dynamic token generated from the user account, to be shared with the other systems.  Click on the user icon in the top right section and click on Account Settings. Under "API Keys", users can manage the below options. The Create New Token page opens.&#x20;

#### Create New Token

![](/files/-M-P9tLfk1yhoha3XnLk)

Provide the following information to create a new account.

| Field Name | Description                                                     |
| ---------- | --------------------------------------------------------------- |
| Token Name | Any name for the user to identify later                         |
| Days       | Days of Expiry. The token will be expired after specified days. |
| Password   | Your Account Password                                           |

* Once generated, the user can copy and enter the token while triggering a Dynamic Call from various systems.
* Users can now generate Access Tokens of smaller size (64 characters) in the API Keys Module. &#x20;
* Dynamic Calls: During dynamic calls, it is possible to authorize DCKAP Integrator by using access\_token, jwt\_token in headers/params.

> Examples:
>
> <http://0.0.0.0:2020/v1/dynamic/listener/\\><id>?access\_token=\<token>
>
> <http://0.0.0.0:2020/v1/dynamic/listener/\\><id>?token=\<jwt\_token>

* This token is given as part of the header information in the following format:&#x20;

```
Key		     Value
Authorization	     Bearer {token}   
                     access_token {token}
```

{% hint style="danger" %}
Setting days to ***0*** (zero), will set the token expiry to ***unlimited***.
{% endhint %}


# Project Invitations

The Invitations page is where users can manage "Project" and "User Group" invitations.

The Invitations page can be accessed by clicking on the ![](/files/SN5RYtlCrhpS7LlgVfM9) icon in the bottom left side of the page. From this page, users will be able to Accept or Reject invitations that have been sent to them. Both Project invitations and Group invitations that the user has received will be listed on this page.

### Invitation emails&#x20;

An email will be sent to the user once they are added to a group or project.&#x20;

If the user clicks on **Manage Project Invite** in the email, they will be redirected to DCKAP Integrator where they can manage the Invitations.

![](/files/-M0MmI3wP4pzpGbxIJ8g)

Users also have the option to "Invite All" or "Decline All' the Project and Group Invitations.

![](/files/93Di8Ah1BnVCIwAUYw0Q)

{% hint style="warning" %}
Invitations will be sent only when a user is added to a group. If the group is then added to a project, the user will not be intimated about this addition. &#x20;
{% endhint %}


# Help and Support

DCKAP Integrator Knowledge Base and Support Center

Quick video explainer of Help and Support:&#x20;

{% embed url="<https://www.youtube.com/watch?v=endkmjsCPN4>" %}

The DCKAP Integrator web interface is built in such a way, that users can sign up and start using the app from the word "Go". However, should users face any issues, the DCKAP Integrator Help and Support section will provide solutions as required.

The Help and Support page is a one-stop hub where users can get all their questions answered and receive technical support when required.&#x20;

<figure><img src="/files/MbE3qJqSpUG8DI5yIuRY" alt=""><figcaption></figcaption></figure>

This page is divided into six sections for easy user navigation and to find solutions quickly.

## Blogs and Articles

The DCKAP Integrator community consists of a diverse group of users ranging from developers to testers and managing personnel to actual end-users. This section contains a wide array of blogs written by various members of the community. Categories of blogs include:&#x20;

1. Technical Blogs&#x20;
2. Problem - Solution-based blogs&#x20;
3. Informative and Research-oriented blogs&#x20;
4. Blogs on current and latest trends
5. And many more.&#x20;

## Video Tutorials

DCKAP Integrator is a platform-agnostic integration middleware that makes data integration robust, with no compromise made on the user-friendly interface of the tool. For this purpose, several video tutorials are available in this section which consist of step-by-step instructions on how to perform actions, both simple and complex.&#x20;

With straightforward instructions and accurate graphics, these video tutorials will guide users through the DCKAP Integrator application and will help them perform any action.&#x20;

## Documentation

The one-stop hub to access DCKAP Integrator's Technical Documentation. From User Guides to API Documentation to Developer Documents and Tutorials, the DCKAP Integrator Doc kit is your go-to solution for any underlying questions. With end-users in mind, the DCKAP Integrator Documentation is crafted in such a way that, users get answers to any questions related to DCKAP Integrator.&#x20;

The Doc-kit is split into the following sections:&#x20;

1. Use Guide: A manual on how to use the various modules of DCKAP Integrator
2. Tutorials: Step-by-step instructions on how to perform some of the most common tasks in DCKAP Integrator
3. Developer Documentation: In-depth Technical Documentation to guide developers who write flows and develop APIs.
4. API Documentation: A guide to develop DCKAP Integrator APIs.&#x20;
5. Release Notes&#x20;

This section navigates to the list of features and updates added to DCKAP Integrator during every release. With periodic updates, our developers and the DCKAP Integrator community ensure that the product is up-to-date and meets user expectations without a glitch.&#x20;

## Raise a Ticket

{% content-ref url="/pages/lGiIiNca6pwYH8u7lqW3" %}
[Raise a Ticket](/user-guide/contact-support/raise-a-ticket)
{% endcontent-ref %}

## My Tickets

This section list all the tickets raised by you and their statuses.

<figure><img src="/files/sRWm6Q8ZtVs1AS2WPmP9" alt=""><figcaption></figcaption></figure>

Click on the ticket row to view, manage or reply to the ticket.&#x20;

<figure><img src="/files/KG0sGZju7BYPXY1eW8Cv" alt=""><figcaption></figcaption></figure>

### Shared With Me

This section lists all tickets that other users have created and shared with you. It is either shared explicitly with you as a collaborator or you are a member of a project with the project-level ticket.

<figure><img src="/files/94mExxYMCVNOaKzeaTIg" alt=""><figcaption></figcaption></figure>

### Closed Tickets

In this section, you can see all closed tickets.

<figure><img src="/files/I38PFJ6Wn3A1T4wY8ZSo" alt=""><figcaption></figcaption></figure>

### CC Members

Ticket Owners can add CC Members to send email notifications to other users. This does not allow the other user to access or reply to the ticket.&#x20;

{% hint style="warning" %}
The CC Members feature is deprecated and will be removed in the upcoming releases. It is recommended to use [collaborators](/user-guide/contact-support/visibility-and-collaborators#collaborators) instead.
{% endhint %}


# Raise a Ticket

&#x20;For a quick video explainer of Raising a Ticket, [click here](https://youtu.be/S77ofH-ff1k?feature=shared).&#x20;

<figure><img src="/files/SqdnLsdq9KQAeHmxhZoC" alt=""><figcaption></figcaption></figure>

Users can raise any concerns or provide feedback using the Help & Support section.

### How to raise a Ticket?&#x20;

<figure><img src="/files/EUIP04gSlQUIHfsdgBUS" alt=""><figcaption></figcaption></figure>

1. Click on *New Ticket*. The New Ticket window opens.&#x20;
2. Choose a Category that you think the Issue best fits in
3. Choose visibility. If Project, all project members can access the ticket. If Private, only you can access the ticket. However, in private, you have the ability to add an individual user as a [collaborator](/user-guide/contact-support/visibility-and-collaborators#collaborators).
4. Choose Severity.&#x20;
   * *Low:* Minor issues that do not require immediate attention.
   * *Normal:* Issues that need attention but are not urgent.
   * *High:* Critical issues that require immediate action.
5. Enter a Subject for the issue
6. Enter a description briefly explaining the issue or feedback you wish to provide.
7. Attachments: Include any attachments if necessary. File size should be less than 5MB and allowed formats are ( .png, .jpg, .jpeg, .doc, .docx, .pdf, .csv, .xls, .xlsx )
8. Click on Submit to submit your ticket
9. An acknowledgment email will be sent after creating the DCKAP Integrator Ticket

{% hint style="info" %}
Who are Collaborators?

Collaborators can view, reply, and get email notifications for this ticket. Only project members can be added as collaborators. [Learn more](/user-guide/contact-support/visibility-and-collaborators#collaborators).
{% endhint %}

#### Using the AI Content Checker

The AI Content Checker helps users correct grammar and rephrase their content within Support Tickets. After drafting a reply, users can click the “Refine with AI” button to improve their message using this feature.

### Create or Reply to Tickets by Email

#### Creating a Ticket

1. Email <support@dckapintegrator.com> with a subject and body content to create a support ticket.&#x20;
2. Tickets created through email are private, configured to low priority, categorized as support mail, and **have no project assignment**.
3. To change the default settings for a ticket, users can log in to the application and modify them.

{% hint style="info" %}
Attachments (under 5MB) are supported in the following formats: `.png, .jpg, .jpeg, .doc, .docx, .pdf, .csv, .xls, .xlsx.`
{% endhint %}

#### Replying to Tickets

1. Users can now directly reply to DCKAP Integrator Support Tickets from the same email thread.
2. To reply to a support ticket from a fresh email thread, email to <support@dckapintegrator.com> with the subject `DCKAP Integrator Support Ticket #TicketID` and a body content.
3. If the user doesn't have access to the ticket or the ticket ID is invalid, an invalid acknowledgment email sent to the respective user.


# Visibility and Collaborators

## Visibility

This feature makes the ticket accessible to other users based on one of the below option chosen.&#x20;

* [Project](#project)
* [Private](#private)

### Project

All project members can access and reply to the ticket.

### Private

Only you can access the ticket. However, in private, you have the ability to add an individual user as a [collaborator](#collaborators).

## Collaborators

Collaborators can view, reply and get email notifications for the ticket. Only project members can be added as collaborators.

{% hint style="info" %}
Email notifications are disabled by default for the collaborators. Collaborators can manually enable the email notification for the shared ticket.&#x20;
{% endhint %}

### Add a Collaborator

Open a ticket to add a collaborator. Choose a project member from the list to add as a collaborator. You can only add individual collaborators for tickets with private visibility.

{% hint style="info" %}
For project visibility, all project members are collaborators by default.
{% endhint %}

<figure><img src="/files/IhWKmVTMyAxlpxyl9V87" alt=""><figcaption></figcaption></figure>

### Remove a Collaborator

Remove a user from the ticket collaborator list.


# Exchange

Build and use DCKAP Integrator templates in projects

The Exchange contains ready-to-use Templates that can be used to integrate data between one or more systems without any tedious, manual configurations. These pre-built Templates can be used and reused across multiple Projects or re-configured based on the users' needs. They act as a base arrangement, containing default field mapping, basic flow structures, and standard pipe settings.

## Accessing the Exchange Page

The exchange page can be accessed:

1. From the Dashboard or
2. From the advanced tab in the Projects Page

### From the Dashboard

Click on the Exchange module from the left menu bar. While doing so, the user will have to select the Project under which this Template will be created.

![](/files/-MZWijYJIWatJJB-PNju)

### From the Advanced tab on the Projects page:

Go to any individual Project and click on the Advanced tab and then click on the Exchange option. Now the Exchange page for this particular Project will open.

![](/files/-MZWiuiZ1vOxjd0onJuV)

## The Exchange Page

### A. Create a Template

To add or create a Template, click on the Create Template button in the top right corner of the Exchange Page.

![](/files/-MZWj62iRqCFV8kbeXPg)

Fill out the following details in order to create a new Template.

![](/files/9E5fbZLE7gGhqaAPXOhh)

1. **Template Name:** Enter a suitable name for the Template
2. **Public or Private:** Choose the type of Template:
   1. Private: A private Template will be accessible only to the user who has created the Template. It can be accessed across all of their Projects.
   2. Public: A public Template is a global Template that is available to all DCKAP Integrator users.
3. **Status (Enabled/ Disabled):** Toggle the button to enable or disable a Template for use in Projects
4. **Short Description:** Enter a short description for the Template
5. **Detailed Description:** Enter a detailed description for the Template
6. **Choose pipes:** The pipes created within that particular Project will be displayed to the user to choose from. Users can select one or more pipes that will act as the base framework for the Template.

![](/files/-MZWjXz4A_LePS8-DaEn)

**Save Options:**

1. Save Draft: To save the Template without publishing
2. Save and Publish: To save and publish the Template. Add a Release version and Release Notes for the Template

Once the Template is published, it is available to use in a Project at a public or private level.

### B. Edit a Template

Click on the three dots in the Template grid, to edit or delete a Template. By clicking on the Edit option, users can modify the Template configuration.

![](/files/-MZWjefHtw1pjmLSrmeR)

###

### C. Use Template in a Project

Once the Template configuration is complete, it can be used in a Project. Click on the Use Template button in the Template grid. The Use Template page will open. The following information is available:

![](/files/-MZWjp0zNMZ1k7t25AXV)

**1.Pipes**: The pipes chosen in the base Template are displayed here. Users can choose one or more pipes to use in their Projects.

{% hint style="info" %}
If any pipe configuration variable needs to be set up, it will be displayed here to be updated by the user.
{% endhint %}

**2. Credentials**: Based on the pipes chosen, the system credentials will be displayed. Click on the drop-down list under the system name and choose the necessary credentials.

{% hint style="info" %}
If the credentials are not previously set-up, the user will have to configure the credentials by clicking on Add Item in the drop-down list. Enter the credential details as described [here](https://docs.cloras.com/user-guide/projects/credentials).
{% endhint %}

![](/files/-MZWkH8VlFbzugkTU1lj)

**3. Future Updates:** Select one of three options from the drop down list to automate or disable updates to the template, when changes are made to the base template. :

* **No**: Any change to Template entities (Systems, Credentials, Pipes, Flows, and API management) will not affect the base Template.
* **Manual**: Any change to Template entities (Systems, Credentials, Pipes, Flows, and API management) will take effect in the base Template, after manual review by the user.
* **Yes**: Any change to Template entities (Systems, Credentials, Pipes, Flows, and API management) will automatically be reflected in the base Template.

![](/files/-MZWf6SaBQVty6JJE6lx)

Click on Create to use the template in the Project. If the pipes are set to Auto-mode then the sync will work periodically as per the set up time.


# Integrations

The Integrations section is where users will configure and set up pipes. Every pipe contains a name and system credentials, is linked with a Flow, and may or may not have a Mapping configuration.

### What is a Pipe?

A Pipe is a single integration unit, i.e., the sub-unit of every system integration, responsible for synchronizing all entities (Customers, Orders, Products, etc.). Each pipe is mapped to a Flow to carry out the underlying integration logic.

For a quick video explainer of What are Pipes?, [click here. ](https://www.youtube.com/watch?v=Bo2KymVaLHk)

<figure><img src="/files/WJ7WC01dtXsUgtgy3Xst" alt=""><figcaption></figcaption></figure>

### **Pipe Types**

#### Batch ![](https://lh5.googleusercontent.com/kXOx0IqyBOi1PlWrP0nTLdsIONPDzdqbmAoN8g-4dMS0HAW03yoqKoZpmm2OgqNPJzgDP9Msm4OlWl9vovciMYAk2WjGyOLn0zi3QYcIWfgn0iXGGLy5Q8YuVRAzru-xqPSLmxqd)

Data synchronization will be handled periodically at certain configured time intervals. This is the most commonly used Pipe type since it offers optimum performance.&#x20;

> *Example: Every 2 hours*&#x20;

#### Dynamic ![](https://lh3.googleusercontent.com/KStYMLew0pT1Ut2aekVjwQjEFI_yazpAz7ncASPeyB9tR4d8t0ucb8piQNTz4UdQSKveChy-ES4dhVEMkoqjKo01K9qHLyuB531hnrwQ4zQQIVRU-pLfBSdj8tDjYZVGwO94hVlb)

Data synchronization is done in real-time using an API call from any system through DCKAP Integrator. For example, services like Pricing may be configured as a Dynamic Pipe to fetch the prices in real-time.

{% hint style="warning" %}
Use the following URL to run all your dynamic services in integrator.dckap.com:

<https://lightning.dckap.com/v1/dynamic/listener/{pipe_id}>

This URL can also be got by clicking on the ***COPY URL*** button in the Integrations page.&#x20;
{% endhint %}

{% hint style="info" %}
During a dynamic call to V3 or lightning, 400 and 401 Status codes will be returned for a disabled pipe and invalid credentials respectively.

For all other errors, 200 Status code will be returned.
{% endhint %}

{% hint style="info" %}
During dynamic calls, it is possible to authorize DCKAP Integrator by using access\_token, jwt\_token in headers/params.

Examples:&#x20;

<http://lightning.dckap.com/v1/dynamic/listener/\\><id>?access\_token=\<token>

<http://lightning.dckap.com/v1/dynamic/listener/\\><id>?token=\<jwt\_token>
{% endhint %}

### Manage Pipes

The pipes are displayed either as a Grid or a table.&#x20;

![Integrations displayed as a Grid](/files/M64iorm9cPxqUQN89Oqo)

![Integrations displayed as a List](/files/so5THXNnzIQJkmnH7MAx)

In the Integrations page, the following information is present in grid/tabular form:&#x20;

| Field Name                                                                | Sample                                                                                                                                                                                                                                                                                                                                                                                                                | Description                                                                                                                                                                                                                                                           |
| ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Status                                                                    | ![](https://lh4.googleusercontent.com/ZzVVFGJVkHSea5oRZcC59MIJ0KMsrwqs9caW7qPOLdzr4UvOdVW1AkZZuxKaW46s3sazTWjXSF_YiHXsckWW3hyrihq4WKOA8HFwa61TaQCwO39aXKgOiWRfjM316eRch1lE8Ffh)                                                                                                                                                                                                                                       | Enables or disables the working of a pipe, used especially during scheduled synchronization                                                                                                                                                                           |
| Pipe Name                                                                 | ![](https://lh6.googleusercontent.com/x3DAtICublO3TdU1qdQuujmTZ_CfiCKZ6bwvIwhxmH0F7bVIljFQu9_ra8loreeCHVbfXWChwQplenTNSOEm5um6QO2FVUpNJWaHt-xzWYILGaFZChjbhbc2lIpNhuTK5YOtytOd)                                                                                                                                                                                                                                       | Displays the name of Integration Pipe                                                                                                                                                                                                                                 |
| Systems                                                                   | ![](/files/-M50mpWe0kze4E0ExjgT)                                                                                                                                                                                                                                                                                                                                                                                      | <p>Systems connected in the pipe<br></p>                                                                                                                                                                                                                              |
| Type of Integration                                                       | <p><img src="https://lh5.googleusercontent.com/kXOx0IqyBOi1PlWrP0nTLdsIONPDzdqbmAoN8g-4dMS0HAW03yoqKoZpmm2OgqNPJzgDP9Msm4OlWl9vovciMYAk2WjGyOLn0zi3QYcIWfgn0iXGGLy5Q8YuVRAzru-xqPSLmxqd" alt="">Batch </p><p><img src="https://lh3.googleusercontent.com/KStYMLew0pT1Ut2aekVjwQjEFI_yazpAz7ncASPeyB9tR4d8t0ucb8piQNTz4UdQSKveChy-ES4dhVEMkoqjKo01K9qHLyuB531hnrwQ4zQQIVRU-pLfBSdj8tDjYZVGwO94hVlb" alt="">Dynamic</p> | <ul><li><strong>Batch</strong>: When the data synchronization is done periodically </li><li><strong>Dynamic</strong>: When the data synchronization is done in real-time using an API call to the system</li></ul>                                                    |
| Sync status                                                               | <img src="https://lh4.googleusercontent.com/OBFCcRxKiZIfNxonzS4GwHwB8XmMcFb41SS2Dpcj05OJaRjeFvfCNPKOMS4GpvW_TI5YZg1sgo0v98aIDgkezGyLjg5SbKgZ61HdDd1KbgKX8J_dkXttQoiBRYd3ZfnhtOQhUPzm" alt="" data-size="original">                                                                                                                                                                                                    | Displays the time at which the last sync was performed and if the sync was complete or not                                                                                                                                                                            |
| <p><strong>Sync Now</strong> &</p><p><strong>Copy URL</strong> button</p> | <p><img src="/files/-M50mw1V8KLbm7UJVTFe" alt="" data-size="original"></p><p><img src="/files/-M50mxwSvXFWxKw628dn" alt="" data-size="original"></p>                                                                                                                                                                                                                                                                  | <p>For Batch type Integration ⇒ Start the integration process by manually clicking on the <strong>Sync Now</strong> button. <br></p><p>For Dynamic type Integration ⇒ <strong>Copy URL</strong> and share across different systems to access data from the system</p> |
| View Logs                                                                 | ![](https://lh3.googleusercontent.com/CnlGBD66Aw-qslPITVXm3Z9p4KXF6DX9-hzh1zFSk1pMlDVyBp2iJGiJ-tVdc_py2mLN9MCNlyfnbDvWLAzPTQu_Xl9b4yx8tYYoF_biFlZXqPoRVSLRt8XiX4Rn1ZuYk8jRpGPX)                                                                                                                                                                                                                                       | To view Logs of this pipe                                                                                                                                                                                                                                             |
| Enable/Disable Autopilot Mode                                             | <p><img src="/files/-M50nAa3NPRETd6YERn3" alt=""></p><p><img src="https://lh5.googleusercontent.com/szRw2c9WKuI-qj8l7bfPgRCF16VWcyHILgBXQsTSmlIFXFBx0CzHDcXV0Z6Vhcp8SvxEi_6pgWe5TxN0R2KhL-4pWnfAygtFVkjv1v-ZNWuN0fLFtAFVdPKnKT3P0rP7O5Dforbt" alt=""></p>                                                                                                                                                             | <p>Only for Batch type Integration. To enable or disable Autopilot mode.<br></p><p>For Dynamic pipe, scheduling is disabled.</p>                                                                                                                                      |
| Enable/Disable Console Logs                                               | <img src="/files/-M50n46232GM7PIANrFp" alt="" data-size="original">                                                                                                                                                                                                                                                                                                                                                   | To enable or disable console logs for this Integration                                                                                                                                                                                                                |

### Auto Pilot Mode and Scheduler

The Sync process for Batch type integration can be automated by scheduling it. This is done by clicking on the **Enable Auto Mode** link present just below the pipe name or clicking the ![](https://lh4.googleusercontent.com/JVzohu9PTtDH4S4N_bWS3Rg8V8zZas4uoxc8TTB-tkCuN5MyJnZxwpmj4J3pDqZxKm7Z652r72b2ypFkC-_PTe7opIVcpAWDFhN1pT_QMuANThR_oxBdz0Smhlm_vH1w4kTGHgCY)icon and then editing the synchronization time. The Minimum Interval Period for scheduling is 5 minutes

![](/files/-M4ScXP8fmcRPGbOLILc)

{% hint style="danger" %}
For a Dynamic pipe,  the ability to schedule is disabled
{% endhint %}


# Add New Pipe

This is where users will Add a new Pipe by selecting the system credentials and defining Mapping and Modifier functionalities.

From the Integrations page, click on the **Add New** button in the top left section to create a new pipe. &#x20;

![](/files/-M4Scf6QnRgLcQeGkgmq)

The following fields must be filled in order to create a new Integration Pipe:

### Pipe Name

Assign a suitable name for the Integration.

> *Example: Customer Update, Create Order, Fetch Subscription Details*

{% hint style="info" %}
Special characters (except space) cannot be used in the Pipe name.&#x20;
{% endhint %}

### **Pipe Type**

Choose the type of Integration: [**Batch** or **Dynamic.**](/project-manager/integrations#pipe-types)

### **Credentials**

Choose Credentials from the drop-down list (Credentials of the Systems that need to be integrated). The credential details have to be already configured.  [**Learn more**](/project-manager/systems/credentials#add-new-credential)**.**

### **Flow**

Once the credentials are selected, the Flows with API calls to the systems (Credentials) selected will be displayed in grid format on the right side. Choose a Flow from this grid.&#x20;

When the Flow is selected, the Mapping nodes associated with the Flow are available to the user to configure.&#x20;

{% hint style="warning" %}
If systems added in the Flow are selected incorrectly in the Edit pipe page (Credentials drop-down), an error will be thrown to the user alerting that there is a mismatch between Systems added in the Flow and credentials chosen.&#x20;

If wrong credentials are chosen in the Edit pipe page, the previously configured mapping will be retained.  Only if the Flow is changed, previously configured mapping will be removed.
{% endhint %}

### Mapping

Once the Flow is selected, the associated Mapping nodes are available to the user, i.e., if it has been added in the Flow. Clicking **Configure** on the Mapping card, opens a Mapping window where the user can map and modify data as required.&#x20;

Mapping is used to steer data from source to destination systems. Here, the source and destination fields are listed on either side. These fields are taken from the **API Manager - Source** and **Response** fields respectively. In addition to these fields, the user can add custom fields as needed.&#x20;

### Notes

Project users can add notes for individual pipes using an inbuilt text editor.&#x20;

### Email Alerts at Pipe level

Email alerts can be set for individual pipes.&#x20;

Click on Email alerts here:&#x20;

![](/files/-Miu4cMXsmXtcqdnpDcb)

**Consider Project Settings:** Choosing Yes/No will consider/not consider the email alert settings configured in Project Settings.

* **Yes**: The same email alert settings configured at the Project level will be considered for the Pipe
* **No**: The email alert settings configured at the Project level will not be considered for the Pipe:&#x20;
  * **Enable Failure Alerts**: Select Yes/No to enable failure alerts for this pipe
    * Yes:&#x20;
      * **Select Failure Alert Options:**&#x20;
        * All Failed
        * Partially Failed Only
        * Completely Failed only
      * **Email Addresses:** Enter the email addresses of recipients to receive failure alerts for this pipe&#x20;
    * No: Failure alerts will not be triggered at pipe level for this pipe

![](/files/-Miu4qYnf0-Hv3PaQGyO)

**Read More:**&#x20;

{% content-ref url="/pages/-M1QC6ufu3OeCk3zpHDG" %}
[Mapping and Modifiers](/project-manager/integrations/mapping-and-modifiers)
{% endcontent-ref %}

{% content-ref url="/pages/-M-Swk9Qa-T1wcQeMkF5" %}
[Create a new Integration Pipe](/tutorials/create-an-integration-pipe)
{% endcontent-ref %}


# Flows and Handlers

Technical information about [Flows and Handlers can be found here.](/developers/flows)


# Mapping and Modifiers

The Mapping node is used to link data from a Source system to a Destination system. The data that is being mapped is formatted using Modifiers.

## Introduction

Mapping in DCKAP Integrator is used to link data from a source system to a destination system. Data from the source fields are formatted using Modifiers and then mapped to the associated destination fields.

Integrations or Pipes are the components that process the data synchronization based on the associated Flows and Mapping configurations. Based on the selected credentials, every pipe is associated with one Flow. The Flow may/may not contain one or more Mapping nodes that are added while developing the Flow.

More on Integrations can be found [here](/project-manager/integrations).

More on Flows can be found [here](/project-manager/advanced/flows).

## Concept of Mapping

Flows are the neural schema of every integration. A flow determines how the data should be synched end to end. A flow usually contains one or more Mapping nodes, which will format and link data from the source system to the destination system.

In the Flow, the API calls to be used in the mapping node are defined.

These API calls are configured in the API manager either used to get data or post data. Also, sample response and request fields are added while configuring these APIs.

More on **API Manager can be found** [**here**](/project-manager/systems/api-manager)**.**

The fields from the sample 'Request' and 'Response' are then used in the Mapping nodes as source and destination fields respectively.

**Creating a New Pipe**

1. Open the Integrations tab and click on Add New.
2. In the Add Pipe page, enter a Pipe Name and select Credentials (systems).
3. Once the Credentials have been chosen, all the Flows associated with those systems will be listed in the drop-down menu. Choose a Flow.
4. After a flow has been selected, all the Mapping nodes defined in the Flow will be displayed as Mapping cards.
5. Click on Configure to make changes to the Mapping nodes.

### Mapping Configuration

Click on Configure in the Mapping Card and a new window will open where you can&#x20;

* Link fields
* Format data
* Modify data using modifiers
* Add custom fields
* Preview the mapping configuration
* Import or export mapping configurations

Here you will see Source fields on the Left-Hand side and Destination fields on the Right-Hand side. These fields are extracted from the sample Request and Response sections in the [API Manager](/developers/api-and-mapping).

### How is Mapping done?

Drag and drop fields onto the Mapping area in the center.

For example:

> * first\_name, last\_name from the source mapped to customer\_name, name in the destination
> * email in the source to email\_address in the destination.

![Drag and Drop feature in Mapping](/files/-M4TBNQcYmgXhxnZ7fR8)

#### Add Custom Field

The **Add Custom Field** is used to add a new data value to the Source Field which can then be modified and sent to the destination.&#x20;

{% hint style="danger" %}
Remember to hit the **Save** button after you have used the Modifier feature.
{% endhint %}

![Modifier functions](/files/-M4TBcA5yLZ1mm6sEPM_)

{% hint style="warning" %}
Fields for which Modifiers have been applied in the Play area, cannot be directly removed from the Mapping page.
{% endhint %}

{% hint style="warning" %}
If any field from that is used in the Play area is removed from the API manager response, then that corresponding field (row) wil be highlighted in the Mapping play area.&#x20;
{% endhint %}

### Comment Mapping&#x20;

A specific mapping configuration can be temporarily disabled by using the Comment option.&#x20;

![](/files/-MPIUOlmWtG5OnW5Bocn)

### Preview Mapping

The Preview Mapping is used to test and get a preliminary view of how the Mapping functionality will work, instead of testing the entire Integration, thereby saving the developer's time.

Click on the **Preview** button in the top left section of the Mapping page. The Preview Mapping window will open.&#x20;

1. **Source Data:** In this section, add the Source field data in JSON format.
2. **Ignore Keys:** Keys that should be ignored by the system, while processing data in the mapping structure defined by the user.

Click on the **Preview** button. Depending on the Source data provided and the Mapping and Modifier configurations, the preview response will display the output in the format of the respective destination fields.

### Save Options

* **Save & Continue:** To save the Mapping and remain on the same page
* **Save & Exit:** To save the Mapping and return to the Pipe page

**Use Case**

```python
SOURCE DATA
{"firstname":"John", "lastname":"Smith"}

IGNORE KEYS: Customer

PREVIEW RESPONSE
{
	"address": {
		"name": "JohnSmith"
	},
	"company_id": "CLO",
	"contact": {
		"first_name": "John",
		"last_name": "Smith"
	},
	"customer_name": "JohnSmith"
}
```

## Modifier Functions

Modifiers may be added to each field that is mapped or to the link that connects two fields. The Modifier is used to edit or format data from the source fields.&#x20;

Add one or more fields into each line of the Mapping Area. After adding fields to the Mapping area, click on the Modifier icon <img src="https://lh5.googleusercontent.com/GYv4kqW4FjEeCCKWjijDnq9qZFge6MEScTXnxWb3mW26WSE0SvJj1chSrYb0WqiW5WM93J6WkGtQn3cEOeVu0Tn5manEEf-gru_DSxNeZwyK7czXkODnVDmxOS7k8K-rO3qGBRk5" alt="" data-size="original">, in the middle. Here, the fields are modified and transformed to a format that satisfies the underlying Mapping logic.&#x20;

#### How to configure Modifiers?

1. Drag one or more Source fields and drop it to the Play Area.
2. Then one or more Modifier functions maybe added to the source fields and also the link. Select the field and then Drag and Drop the modifier functions to the Configuration area or Play Area.
3. The Group feature is used to group one or more fields. The Grouped entity can then be used as a single field for modification.
4. Use the Preview section to test the Modifier functionality. The input format of the data to be modified can be selected by clicking on the drop down list in the Preview section. &#x20;

![](/files/-MAQQFGb5NMIxQsNd2U8)

> Example: *firstname (concatenate)* *lastname*. The output of this modifier is mapped to the destination fields.&#x20;

### BUILT IN FUNCTIONS

### int

**bit\_length**

Returns the number of bits necessary to represent an integer in binary, excluding the sign and leading zeros.

**conjugate**

Returns the complex conjugate of any int.

```python
Example:
1+3j.conjugate()
Result: (1-3j)
```

### **list**

**Append**

Adds an object to the end of the list.&#x20;

```python
Syntax: l.append(object)
Parameters: element (required)

Example: 
sample_array = [a,b,c]
element = d
sample_array.append(element)

Result: [a,b,c,d]
```

**count**

Returns the number of occurrences of a value in the list.

```python
Syntax: l.count(value)

Example:
sample_array = [a,b,c,a]
sample_array.count(a) 

Result: 2
```

**extend**

Extends list by appending elements from the iterable.

```python
Syntax: l.extend(iterable)
Parameters: array_value (required)

Example: 
sample_array1 = [a,b,c]
sample_array2 = [d,e,f]
sample_array1.extend(sample_array2) 

Result: [a,b,c,d,e,f]
```

**index**

Returns the index of the first occurrence of the specified list item. Raises ValueError if the value is not present.

```python
Syntax: l.index(value, [start, [stop]])

Parameters:
end
index (required)
start

Example #1:
sample_array = [a,b,c,a]
sample_array.index(a,1,5)
Result: 3

Example #2: 
sample_array = [a,b,c,a]
sample_array.index(a)
Result: 0
```

**insert**

Inserts an object at the specified index position.&#x20;

```python
Syntax: l.insert(index, object)

Parameters:
element (required)
index (required)

Example: 
sample_array = [a,b,c,a]
sample_array.insert(2,f)

Result: [a,b,f,c,a]
```

**pop**

Removes and returns an item at the specified index (The default is to return the last item in the list).  "IndexError" error is raised if list is empty or index is out of range.

```python
Example: 
sample_array = [a,b,c,a]
sample_array.pop(2)
Result: [a,b,a]
```

**remove**

Remove first occurrence of value. Raises ValueError if the value is not present.

```python
Syntax: l.remove(value)
Parameters: element

Example: 
sample_array = [a,b,c,a]
sample_array.remove(c)
Result: [a,b,a]
```

**reverse**

Reverse \*IN PLACE\*

```python
Syntax: l.reverse()

sample_array = [a,b,c,a]
sample_array.reverse ()
Result: [a,c,b,a]
```

**sort**

Stable sort \*IN PLACE\*

```python
Syntax: l.sort(key=None, reverse=False)

Parameters:
compare
key
reverse

```

####

### **S**tr

**capitalize**

Return a capitalized version of the string, i.e. make the first character have upper case and the rest lower case.

```python
Syntax: S.capitalize() -> str

Example:
sample_string = "test"

Result: Test
```

**center**

Return S centered in a string of length width. Padding is done using the specified fill character (default is a space).

```python
Syntax: S.center(width[, fillchar]) -> str

Parameters:
fillchar
width (required)

Example:
sample_string = "test"
fillchar = -
width = 4
Result : ----test----
```

**count**

Returns the number of non-overlapping occurrences of substring sub in string.

```python
Syntax: S[start:end]

Optional arguments start and end are interpreted as in slice notation
S.count(sub[, start[, end]]) -> int

Parameters:
char (required)
end
Start

Example:
count 
sample_string = "test"
char = "t"
Result : 2
```

**encode**

Encode S using the codec registered for encoding. Default encoding is 'utf-8'.&#x20;

Errors may be given to set a different error handling scheme. The default value is 'strict' meaning that encoding errors raise a UnicodeEncodeError.

Other possible values are 'ignore', 'replace' and 'xmlcharrefreplace' as well as any other name registered with codecs.register\_error that can handle UnicodeEncodeErrors.

```
Syntax: S.encode(encoding, errors)

Example: S.encode(encoding='utf-8', errors='strict') -> bytes
```

**endswith**

Returns True if the String ends with the specified suffix; False otherwise. With optional start, tests the String from the beginning at that position. With optional end, stop comparing S at that position. Suffix can also be a tuple of strings to try.

```python
Syntax: S.endswith(suffix[, start[, end]]) -> bool
Parameters:
end (required)
start (required)
suffix (required)

Example:
sample_string = "test"
end 
start: starting and ending index
suffix: st
Result: True
```

**expandtabs**

Return a copy of S where all tab characters are expanded using spaces. If tabsize is not given, a tab size of 8 characters is assumed.

```python
Syntax: S.expandtabs(tabsize=8) -> str
Parameters: tabsize
```

**find**

Return the lowest index in S where substring sub is found, such that sub is contained within S\[start:end]. Optional arguments start and end are interpreted as in slice notation. Return -1 on failure.

```python
Syntax: S.find(sub[, start[, end]]) -> int

Parameters:
char (required)
end
start

Example:
sample_string = "test"
char = "e"
Result: 1
```

**index**

Return the lowest index in S where substring sub is found, such that sub is contained within S\[start:end]. Optional arguments start and end are interpreted as in slice notation. Raises ValueError when the substring is not found.

```python
Syntax: S.index(sub[, start[, end]]) -> int

Parameters:
char (required)
end
start

Example:
sample_string = "test"
char = "e"
Result: 1
```

**isalnum**

Return True if all characters in S are alphanumeric and there is at least one character in S, False otherwise.

```python
Syntax: S.isalnum() -> bool

Example:
sample_string = "test12"
Result: True 
```

**isalpha**

Return True if all characters in S are alphabetic and there is at least one character in S, False otherwise.

```python
Syntax: S.isalpha() -> bool

Example:
sample_string = "test"
Result: True 
```

**isdigit**

Return True if all characters in S are digits and there is at least one character in S, False otherwise.

```python
Syntax: S.isdigit() -> bool

Example:
sample_string = "123"
Result: True
```

**islower**

Return True if all cased characters in S are lowercase and there is at least one cased character in S, False otherwise.

```python
Syntax: S.islower() -> bool

Example: 
sample_string = "test"
Result: True
```

**isspace**

Return True if all characters in S are whitespace and there is at least one character in S, False otherwise.

```python
Syntax: S.isspace() -> bool

Example:
sample_string = "   "
Result: True
```

**istitle**

Return True if S is a titlecased string and there is at least one character in S, i.e. upper- and titlecase characters may only follow uncased characters and lowercase characters only cased ones. Return False otherwise.

```python
Syntax: S.istitle() -> bool

Example:
sample_string = "Test"
Result: True
```

**isupper**

Return True if all cased characters in S are uppercase and there is at least one cased character in S, False otherwise.

```python
Syntax: S.isupper() -> bool

Example:
sample_string = "TEST"
Result: True
```

**join**

Return a string which is the concatenation of the strings in the iterable. The separator between elements is S.

```python
Syntax: S.join(iterable) -> str

Parameters: array_values (required)

Example:
sample_list = ["test", "one", "try"]
sample_string = "-"
sample_string.join(sample_list)
Result= "test-one-try"

```

&#x20;**ljust**

Return S left-justified in a Unicode string of length width. Padding is done using the specified fill character (default is a space).

```python
Syntax: S.ljust(width[, fillchar]) -> str

Parameters:
fillchar
width (required)

Example: 
sample_string = "test"
fillchar = -
width = 6
Result: test--
```

&#x20;**lower**

Return a copy of the string S converted to lowercase.

```python
Syntax: S.lower() -> str

Example:
sample_string = "TEST"
Result: "test"
```

&#x20;**lstrip**

Return a copy of the string S with leading whitespace removed. If chars is given and not None, remove characters in chars instead.

```python
Syntax: S.lstrip([chars]) -> str
Parameters: prefix

Example:
sample_string = "  test"
Result: "test"
```

&#x20;**partition**

Search for the separator sep in S, and return the part before it, the separator itself, and the part after it. If the separator is not found, return S and two empty strings.

```python
Syntax: S.partition(sep) -> (head, sep, tail)
Parameters: separation (required)

Example: 
sample_string = "test"
sample_string.partition("s")
result: ("te", "s", "t")
```

&#x20;**replace**

Return a copy of S with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced.

```python
Syntax: S.replace(old, new[, count]) -> str
Parameters:
count
new (required)
old (required)

Example: 
sample_string = "test"
new = w
old = t
Result = "west"
```

&#x20;**rfind**

Return the highest index in S where substring sub is found, such that sub is contained within S\[start:end]. Optional arguments start and end are interpreted as in slice notation. Return -1 on failure.

```python
Syntax: S.rfind(sub[, start[, end]]) -> int
Parameters:
char (required)
end
Start

Example:
sample_string = "test"
char = "t"
Result: 3
```

**rindex**

Return the highest index in S where substring sub is found, such that sub is contained within S\[start:end]. Optional arguments start and end are interpreted as in slice notation. Raises ValueError when the substring is not found.

```python
Syntax: S.rindex(sub[, start[, end]]) -> int

Parameters:
char (required)
end
start

Example:
sample_string = "test"
char="t"
Result: 3
```

**rjust**

Return S right-justified in a string of length width. Padding is done using the specified fill character (default is a space).

```python
Syntax: S.rjust(width[, fillchar]) -> str

Parameters: fillchar
width (required)

Example: 
sample_string = "test"
fillchar = -
width = 6
Result: --test
```

&#x20;**rpartition**

Search for the separator sep in S, starting at the end of S, and return the part before it, the separator itself, and the part after it. If the separator is not found, return two empty strings and S.

```python
Syntax: S.rpartition(sep) -> (head, sep, tail)
Parameters: separation (required)

Example:
sample_string = "test"
sample_string.rpartition("t")
result: ("tes", "t", "")
```

&#x20;**rsplit**

Return a list of the words in S, using sep as the delimiter string, starting at the end of the string and working to the front. If maxsplit is given, at most maxsplit splits are done. If sep is not specified, any whitespace string is a separator.

```python
Syntax: S.rsplit(sep=None, maxsplit=-1) -> list of strings

Parameters:
char (required)
maxsplit

Example:
sample_string = "test-try"
char= "-"
result: ["try","test"]
```

**rstrip**

Return a copy of the string S with trailing whitespace removed. If chars is given and not None, remove characters in chars instead.

```python
Syntax: S.rstrip([chars]) -> str
Parameters: chars

Example:
sample_string = "test  "
Result: "test"
```

**split**

Return a list of the words in S, using sep as the delimiter string. If maxsplit is given, at most maxsplit splits are done. If sep is not specified or is None, any whitespace string is a separator and empty strings are removed from the result.

```python
Syntax: S.split(sep=None, maxsplit=-1) -> list of strings

Parameters:
char (required)
maxsplit

Example:
sample_string = "test-try"
char= "-"
result: ["test","try"]

```

**startswith**

Return True if S starts with the specified prefix, False otherwise. With optional start, test S beginning at that position. With optional end, stop comparing S at that position. prefix can also be a tuple of strings to try.

```python
Syntax: S.startswith(prefix[, start[, end]]) -> bool

Parameters:
end
prefix (required)
Start

Example:
sample_string = "test"
end 
start: starting and ending index
suffix: te
Result: True
```

**strip**

Return a copy of the string S with leading and trailing whitespace removed. If chars is given and not None, remove characters in chars instead.

```python
Syntax: S.strip([chars]) -> str

Example:
sample_string = "  test  "
Result: "test"
```

&#x20;**swapcase**

Return a copy of S with uppercase characters converted to lowercase and vice versa.

```python
Syntax: S.swapcase() -> str

Example:
sample_string = "TeSt"
Result: "tEsT"
```

**title**

Return a titlecased version of S, i.e. words start with title case characters, all remaining cased characters have lower case.

```python
Syntax: S.title() -> str

Example:
sample_string = "test"
Result: "Test"
```

&#x20;**upper**

Return a copy of S converted to uppercase.

```python
Syntax: S.upper() -> str

Example:
sample_string = "test"
Result: "TEST"
```

**zfill**

Pad a numeric string S with zeros on the left, to fill a field of the specified width. The string S is never truncated.

```python
Syntax: S.zfill(width) -> str
Parameters: count (required)

Example:
sample_string = "test"
width=10
Result:"test000000"
```

### Converter

**converter**

To Modify the data with a static raw data from the user input

Eg:- Original data {country:"India"}

Requested Modification {country:"IN"} :returns: Modified JSON data

The ***Swap*** option will allow users to interchange the Key and Value data.

```python
Example: 

key="India"
value="IN"

Then IN will be sent to the destination in place of India
```

{% hint style="info" %}
Example of Default value:&#x20;

key= "\_\_default\_\_"&#x20;

value= "US"

If the key is an empty key or any key  other than IN it will take the  default value "US".
{% endhint %}

###

### CUSTOM

**1. 12Hr to 24Hr Converter and 24Hr to 12Hr**&#x20;

Converts Time from one format to the other (12Hr clock to 24Hr clock and vice versa).

```
Format to enter data
12Hr: 3:00PM
24Hr: 15:00
```

**2. Array Extender**

Used to Concatenate two or more strings and then convert the output of the concatenation into a single string.

Applicable Only To Lists.

```python
Example: 
first_name=John
last_name=Smith
Marks=[23, 45, 54, 10, 34]

Result: [John,Smith,23,45,54,10,34]

```

&#x20;**3. Array or String Slicing**&#x20;

To slice values from the string/array

```python
Parameters:
start_index
step
stop_index
```

```python
Example 1: 
start = 0 or None,
stop = 2, 
step = 1 
sample = "slicingoperation" 
Returns "sl" 


Example 2: 
start = -4, 
stop = None, 
step = 1 
sample = "slicingoperation" 
Returns "tion"


Example 3: 
start = None, 
stop=None, 
step=-1 
sample = "slicingoperation" 
Returns "noitarepognicils" (Reversed Value)

```

All the above examples applies to arrays as well:&#x20;

* param start\_index: Index of the element from where you want to start the slicing operation&#x20;
* param stop\_index: Index of the element where you want to stop the slicing operation&#x20;
* param step: Specifies the steps that you want to make during the slicing operation

**4. Array To String**

To convert any datatype to string if its dict. Applies json dumps if its list, set, tuple. Joins the iterable elements using join function.

```python
Parameters: join_characters

Example:
sample_array = [a,b,c,d]
join_characters = ","
Result: "a,b,c,d"
```

**5. Concatenate**

Used to Concatenate two or more strings and, convert the output of the concatenation into a single string.

```python
Parameters: join_chars

Example: 
str1 = "test" 
str2 = "try" 
Result: "testtry"
```

#### 6. Convert Non-ASCII characters to ASCII Characters

```
Example:
Input1 : char_a = "Škoda"
Output1 : Skoda (Converted string from Non-ASCII to ASCII)
```

#### 7. Converter

To Modify the data with a static raw data from the user input

Eg:- Original data {country:"India"}

Requested Modification {country:"IN"} :returns: Modified JSON data

The ***Swap*** option will allow users to interchange the Key and Value data.

*The Converter modifier in the CUSTOM modifier section can be used in conjunction with other Modifiers.*&#x20;

```python
Example: 

key="India"
value="IN"

Then IN will be sent to the destination in place of India
```

{% hint style="info" %}
Example of Default value:&#x20;

key= "\_\_default\_\_"&#x20;

value= "US"

If the key is an empty key or any key  other than IN it will take the  default value "US".
{% endhint %}

###

**8. Current Datetime**

Used to display the current date and time in the project timezone.

**9. Datatype Converter**

To convert the the source value to requested datatype&#x20;

1. string
2. integer
3. dict (requires tuple of key and value pairs)
4. list
5. float

```python
Parameters: Datatype (required)

Example:
sample_value = "1"
Datatype = "integer"
Result: 1 (converted string to integer)
```

**10. DateTime Formatter**

To convert the date\_value to the requested format from current format.

```python
Parameters: 
date_value: Date String
requested_format (required): Date format of the return value

Example:
date_value = 2020-05-18 06:25:03.737Z
requested_format = YYYY-MM-DD 
Result: 2020-05-18
```

#### Complete list of format codes:

| Format Codes | Description                                              | Example                        |
| ------------ | -------------------------------------------------------- | ------------------------------ |
| %d           | Day of the month as a zero-padded decimal number         | 01, 02, 03, 04 …, 31           |
| %a           | Weekday as abbreviated name                              | Sun, Mon, …, Sat               |
| %A           | Weekday as full name                                     | Sunday, Monday, …, Saturday    |
| %m           | Month as a zero-padded decimal number                    | 01, 02, 03, 04 …, 12           |
| %b           | Month as abbreviated name                                | Jan, Feb, …, Dec               |
| %B           | Month as full name                                       | January, February, …, December |
| %y           | Year without century as a zero-padded decimal number     | 00, 01, …, 99                  |
| %Y           | Year with century as a decimal number                    | 0001, …, 2018, …, 9999         |
| %H           | Hour (24-hour clock) as a zero-padded decimal number     | 01, 02, 03, 04 …, 23           |
| %M           | Minute as a zero-padded decimal number                   | 01, 02, 03, 04 …, 59           |
| %S           | Second as a zero-padded decimal number                   | 01, 02, 03, 04 …, 59           |
| %f           | Microsecond as a decimal number, zero-padded on the left | 000000, 000001, …, 999999      |
| %I           | Hour (12-hour clock) as a zero-padded decimal number     | 01, 02, 03, 04 …, 12           |
| %p           | Locale’s equivalent of either AM or PM                   | AM , PM                        |
| %j           | Day of the year as a zero-padded decimal number          | 01, 02, 03, 04 …, 366          |

#### 11. Datetime to Timestamp Modifier

This Modifier is used to provide the timestamp starting from \<MM/DD/YYYY> to a given Date & Time input.&#x20;

* Give the input as a string&#x20;
* In the Parameters field, pass the string format using the table&#x20;
* Provide the timezone of the user input

The supported timezone parameters are listed [here: Supported Timezones](/developers/flows/supported-timezones)

**12. Email Validator**

To validate the email address. If valid, return the email address, else return the default value.

```python
Parameters: default

Example: 
sample_email= abc@email.com

Default email: default@email.com
```

**13. Expression**

Based on the logical operations that the user requests, the resulting data will be calculated.

```python
Parameters: logical (required)

Example 1: 
firstName = "integrator", 
lastName="India" 
expression: and 
results: integratorIndia 

Example 2: 
firstName = "integrator", 
lastName="India" 
expression: or 
results: integrator
```

**14. Find and Match Key value**

To convert any datatype to string if its dict. Applies json dumps if its list, set, tuple. Joins the iterable elements using join function.&#x20;

```python
Parameters: 
Check_value (required)
default (to set a default value if the check_value 
does not match any of the array elements)
Find_key (required)
Result_key (required)

Example:
input_data=
[
  {
    "attribute_code":"EA",
    "value":2
  },
  {
    "attribute_code":"USA",
    "value":3
  },
  {
    "attribute_code":"IN",
    "value":4
  }
]

check_value = "EA"
find_key = "attribute_code"
Result_key = "value"
Result:2
```

**15. Get Index Value**

To get the index value from string or list datatype.

```python
Parameters:
default_value
index (required)

Example: 
sample_string = "test"
index = 2
Result: "s"

default: "r"
index = 7
Result: "r"
```

**16. Group**

Grouping will apply precedence over the grouped elements.

```python
Example:
(firstName or lastName) and company 
(integrator or app) and DCKAP

Result: integratorDCKAP
```

#### **17. Mathematical Operations**

To perform Arithmetic operations such as:&#x20;

* Addition&#x20;
* Subtraction&#x20;
* Multiplication&#x20;
* Division
* Floor division
* Power of&#x20;
* Modulo operation (remainder)

**18. Multiple String to Array**

Used to push two or more string into an array.

```python
str1 = "test", 
str2 = "try" 
returns ["test","try"] 
```

#### 19. Number from String Modifier

This method is used to retrieve numbers from the address string.

**Parameters:**

* index: Index of the number to be retrieved

```
Example
Input: "14/3, 3055 GRAND AVE 75215, DALLAS, Texas"  
 
Case 1:
    If index is not set,
    Result= "14/3"
    
    Explanation:
    Here the numbers from the address are: ['14/3', '3055', '75215'].
    By default, index 0 will be returned if the index value is not set.

Case 2:
    If index is set to 2,
    Result= "75215"  
```

**20. Push Into an Array**

To push elements into a new array.

```python
Example:
sample_value = 
{
    "attribute_code":"EA",
    "value":2
}

Result: [{
    "attribute_code":"EA",
    "value":2
}]
```

**21. Raw Value**

The value assigned to Raw Value will be taken into consideration.&#x20;

```python
Parameters: value (Required)

consider_source = true : to check if there is data in the source 
consider_source = false : will consider the raw data

default of consider_source = false
```

#### 22. RegEx

A RegEx, or Regular Expression, is a sequence of characters that forms a search pattern.

RegEx can be used to check if a string contains the specified search pattern.

#### 23. Remove Non-ASCII characters from the input data

```
Example:

Input2 : char_b = "Škoda"
Output2 : koda (Removed Non-ASCII character from the string.)
```

**24. Remove Special Characters**

To remove special characters from a string.

```python
Parameters:
exceptions - Provide special characters that must not be removed from the string
selections - Provide special characters that must be removed from the string

Sample_string="te$t"
Result:"tet"

Sample_string="te$t?"
exceptions=?
Result:"tet?"

sample_string="te$t?"
selections=?
Result:"te$t"
```

Provide either **selections** or **exceptions**. If both the **selections** and **exceptions** are provided, **selections** will be used.

**25. Round Off**

To round off to the nearest integer value

```python
Parameters: 
digits : Number of decimals to use when rounding

Example:
sample value = 3.7
Result = 4
```

**26. Truncate**

Removes the specific number of characters in the prefix or suffix of a string based on the parameters provided. By default,  characters from the right of the string are removed.&#x20;

```python
Parameters: 
count - Defines the number of characters to be removed
reverse - Set to True by default, (True = characters will be removed from the right)

Example: 
string = "test" 
count = 2 
results = "te"
```

**27. 12Hr to 24Hr Converter and 24Hr to 12Hr**&#x20;

Converts Time from one format to the other (12Hr clock to 24Hr clock and vice versa).

```
Format to enter data
12Hr: 3:00PM
24Hr: 15:00
```


# Advanced Modifiers

Data Mapping using a second version of mapping method.

**ADVANCED MODIFIERS**

**Advanced Modifiers indicate a secondary and more developer-friendly approach to modify data.**

There are two accepted formats for using advanced modifiers:

* **Format 1 (***Keyword arguments***):** Specifying parameter names while passing values

```
Example:
ARRAY_APPEND([1,2,3], element=5) (or)
ARRAY_APPEND(source=[1,2,3], element=5)
```

* **Format 2:** Without mentioning parameter names

```
Example:
ARRAY_APPEND([1,2,3], 5)
Note:
String must be passed by enclosing the data in single or double quotes.
GROUP and EXPRESSION are deprecated.
```

## Description of Various Modifiers

### **ARRAY\_APPEND**

**DESCRIPTION**

Adds an element at the end of the array.

*Note: If source is not a list, it returns source.*

**SYNTAX**

```
ARRAY_APPEND(source*,element*)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                           |
| -------- | -------- | --------------------------------------------------------- |
| source   | list     | Source field - array in which elements are to be appended |
| element  | any      | Element to be added at the end of source list             |

**EXAMPLE**

| **Source Data**                   | **Expression**              | **Output**                         |
| --------------------------------- | --------------------------- | ---------------------------------- |
| menu = \["chocolates","biscuits"] | ARRAY\_APPEND(menu,"cakes") | \["chocolates","biscuits","cakes"] |

### **ARRAY\_EXTEND**

**DESCRIPTION**

Returns extended list if source and element are lists, else appends the element to the list.

**SYNTAX**

```
ARRAY_EXTEND(source*,element*,default)
```

**PARAMETER**

| **Name** | **Type**                             | **Description**                              |
| -------- | ------------------------------------ | -------------------------------------------- |
| source   | list                                 | Source field - array which is to be extended |
| element  | list/ int/ float/ dictionary/ string | Element to be extended to the source list    |
| default  | string                               | Default value: "NOT\_IN\_SOURCE"             |

**EXAMPLES**

| **Source Data**                                                                     | **Expression**                         | **Output**                                      |
| ----------------------------------------------------------------------------------- | -------------------------------------- | ----------------------------------------------- |
| <p>menu = \["chocolates","biscuits"]</p><p>new\_items = \["cakes","ice creams"]</p> | ARRAY\_EXTEND(menu,element=new\_items) | \["chocolates","biscuits","cakes","ice creams"] |
| <p>menu="chocolates"</p><p>new\_items =\["cakes","ice creams"]</p>                  | ARRAY\_EXTEND(menu,new\_items)         | \["chocolates","cakes","ice creams"]            |

### **ARRAY\_INSERT**

**DESCRIPTION**

Adds an element at the specified index of the list. If the index is not mentioned, the element is added at the zeroth index.

**SYNTAX**

```
ARRAY_INSERT(source*,element*,index)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                                              |
| -------- | -------- | ---------------------------------------------------------------------------- |
| source   | list     | Source field - array in which element has to be inserted                     |
| element  | any      | Element to be inserted in the list                                           |
| index    | integer  | <p>Index at which the element has to be inserted.</p><p>Default value: 0</p> |

**EXAMPLES**

| **Source Data**                   | **Expression**                | **Output**                         |
| --------------------------------- | ----------------------------- | ---------------------------------- |
| menu = \["chocolates","biscuits"] | ARRAY\_INSERT(menu,"cakes",1) | \["chocolates","cakes","biscuits"] |
| menu = \["chocolates","biscuits"] | ARRAY\_INSERT(menu,"cakes")   | \["cakes","chocolates","biscuits"] |

### **ARRAY\_PUSH**

**DESCRIPTION**

Returns a list containing the input.

Note: ignore\_none must be used only as a keyword argument

**SYNTAX**

```
ARRAY_PUSH(args*,ignore_none)
```

**PARAMETER**

| **Name**     | **Type** | **Description**                                                 |
| ------------ | -------- | --------------------------------------------------------------- |
| args         | any      | <p>n source fields (n>=1)</p><p>Data to be pushed into list</p> |
| ignore\_none | boolean  | Indicates whether None should be taken into account or not      |

**EXAMPLES**

| **Source Data**                                   | **Expression**                                        | **Output**                                |
| ------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------- |
| company="DCKAP"                                   | ARRAY\_PUSH(company)                                  | \["DCKAP"]                                |
| <p>company="DCKAP"</p><p>product="INTEGRATOR"</p> | ARRAY\_PUSH(company,product)                          | \["DCKAP","INTEGRATOR"]                   |
| <p>company="DCKAP"</p><p>product="INTEGRATOR"</p> | ARRAY\_PUSH(company,product,sample)                   | \["DCKAP","INTEGRATOR","NOT\_IN\_SOURCE"] |
| <p>company="DCKAP"</p><p>product="INTEGRATOR"</p> | ARRAY\_PUSH(company,product,sample,ignore\_none=True) | \["DCKAP","INTEGRATOR"]                   |

### **ARRAY\_REMOVE**

**DESCRIPTION**

Returns the list after removing the element if the element is mentioned.

(i) If index is only mentioned,

* Returns the list after removing the element at the specified index if it is a valid index.
* Returns source if the index is out of range.

(ii) If element is only mentioned,

* Returns the list after removing the element mentioned if the element is present in the list.
* Returns source if the element is not in the list.

(iii) If both element and index are mentioned,

* Returns the list after removing the specified element if present (ignoring the index).
* Returns source if the specified element is not in the list.

(iv) If both element and index are not mentioned,

* Returns the list after removing the element at zeroth index.

(v) If source is not a list,

* Returns source.

**SYNTAX**

```
ARRAY_REMOVE(source*,element,index)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                           |
| -------- | -------- | --------------------------------------------------------- |
| source   | list     | Source field - array from which element has to be removed |
| element  | any      | Element to be removed                                     |
| index    | int      | Index of the element to be removed                        |

**EXAMPLES**

| **Source Data**                  | **Expression**                   | **Output**             |
| -------------------------------- | -------------------------------- | ---------------------- |
| item\_ids=\[1001,1002,1003,1004] | ARRAY\_REMOVE(item\_ids,1003)    | \[1001,1002,1004]      |
| item\_ids=\[1001,1002,1003,1004] | ARRAY\_REMOVE(item\_ids,index=2) | \[1001,1002,1004]      |
| item\_ids=\[1001,1002,1003,1004] | ARRAY\_REMOVE(item\_ids,2)       | \[1001,1002,1003,1004] |
| item\_ids=\[1001,1002,1003,1004] | ARRAY\_REMOVE(item\_ids)         | \[1002,1003,1004]      |
| item\_ids=\[1001,1002,1003,1004] | ARRAY\_REMOVE(item\_ids,1001,3)  | \[1002,1003,1004]      |
| item\_ids=\[1001,1002,1003,1004] | ARRAY\_REMOVE(item\_ids,1005)    | \[1001,1002,1003,1004] |

### **CAPITALIZE**

**DESCRIPTION**

Returns string with the first character of the string converted to capital (uppercase) letter while making all other characters in the string as lowercase letters.

*Note: Returns source if source is not a string*

**SYNTAX**

```
CAPITALIZE(source*)
```

**PARAMETER**

| **Name** | **Type** | **Description**                   |
| -------- | -------- | --------------------------------- |
| source   | string   | Source field - data to capitalize |

**EXAMPLE**

| **Source Data** | **Expression**   | **Output** |
| --------------- | ---------------- | ---------- |
| name="ironman"  | CAPITALIZE(name) | "Ironman"  |

### **CONCATENATE**

**DESCRIPTION**

Returns a string by joining the user inputs (with the mentioned join character, if any).

Note: join\_chars must be used only as keyword argument

**SYNTAX**

```
CONCATENATE(args*,join_chars)
```

**PARAMETER**

| **Name**    | **Type** | **Description**                                                                                                |
| ----------- | -------- | -------------------------------------------------------------------------------------------------------------- |
| args\*      | string   | <p>n source fields (n>=1)</p><p>Fields to be joined</p>                                                        |
| join\_chars | string   | <p>The string that must appear between the sources when the source fields are joined.<br>Default Value: ''</p> |

**EXAMPLES**

| **Source Data**                                                        | **Expression**                                      | **Output**               |
| ---------------------------------------------------------------------- | --------------------------------------------------- | ------------------------ |
| <p>name="integrator"</p><p>connector="@"</p><p>domain ="dckap.com"</p> | CONCATENATE(name,connector,domain)                  | "<integrator@dckap.com>" |
| <p>first\_name="Iron"</p><p>last\_name="Man"</p>                       | CONCATENATE(first\_name,last\_name,join\_chars=" ") | "Iron Man"               |

### **CONVERT\_TIME**

**DESCRIPTION**

Converts time from 12 hrs format to 24 hrs format and vice versa

**SYNTAX**

```
CONVERT_TIME(source*)
```

**PARAMETER**

| **Name** | **Type** | **Description**                     |
| -------- | -------- | ----------------------------------- |
| source   | string   | Source Field - time to be converted |

**EXAMPLES**

| **Source Data**           | **Expression**             | **Output**    |
| ------------------------- | -------------------------- | ------------- |
| created\_at='11:37:00 pm' | CONVERT\_TIME(created\_at) | "23:37:00"    |
| created\_at='23:37:00'    | CONVERT\_TIME(created\_at) | "11:37:00 PM" |

### **CONVERTER**

**DESCRIPTION**

Looks for source in keys of converters dictionary and returns the corresponding value.

**SYNTAX**

```
CONVERTER(source*,converters*)
```

**PARAMETER**

| **Name**                                  | **Type**   | **Description**                                                                     |
| ----------------------------------------- | ---------- | ----------------------------------------------------------------------------------- |
| source                                    | string     | Source field - key which needs to be replaced with value from converters dictionary |
| converters (editable key-value pair icon) | dictionary | Reference dictionary from which the value of source is to be retrieved              |

**EXAMPLES**

| **Source Data**          | **Converters**                                                              | **Expression**                | **Output**           |
| ------------------------ | --------------------------------------------------------------------------- | ----------------------------- | -------------------- |
| country="United States"  | {"India":"+91","United States":"+1"}                                        | CONVERTER(country,converters) | "+1"                 |
| country="United Kingdom" | {"India":"+91","United States":"+1"}                                        | CONVERTER(country,converters) | "NOT\_IN\_SOURCE"    |
| country="United Kingdom" | {"India":"+91","United States":"+1","\_\_default\_\_":"Data Not Available"} | CONVERTER(country,converters) | "Data Not Available" |

### **COUNT**

**DESCRIPTION**

Returns the length of source;

Returns zero, if the source is of invalid datatype.

**SYNTAX**

```
COUNT(source*)
```

**PARAMETER**

| **Name** | **Type**               | **Description**                                    |
| -------- | ---------------------- | -------------------------------------------------- |
| source   | string/list/dictionary | Source field for which length has to be calculated |

**EXAMPLES**

| **Source Data**                                     | **Expression**        | **Output** |
| --------------------------------------------------- | --------------------- | ---------- |
| items=\[100,200,300]                                | COUNT(items)          | 3          |
| country\_codes={"India":"+91","United States":"+1"} | COUNT(country\_codes) | 2          |

### **DATATYPE\_CONVERTER**

**DESCRIPTION**

Converts the input to requested datatype

**SYNTAX**

```
DATATYPE_CONVERTER(source*,datatype)
```

**PARAMETER**

| **Name** | **Type**                    | **Description**                                                                       |
| -------- | --------------------------- | ------------------------------------------------------------------------------------- |
| source   | any                         | Source field which has to be converted                                                |
| datatype | int,float,boolean,list,dict | Datatype to which source has to be converted. Can be provided with quotes like 'int'. |

**EXAMPLES**

| **Source Data**                                     | **Expression**                             | **Output**                 |
| --------------------------------------------------- | ------------------------------------------ | -------------------------- |
| country\_codes={"India":"+91","United States":"+1"} | DATATYPE\_CONVERTER(country\_codes,’list’) | \["India","United States"] |
| price=100.123                                       | DATATYPE\_CONVERTER(price,int)             | 100                        |

### **DATETIME\_FORMATTER**

**DESCRIPTION**

Formats the datetime (object or string) to user specified string date format.

**SYNTAX**

```
DATETIME_FORMATTER(source*,requested_format,default)
```

**PARAMETER**

| **Name**          | **Type**                | **Description**                                        |
| ----------------- | ----------------------- | ------------------------------------------------------ |
| source            | Datetime object/ string | Source field to be converted into the requested format |
| requested\_format | string                  | Desired format of time                                 |
| default           |                         |                                                        |

**EXAMPLE**

| **Source Data**                               | **Expression**                                          | **Output**               |
| --------------------------------------------- | ------------------------------------------------------- | ------------------------ |
| created\_at='Sat, 27 Jan 2018 17:16:55 +0000' | DATETIME\_FORMATTER(created\_at,'%Y-%m-%d %I:%M:%S %p') | '2018-01-27 05:16:55 PM' |

### **DECODE**

**DESCRIPTION**

Decodes the encoded string (codec registry)

**SYNTAX**

```
DECODE(source*)
```

**PARAMETER**

| **Name** | **Type** | **Description**                         |
| -------- | -------- | --------------------------------------- |
| source   | bytes    | Source field - bytes data to be decoded |

**EXAMPLE**

| **Source Data**        | **Expression** | **Output** |
| ---------------------- | -------------- | ---------- |
| secret=b'St\xc3\xa5le' | DECODE(secret) | 'Ståle'    |

### **EMAIL\_VALIDATOR**

**DESCRIPTION**

Returns the email address if valid, else default

**SYNTAX**

```
EMAIL_VALIDATOR(source*,default)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                                                    |
| -------- | -------- | ---------------------------------------------------------------------------------- |
| source   | string   | Source field - email to be validated                                               |
| default  | string   | <p>Value to display if email is invalid</p><p>Default value: "NOT\_IN\_SOURCE"</p> |

**EXAMPLES**

| **Source Data**                        | **Expression**                                   | **Output**               |
| -------------------------------------- | ------------------------------------------------ | ------------------------ |
| contact\_mail="<integrator@dckap.com>" | EMAIL\_VALIDATOR(contact\_email)                 | "<integrator@dckap.com>" |
| contact\_mail="integrator"             | EMAIL\_VALIDATOR(contact\_email)                 | "NOT\_IN\_SOURCE"        |
| contact\_mail="integrator"             | EMAIL\_VALIDATOR(contact\_email,"Invalid email") | "Invalid email"          |

### **ENCODE**

**DESCRIPTION**

Encodes the string (codec registry)

**SYNTAX**

```
ENCODE(source)
```

**PARAMETER**

| **Name** | **Type** | **Description**            |
| -------- | -------- | -------------------------- |
| source   | string   | Source field to be encoded |

**EXAMPLE**

| **Source Data** | **Expression** | **Output**      |
| --------------- | -------------- | --------------- |
| secret='Ståle'  | ENCODE(secret) | b'St\xc3\xa5le' |

### **ENDSWITH**

**DESCRIPTION**

Returns true if the string ends with the mentioned suffix in the specified index range else False. Returns false if source is not a string.

**SYNTAX**

```
ENDSWITH(source*,suffix*,start,end)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                              |
| -------- | -------- | ------------------------------------------------------------ |
| source   | string   | Source field                                                 |
| suffix   | string   | Suffix string with which the check on source has to be made. |
| start    | integer  | Start index of the string                                    |
| end      | integer  | End index of the string                                      |

**EXAMPLES**

| **Source Data**     | **Expression**             | **Output** |
| ------------------- | -------------------------- | ---------- |
| message="Great Day" | ENDSWITH(message,"ay")     | true       |
| message="Great Day" | ENDSWITH(message,"ay",1,5) | false      |

### **FIND\_AND\_MATCH**

**DESCRIPTION**

For the given source dictionary,

Returns result\_key if the value of find\_key is check\_value.

Returns default otherwise.

**SYNTAX**

```
FIND_AND_MATCH(source*,find_key*,check_value*,result_key*,default)
```

**PARAMETER**

| **Name**     | **Type**   | **Description**                                                                                                                    |
| ------------ | ---------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| source       | dictionary | Source field                                                                                                                       |
| find\_key    | string     | Key to search in source dictionary                                                                                                 |
| check\_value | any        | Value to check for find\_key                                                                                                       |
| result\_key  | string     | Key whose value is to be returned as result                                                                                        |
| default      | string     | <p>String to display in absence of find\_key or result\_key or a different check\_value</p><p>Default Value: "NOT\_IN\_SOURCE"</p> |

**EXAMPLES**

| **Source Data**                                       | **Expression**                                                              | **Output**           |
| ----------------------------------------------------- | --------------------------------------------------------------------------- | -------------------- |
| signatures= {"Subject":"Request", "Sign":"Sincerely"} | FIND\_AND\_MATCH(signatures,"Subject",'Request','Sign')                     | "Sincerely"          |
| signatures= {"Subject":"Request", "Sign":"Sincerely"} | FIND\_AND\_MATCH(signatures,"Subject",'Friend','Sign','Data not available') | "Data not available" |

### **IFELSE**

**DESCRIPTION**

If the condition is satisfied, it executes on\_success, else runs on\_fail.

**SYNTAX**

```
IFELSE(condition,on_success,on_fail)
```

**PARAMETER**

| **Name**    | **Type**                 | **Description**                                          |
| ----------- | ------------------------ | -------------------------------------------------------- |
| condition   | field/another expression | Field or expression to be checked for some value         |
| on\_success | field/another expression | If value exists, field/expression to be returned         |
| on\_fail    | field/another expression | If value does not exist, field/expression to be returned |

**EXAMPLES**

| **Source Data**                                  | **Expression**                                                                          | **Output** |
| ------------------------------------------------ | --------------------------------------------------------------------------------------- | ---------- |
| company\_name='DCKAP'                            | IFELSE(company\_name,company\_name,'INTEGRATOR')                                        | "DCKAP"    |
| <p>first\_name="Iron"</p><p>last\_name="Man"</p> | IFELSE(company\_name,company\_name,CONCATENATE(first\_name,last\_name),join\_chars=" ") | "Iron Man" |

{% hint style="info" %}
IFELSE supports additional capabilities to check conditions with the operators <, <=, >, >=, ==, !=

***Examples:***&#x20;

IFELSE(AGE>=18,"Yes","No")

IFELSE(COUNT('ABC')>=COUNT(LSTRIP(" ABC")),UPPER(first\_name),"No Name")
{% endhint %}

### **IGNORE\_ASCII**

**DESCRIPTION**

Returns string after removing Unicode characters.

Returns source if the source is not a string.

**SYNTAX**

```
IGNORE_ASCII(source*)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                              |
| -------- | -------- | ------------------------------------------------------------ |
| source   | string   | Source field from which Unicode characters are to be removed |

**EXAMPLE**

| **Source Data** | **Expression**      | **Output** |
| --------------- | ------------------- | ---------- |
| name='Škoda'    | IGNORE\_ASCII(name) | 'koda'     |

### **ISLOWER**

**DESCRIPTION**

For string, returns true if all the alphabets are lowercase(a-z) else returns false.

Note: If source is not a string, return false.

**SYNTAX**

```
ISLOWER(source*)
```

**PARAMETER**

| **Name** | **Type** | **Description**                     |
| -------- | -------- | ----------------------------------- |
| source   | string   | Source field which is to be checked |

**EXAMPLE**

| **Source Data**      | **Expression**    | **Output** |
| -------------------- | ----------------- | ---------- |
| category="chocolate" | ISLOWER(category) | true       |

### **ISUPPER**

**DESCRIPTION**

For string, returns true if all the alphabets are uppercase(A-Z) else returns false.

If source is not a string, it returns false.

**SYNTAX**

```
ISUPPER(source*)
```

**PARAMETER**

| **Name** | **Type** | **Description**                     |
| -------- | -------- | ----------------------------------- |
| source   | string   | Source field which is to be checked |

**EXAMPLE**

| **Source Data**      | **Expression**    | **Output** |
| -------------------- | ----------------- | ---------- |
| category="chocolate" | ISUPPER(category) | false      |

### **LJUST**

**DESCRIPTION**

Left aligns the string, using a specified character (space is default) as the fill character for making the length of the output string as the mentioned width.

Note: Returns source, if source is not a string.

**SYNTAX**

```
LJUST(source*,width*,fillchar)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                                                                |
| -------- | -------- | ---------------------------------------------------------------------------------------------- |
| source   | string   | Source Field                                                                                   |
| width    | integer  | Length of the output                                                                           |
| fillchar | string   | <p>String to make the text to the desired width and left justified</p><p>Default value:' '</p> |

**EXAMPLES**

| **Source Data** | **Expression**        | **Output**   |
| --------------- | --------------------- | ------------ |
| message='hello' | LJUST(message,10)     | 'hello '     |
| message='hello' | LJUST(message,10,'-') | 'hello-----' |

### **LOWER**

**DESCRIPTION**

Converts all uppercase characters in the string to lowercase

**SYNTAX**

```
LOWER(source*)
```

**PARAMETER**

| **Name** | **Type** | **Description**                             |
| -------- | -------- | ------------------------------------------- |
| source   | string   | Source field to be converted into lowercase |

**EXAMPLES**

| **Source Data** | **Expression** | **Output** |
| --------------- | -------------- | ---------- |
| gender='Male'   | LOWER(gender)  | 'male'     |

### **LSTRIP**

**DESCRIPTION**

Returns a copy of string with leading prefix characters removed.

If no prefix is passed, it removes leading spaces.

Note: If source is not a string, returns source.

**SYNTAX**

```
LSTRIP(source*,prefix)
```

**PARAMETER**

| **Name** | **Type** | **Description**       |
| -------- | -------- | --------------------- |
| source   | string   | Source field          |
| prefix   | string   | String to be stripped |

**EXAMPLES**

| **Source Data**    | **Expression**   | **Output** |
| ------------------ | ---------------- | ---------- |
| city=' Chennai'    | LSTRIP(city)     | 'Chennai'  |
| city='XXXXChennai' | LSTRIP(city,'X') | 'Chennai'  |

### **MATH**

**DESCRIPTION**

Performs arithmetic operations and returns the result.

Note: operator must be used only as keyword argument

**SYNTAX**

```
MATH(args*,operator*)
```

**PARAMETER**

| **Name** | **Type**                         | **Description**                          |
| -------- | -------------------------------- | ---------------------------------------- |
| args     | int/float                        | Two Source fields to be given (operands) |
| operator | '+','-','\*','/','\*\*','%','//' | Operation to be performed                |

**EXAMPLES**

| **Source Data**                    | **Expression**                     | **Output** |
| ---------------------------------- | ---------------------------------- | ---------- |
|                                    | MATH(10,3,operator='\*\*')         | 1000       |
| <p>price=100,</p><p>quantity=5</p> | MATH(price,quantity,operator='\*') | 500        |

### **NOW**

**DESCRIPTION**

Current datetime will be returned based on timezone.

**SYNTAX**

```
NOW()
```

**EXAMPLE**

| **Source Data** | **Expression** | **Output**                 |
| --------------- | -------------- | -------------------------- |
|                 | NOW()          | 2022-02-04 09:26:59.624294 |

### **PARTITION**

**DESCRIPTION**

Splits the string at the first occurrence of the separator and returns a tuple containing the part before the separator, separator, and the part after the separator.

Note: If the input is not a string, returns string.

**SYNTAX**

```
PARTITION(source*,separation*)
```

**PARAMETER**

| **Name**   | **Type** | **Description**                          |
| ---------- | -------- | ---------------------------------------- |
| source     | string   | Source Field                             |
| separation | string   | String at which partition has to be made |

**EXAMPLES**

| **Source Data**        | **Expression**         | **Output**            |
| ---------------------- | ---------------------- | --------------------- |
| message= 'Hello world' | PARTITION(message,'l') | 'He', 'l', 'lo world' |

### **RAW\_VALUE**

**DESCRIPTION**

If consider\_source is set to True, returns value from source (if source exists and is not None) else returns value.

**SYNTAX**

```
RAW_VALUE(source*,value*,consider_source)
```

**PARAMETER**

| **Name**         | **Type** | **Description**                                        |
| ---------------- | -------- | ------------------------------------------------------ |
| source           | any      | Source field                                           |
| value            | any      | Value to be returned if source doesn’t exist           |
| consider\_source | boolean  | Whether to take source value into consideration or not |

**EXAMPLES**

| **Source Data**      | **Expression**                   | **Output**   |
| -------------------- | -------------------------------- | ------------ |
| product='INTEGRATOR' | RAW\_VALUE(product,'DCKAP')      | 'DCKAP'      |
| product='INTEGRATOR' | RAW\_VALUE(product,'DCKAP',True) | 'INTEGRATOR' |

### **REMOVE\_SPECIAL\_CHARACTERS**

**DESCRIPTION**

Removes special characters from the string. Selective special characters can be alone removed by using the parameter selections. Selective special characters can be alone retained by using the parameter exceptions.

**SYNTAX**

```
REMOVE_SPECIAL_CHARACTERS(source*,selections,exceptions)
```

**PARAMETER**

| **Name**   | **Type** | **Description**              |
| ---------- | -------- | ---------------------------- |
| source     | string   | Source field                 |
| selections | string   | Special characters to remove |
| exceptions | string   | Special characters to retain |

**EXAMPLES**

| **Source Data**               | **Expression**                                    | **Output**          |
| ----------------------------- | ------------------------------------------------- | ------------------- |
| email='<abc_d@dckap.com>###'  | REMOVE\_SPECIAL\_CHARACTERS(email)                | 'abcddckapcom'      |
| email='<abc_d@dckap.com>####' | REMOVE\_SPECIAL\_CHARACTERS(email,selections='#') | '<abc_d@dckap.com>' |
| email='<abc_d@dckap.com>####' | REMOVE\_SPECIAL\_CHARACTERS(email,exceptions='#') | 'abcddckapcom####'  |

### **REGEX**

**DESCRIPTION**

Supports findall, search, split, sub and match operations.

**SYNTAX**

```
REGEX(source*, pattern*, regex_function, sub_value, sub_count)
```

**PARAMETER**

| **Name**        | **Type**                                     | **Description**                                       |
| --------------- | -------------------------------------------- | ----------------------------------------------------- |
| source          | string                                       | Source field                                          |
| pattern         | string                                       | Pattern to search                                     |
| regex\_function | 'findall', 'search', 'split', 'sub', 'match' | Function to perform                                   |
| sub\_value      | string                                       | Value to be substituted for 'sub' function            |
| sub\_count      | integer                                      | Number of substitutions to be made for 'sub' function |

**EXAMPLES**

| **Source Data**                                                             | **Expression**                      | **Output**                                                   |
| --------------------------------------------------------------------------- | ----------------------------------- | ------------------------------------------------------------ |
| message= 'Hello my Number is 123456789 and my friend's number is 987654321' | REGEX(message,'\d+')                | \["123456789","987654321"]                                   |
| message= 'Hello my Number is 123456789 and my friend's number is 987654321' | REGEX(message,'\d+','search')       | true                                                         |
| message= 'Hello my Number is 123456789 and my friend's number is 987654321' | REGEX(message,'\d+','split')        | \['Hello my Number is ', ' and my friend number is ', '']    |
| message= 'Hello my Number is 123456789 and my friend's number is 987654321' | REGEX(message,'\d+','sub','XXXX',1) | Hello my Number is XXXX and my friend's number is 987654321' |
| message= 'Hello World!'                                                     | REGEX(message,'\d+','match')        | false                                                        |

### **REPLACE**

**DESCRIPTION**

Returns a copy of the string where all occurrences of a substring are replaced with another substring

**SYNTAX**

```
REPLACE(source*,old*,new*,count)
```

**PARAMETERS**

| **Name** | **Type** | **Description**                 |
| -------- | -------- | ------------------------------- |
| source   | string   | Source field                    |
| old      | string   | String to change                |
| new      | string   | String to be replaced with      |
| count    | integer  | Number of replacements required |

**EXAMPLES**

| **Source Data** | **Expression**          | **Output** |
| --------------- | ----------------------- | ---------- |
| item="banana"   | REPLACE(item,"n","b",1) | "babana"   |

### **RJUST**

**DESCRIPTION**

Right aligns the string, using a specified character (space is default) as the fill character for making the length of the output string as the mentioned width.

**SYNTAX**

```
RJUST(source*,width*,fillchar)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                                                                 |
| -------- | -------- | ----------------------------------------------------------------------------------------------- |
| source   | string   | Source field                                                                                    |
| width    | integer  | Length of the output                                                                            |
| fillchar | string   | <p>String to make the text to the desired width and right justified</p><p>Default value:' '</p> |

**EXAMPLES**

| **Source Data** | **Expression**        | **Output**   |
| --------------- | --------------------- | ------------ |
| message='hello' | RJUST(message,10)     | ' hello'     |
| message='hello' | RJUST(message,10,'-') | '-----hello' |

### **ROUND**

**DESCRIPTION**

Rounds off the input number.

**SYNTAX**

```
ROUND(source*,digits)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                                          |
| -------- | -------- | ------------------------------------------------------------------------ |
| source   | float    | Source field                                                             |
| digits   | integer  | Number of values to be considered after decimal point while rounding off |

**EXAMPLES**

| **Source Data** | **Expression** | **Output** |
| --------------- | -------------- | ---------- |
| price=10.68     | ROUND(price,1) | 11.0       |

### **RSPLIT**

**DESCRIPTION**

Returns a list of strings by breaking the input string from the right side by the specified separator

**SYNTAX**

```
RSPLIT(source*,char,maxsplit)
```

**PARAMETER**

| **Name** | **Type** | **Description**                      |
| -------- | -------- | ------------------------------------ |
| source   | string   | Source field                         |
| char     | string   | String at which split has to be made |
| maxsplit | integer  | Maximum number of split points       |

**EXAMPLES**

| **Source Data**     | **Expression**               | **Output**           |
| ------------------- | ---------------------------- | -------------------- |
|                     | RSPLIT('Great Day',char='a') | \['Gre', 't D', 'y'] |
| message='Great Day' | RSPLIT(message,'a',1)        | \['Great D', 'y']    |

### **RSTRIP**

**DESCRIPTION**

Returns string with trailing suffix characters removed.

If no argument is passed, it removes trailing spaces.

Note: If source is not a string, returns source

**SYNTAX**

```
RSTRIP(source*,chars)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                       |
| -------- | -------- | ----------------------------------------------------- |
| source   | string   | Source field                                          |
| chars    | string   | <p>String to be stripped</p><p>Default Value: " "</p> |

**EXAMPLES**

| **Source Data**    | **Expression**   | **Output** |
| ------------------ | ---------------- | ---------- |
| city='Chennai '    | RSTRIP(city)     | 'Chennai'  |
| city='ChennaiXXXX' | RSTRIP(city,'X') | 'Chennai'  |

### **SEARCH**

**DESCRIPTION**

Gets the element at the specified index in list/string for valid index else returns default.

Note: Returns source if the source is of datatype other than list/string/tuple.

**SYNTAX**

```
SEARCH(source*,index*,default_value)
```

**PARAMETER**

| **Name**       | **Type**    | **Description**                  |
| -------------- | ----------- | -------------------------------- |
| source         | list/string | Source field                     |
| index          | integer     | Index value to be checked        |
| default\_value | string      | Default Value: "NOT\_IN\_SOURCE" |

**EXAMPLES**

| **Source Data**       | **Expression**                        | **Output**          |
| --------------------- | ------------------------------------- | ------------------- |
| item\_ids=\[10,20,30] | SEARCH(items\_ids,2)                  | 30                  |
| message='Hello'       | SEARCH(message,6,'No data available') | 'No data available' |

### **SLICE**

**DESCRIPTION**

Slices values from string/array

**SYNTAX**

```
SLICE(source*, step, start_index, stop_index)
```

**PARAMETER**

| **Name**     | **Type** | **Description**         |
| ------------ | -------- | ----------------------- |
| source       | string   | Source field            |
| step         | integer  | Step value              |
| start\_index | integer  | Starting index to slice |
| stop\_index  | integer  | Ending index to slice   |

**EXAMPLES**

| **Source Data**                 | **Expression**                | **Output** |
| ------------------------------- | ----------------------------- | ---------- |
| item\_ids=\[10, 20, 30, 40, 50] | SLICE(item\_ids, 2,1,5)       | \[20, 40]  |
| message= 'hello world'          | SLICE(message,start\_index=5) | ' world'   |

### **SPLIT**

**DESCRIPTION**

Returns a list of strings by breaking the input string from the left side by the specified separator

Note: If source is not a string, returns source.

**SYNTAX**

```
SPLIT(source*,char,maxsplit)
```

**PARAMETER**

| **Name** | **Type** | **Description**                      |
| -------- | -------- | ------------------------------------ |
| source   | string   | Source field                         |
| char     | string   | String at which split has to be made |
| maxsplit | integer  | Maximum number of split points       |

**EXAMPLES**

| **Source Data**     | **Expression**       | **Output**        |
| ------------------- | -------------------- | ----------------- |
|                     | SPLIT('Great Day')   | \["Great", "Day"] |
| message='Great Day' | SPLIT(message,'a',1) | \['Gre', 't Day'] |

### **STARTSWITH**

**DESCRIPTION**

Returns True if the string starts with the mentioned prefix in the specified index range else False.

Note: If source is not a string, returns source.

**SYNTAX**

```
STARTSWITH(source*,prefix,start,end)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                              |
| -------- | -------- | ------------------------------------------------------------ |
| source   | string   | Source field                                                 |
| prefix   | string   | Prefix string with which the check on source has to be made. |
| start    | integer  | Start index of the string                                    |
| end      | integer  | End index of the string                                      |

**EXAMPLES**

| **Source Data**     | **Expression**              | **Output** |
| ------------------- | --------------------------- | ---------- |
| message="Great Day" | STARTSWITH(message,"ay")    | false      |
| message="Great Day" | STARTSWITH(message,"r",1,5) | true       |

### **STRIP**

**DESCRIPTION**

Returns string with mentioned characters removed. If no argument is passed, it removes spaces.

Note: Returns source if source is not a string.

**SYNTAX**

```
STRIP(source*,chars)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                       |
| -------- | -------- | ----------------------------------------------------- |
| source   | string   | Source field                                          |
| chars    | string   | <p>String to be stripped</p><p>Default Value: " "</p> |

**EXAMPLES**

| **Source Data**     | **Expression**  | **Output** |
| ------------------- | --------------- | ---------- |
| city=' Chennai '    | STRIP(city)     | 'Chennai'  |
| city='XChennaiXXXX' | STRIP(city,'X') | 'Chennai'  |

### **TITLE**

**DESCRIPTION**

Returns title cased string (first character in upper case, rest in lower).

Note: Returns source if source is not a string.

**SYNTAX**

```
TITLE(source*)
```

**PARAMETER**

| **Name** | **Type** | **Description**                            |
| -------- | -------- | ------------------------------------------ |
| source   | string   | Source field to be changed into title case |

**EXAMPLES**

| **Source Data**       | **Expression** | **Output**    |
| --------------------- | -------------- | ------------- |
| message='hello worlD' | TITLE(message) | 'Hello World' |

### **TO\_ARRAY**

**DESCRIPTION**

Returns an array containing the input strings

**SYNTAX**

```
TO_ARRAY(*args)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                               |
| -------- | -------- | ------------------------------------------------------------- |
| args     | string   | <p>source fields (n>=1)</p><p>Data to be pushed into list</p> |

**EXAMPLES**

| **Source Data**                                  | **Expression**                    | **Output**      |
| ------------------------------------------------ | --------------------------------- | --------------- |
| <p>first\_name='Iron'</p><p>last\_name='man'</p> | TO\_ARRAY(first\_name,last\_name) | \['Iron','man'] |

### **TO\_ASCII**

**DESCRIPTION**

Converts Unicode characters to ASCII.

Note: Returns source, if source is not a string.

**SYNTAX**

```
TO_ASCII(source)
```

**PARAMETER**

| **Name** | **Type** | **Description**        |
| -------- | -------- | ---------------------- |
| source   | string   | Source field to remove |

**EXAMPLES**

| **Source Data**    | **Expression**        | **Output** |
| ------------------ | --------------------- | ---------- |
| item\_name='Škoda' | TO\_ASCII(item\_name) | 'Skoda'    |

### **TO\_NUMBER**

**DESCRIPTION**

Retrieves number in a string. Puts all the numbers in source as a list which can be indexed and accessed. Returns the value at zeroth index by default.

Note: Returns " " if source is not a string.

**SYNTAX**

```
TO_NUMBER(source*,index)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                        |
| -------- | -------- | ------------------------------------------------------ |
| source   | string   | Source field                                           |
| index    | integer  | <p>Index of the number need</p><p>Default Value: 0</p> |

**EXAMPLES**

| **Source Data**                                   | **Expression**      | **Output** |
| ------------------------------------------------- | ------------------- | ---------- |
| line1='14/3, 3055 GRAND AVE 75215, DALLAS, Texas' | TO\_NUMBER(line1)   | "14/3"     |
| line1='14/3, 3055 GRAND AVE 75215, DALLAS, Texas' | TO\_NUMBER(line1,1) | "3055"     |

### **TO\_STRING**

**DESCRIPTION**

Converts an array to string.

**SYNTAX**

```
TO_STRING(source*,join_characters)
```

**PARAMETER**

| **Name**         | **Type** | **Description**                                                                    |
| ---------------- | -------- | ---------------------------------------------------------------------------------- |
| source           | list     | Source field                                                                       |
| join\_characters | string   | <p>Join string to connect the elements in source array</p><p>Default Value=','</p> |

**EXAMPLES**

| **Source Data**                   | **Expression**             | **Output**      |
| --------------------------------- | -------------------------- | --------------- |
| alphabets=\["h","e","l","l","o" ] | TO\_STRING(alphabets)      | "h,e,l,l,o"     |
| alphabets=\["h","e","l","l","o" ] | TO\_STRING(alphabets,'\*') | "h\*e\*l\*l\*o" |

### **TO\_TIMESTAMP**

**DESCRIPTION**

Converts the given datetime to timestamp.

**SYNTAX**

```
TO_TIMESTAMP(source*, date_format, from_time_zone)
```

**PARAMETER**

| **Name**     | **Type**               | **Description**                                                                                                                                                                                        |
| ------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| source       | Datetime object/String | Source field                                                                                                                                                                                           |
| date\_format | String                 | <p>Format of the date if source is a string</p><p>Ex: "%Y-%m-%d %H:%M:%S"</p>                                                                                                                          |
| time\_zone   | String                 | <p>Timezone <a href="https://docs.dckapintegrator.com/developers/flows/supported-timezones"><https://docs.dckapintegrator.com/developers/flows/supported-timezones></a></p><p>Default Value: "UTC"</p> |

**EXAMPLE**

| **Source Data**                      | **Expression**                                    | **Output**   |
| ------------------------------------ | ------------------------------------------------- | ------------ |
| created\_at='2021-05-27 01:30:00 PM' | TO\_TIMESTAMP(created\_at,'%Y-%m-%d %H:%M:%S %p') | 1622079000.0 |

### **TRUNCATE**

**DESCRIPTION**

Truncates count characters . If reverse is set to True, the characters from right are truncated.

**SYNTAX**

```
TRUNCATE(source*,count,reverse)
```

**PARAMETER**

| **Name** | **Type** | **Description**                                                                |
| -------- | -------- | ------------------------------------------------------------------------------ |
| source   | string   | Source Field                                                                   |
| count    | integer  | Number of characters to be truncated from right                                |
| reverse  | boolean  | <p>Set to True to truncate characters from left</p><p>Default Value: False</p> |

**EXAMPLES**

| **Source Data** | **Expression**           | **Output** |
| --------------- | ------------------------ | ---------- |
| message='test'  | TRUNCATE(message,2)      | 'st'       |
| message='test'  | TRUNCATE(message,2,True) | 'te'       |

### **UPPER**

**DESCRIPTION**

Converts all lowercase characters in the string to uppercase.

Note: Returns source if source is not a string.

**SYNTAX**

```
UPPER(source*)
```

**PARAMETER**

| **Name** | **Type** | **Description** |
| -------- | -------- | --------------- |
| source   | string   | Source field    |

**EXAMPLE**

| **Source Data**     | **Expression** | **Output**  |
| ------------------- | -------------- | ----------- |
| message='Great Day' | UPPER(message) | 'GREAT DAY' |


# Advanced Scheduler

To schedule a Batch type Integration to run at any given time and frequency

## Advanced Scheduler

The Advanced Scheduler in DCKAP Integrator is an easy-to-use Schedule Editor that enables easy configuration of the Schedules. With just a few mouse clicks and no complex syntax building or coding, the Pipes can be easily scheduled to run at any required time or time interval.&#x20;

Click on the "Schedule" link in the Pipe tile. The Schedule Editor will open.&#x20;

The following fields are present in the Schedule Editor:&#x20;

1. Pipe Name: Name of the Integration pipe
2. Configured Schedules: The schedules that have been configured for this pipe
3. Cron Expression Builder Section: Where users can build and create different combinations of schedules for the pipe to run at.&#x20;
4. Timezone: The pipe schedules are executed with respect to the timezone provided. By default, it is UTC.
5. Base Frequency levels: Basic interval levels for users to choose from
6. Frequency intervals: Specific interval or range values for the Integrations to run
7. Specific time or day intervals: Specific day or time values for the integrations to run&#x20;

## Commonly Used Schedule Configurations with Examples

Following are a few widely used schedule configurations and how they can be set up in DCKAP Integrator:

1. [Basic: Run every 5 minutes](https://docs.cloras.com/user-guide/projects/integrations/scheduler#1-basic-run-every-5-minutes)
2. [Specific Time: Run at 5 PM on Thursdays](https://docs.cloras.com/user-guide/projects/integrations/scheduler#2-specific-time-run-at-5-pm-on-thursdays)
3. [Multiple Times: Run at 9 AM, 1 PM and 5 PM every day](https://docs.cloras.com/user-guide/projects/integrations/scheduler#3-multiple-times-run-at-9-am-1-pm-and-5-pm-every-day)
4. [Range of values: Run every 5 minutes from Monday to Friday](https://docs.cloras.com/user-guide/projects/integrations/scheduler#4-range-of-values-run-every-5-minutes-from-monday-to-friday)
5. [Ranges with a step: Run every 15 minutes](https://docs.cloras.com/user-guide/projects/integrations/scheduler#5-ranges-with-a-step-run-every-15-minutes)
6. [Combination of numeric values and ranges: Run every hour outside office hours](https://docs.cloras.com/user-guide/projects/integrations/scheduler#6-combination-of-numeric-values-and-ranges-run-every-hour-outside-office-hours)
7. [Specific Day and Month: Run every hour on Mar 15](https://docs.cloras.com/user-guide/projects/integrations/scheduler#7-specific-day-and-month-run-every-hour-on-mar-15)

### 1.Basic: Run every 5 minutes

<div align="center"><img src="/files/-M_yyNcjQZsqZjagXexk" alt="Choose Frequency Level: Minute, and Range: Every 5 minutes"></div>

### **2. Specific Time: Run at 5 PM on Thursdays**

<div align="center"><img src="/files/-M_yyqhJWjvebe9DBW7o" alt="Choose Frequency Level: Day of Week, and Speific Day: Thursday"></div>

<div align="center"><img src="/files/-M_yz-S-hCPnDB1r6qQ8" alt="Choose Frequency Level: Hour, and Specific Hour: 17"></div>

### **3. Multiple Times: Run at 9 AM, 1 PM and 5 PM every day**

<div align="center"><img src="/files/-M_yzWFb-4U74FQqywmu" alt="Choose Frequency Level: Hour, and Specific Hour: 5, 9, 17"></div>

### **4. Range of values: Run every 5 minutes from Monday to Friday**

<div align="center"><img src="/files/-M_z1nvTw1KlbVnAj6_Z" alt="Choose Frequence Level: Day of week, and Specific Day: Monday through Friday"></div>

<div align="center"><img src="/files/-M_yzlaII-bNIYN1iJ9Z" alt="Choose Frequency Level: Minute, and Range: Every 5 minutes "></div>

### **5. Ranges with a step: Run every 15 minutes**&#x20;

<div align="center"><img src="/files/-M_z-EBTgj25KYmkOB2X" alt="Choose Frequency Level: Minute, and Range: Every 15 minutes"></div>

### **6. Combination of numeric values and ranges: Run every hour outside office hours**

This requires 2 schedules to be configured as shown below:&#x20;

***Schedule 1:***&#x20;

<div align="center"><img src="/files/-M_z-rTB39qu4a5wHFKP" alt="Choose Frequency Level: Day of Week ,and Value: Monday through Friday; Choose Frequency Level Hour, and Range 6PM to 6AM"></div>

***Schedule 2:***&#x20;

<div align="center"><img src="/files/-M_z-gCJFexiA_8XisrX" alt="Choose Frequency Level: Day of Week, and Specific Day: Sun, Sat; Choose Frequency Level: Hour, and Range Every 1 hour"></div>

### **7. Specific Day and Month: Run every hour on Mar 15**

<div align="center"><img src="/files/-M_z02MNBbUHj3ndMImu" alt="Choose Frequency Level: Month, and Specific Month: March"></div>

<div align="center"><img src="/files/-M_z0CgvGD_Ex2yEsMQJ" alt="Choose Frequency Level: Day of Month, and Specific Day of Month 15; (Also choose every hour)"></div>

{% hint style="info" %}

## **Auto-Pilot Mode**

Auto-pilot mode in DCKAP Integrator allows users to automatically schedule a Batch type Integration to run at any given time and frequency.&#x20;

Users can schedule the pipes to synchronize at any particular time and day or during any desired interval using the Advanced Scheduler feature.&#x20;
{% endhint %}


# Workflows

Workflows are responsible for handling the core business logic like making API calls to the targeted system, formatting and validating data, logging transactions and so on.

<figure><img src="/files/bYsR4QPujN7YND0lNn1m" alt=""><figcaption></figcaption></figure>

Workflows represent an enhanced version of flows. By combining flows and integration screens, workflows offer users a unified platform for building, testing, executing, and monitoring integrations - all within a single interface.&#x20;

This streamlined approach simplifies the integration process, making it easy to build integrations with a straightforward and user-friendly interface.

### Key Features

* **All-in-One Page:** Easily build, test, run, debug, and view logs - all on a single page.
* **Simplified Flow Builder:** Experience a simple, unique, and user-friendly interface for building flows.
* **Streamlined Actions:** We've reduced and merged actions (formerly handlers) while preserving their capabilities for simplicity.
* **Automated Progress Bar:** No more manual progress adjustments in flows; it's automated now.
* **Code Runner:** Introducing the Code Runner for direct Python code execution, facilitating complex logic implementation.
* **Decision Builder:** Used in Decision and API Call actions, it allows users to create conditions that define the workflow's direction.
* **Removed Variable Handling:** We've removed user-defined variable definitions and declarations to enhance simplicity.

### Flow Builder

Our newly developed Flow Builder empowers you to create integrations seamlessly. It serves as the core logic behind actions like making API calls, logging, sending emails, and more. With its user-friendly and intuitive interface, you can effortlessly build integrations between various systems.

[Learn more](/project-manager/workflows/flow-builder)

### Actions

Formerly Handlers.&#x20;

Actions are used to build a flow in a tree structure, left to right. Every action has its functional logic and requires a certain set of inputs to be defined to carry out its activities. Multiple Actions are available to the user to build their flow.

[Learn more](/project-manager/workflows/actions)

We know you might have many questions about this new feature. For quick answers, be sure to visit our [FAQ](/project-manager/workflows/faqs) section.


# Flow Builder

At the heart of our application lies the innovative Flow Builder, your key to crafting seamless integrations that connect and streamline your systems. This robust tool simplifies the complexity of integrating various applications and services. It offers a wide array of features and a user-friendly interface to empower you to create, manage, and optimize your workflows effortlessly.

Flow Builder is designed with efficiency in mind. Whether you're a seasoned developer or new to the world of integration, this tool simplifies the process. The left-to-right layout mirrors the logical progression of your workflows, enhancing their understandability.

For a quick video explainer of Flow Builder, [click here.](https://www.youtube.com/watch?v=DLGDN6tvySM)

<figure><img src="/files/jHJXDFKZ42m3vky5x9Cv" alt=""><figcaption></figcaption></figure>

## Key Terminologies

#### Action

An "action" typically represents a specific task or operation within a workflow or integration process. Actions such as making API calls, sending emails, processing data, or any other operation that needs to be executed as part of the workflow. Actions are the individual building blocks of any integration workflow.

#### Step

A "step" refers to an individual unit or stage within the workflow that represents a specific action. Steps serve to organize and structure a workflow, defining the order in which actions are executed.&#x20;

#### Column

A "column" is a vertical section used to display and organize actions within a structured workflow. Each column represents a level or branch of the workflow. Columns help users visually navigate and understand the workflow.

#### Data Hub

It is a hub for data exchange, storing responses from all previously executed steps. These stored information are constant and cannot be modified.

#### Global Variables

Global variables can be declared in project settings and account settings. They allow you to define variables that can be accessed and used across your project or account. Learn more.

#### Special Variables

Special variables are built-in keywords available and unique to the respective workflow. These are constant and the values cannot be modified in the flows. Example: Current Date Time&#x20;

## Unique Left to Right Layout

The workflow page is vertically split into multiple columns. Each column represents a level or branch of the workflow with its steps. Workflows should be read from left to right, top to bottom.&#x20;

On clicking an option from `API Call` or `Decision` action, a column will appear on the right with its steps. This will go on a loop as long there is an option.&#x20;

Only one option in a column can be active to view its steps. Two options in the same column cannot be selected simultaneously. Always only one will be active.

## Features

{% tabs %}
{% tab title="All-in-One Integration Hub" %}
Gone are the days of juggling multiple pages to build an integration. With the new Flow Builder, you have a comprehensive integration hub that allows you to build, test, run, debug, and monitor logs all on a single page. It's a one-stop solution for your integration needs, simplifying the entire process from start to finish.
{% endtab %}

{% tab title="Exceptional User Interface" %}
The user interface is the gateway to powerful integrations. We've invested in creating a simple, unique, and user-friendly experience that caters to your needs. Whether you're implementing custom logic, making API calls, logging events, or sending emails, you'll find our builder both versatile and easy to navigate.
{% endtab %}

{% tab title="Endless Possibilities" %}
Our Flow Builder opens the door to limitless integration possibilities. It doesn't matter whether you're connecting two applications or orchestrating a complex network of systems – our tool is up to the task. Build, test, run, debug, and monitor your integrations seamlessly, and gain full control over your data and processes.
{% endtab %}
{% endtabs %}


# Variables

Variable is a temporary data holder used to store, reuse, and manipulate values during workflow execution.

Variables help you:

* Store API responses or transformed values
* Pass data between steps
* Control workflow logic dynamically

{% hint style="info" %}
Tip: Think of variables as memory boxes that live during workflow execution.
{% endhint %}

Earlier, many use cases relied on Code Runner snippets, but variables simplify this by reducing the need for custom code, improving workflow readability, making flows easier to debug and maintain, and enabling non-developers to configure and adjust logic with confidence.

### Supported Data Types

Variables support the following data types:

* String
* Number
* JSON (includes Array, List or Object)&#x20;
  * Refer this [IETF Document](https://datatracker.ietf.org/doc/html/rfc8259) to learn more about JSON format.
* Datetime

### Variable Declaration Guidelines

#### Declaration Areas

1. [Initialize Variable Step](#initialize-variable)
2. [Pre-step variable declaration](#pre-step-variable)
3. [Post-step variable declaration](#post-step-variable)

#### Naming Guidelines

* Use camelCase
* Use meaningful names
* Avoid spaces or special characters

Examples:

* ✅ orderId ❌ Order Id
* ✅ customerEmailAddress ❌ Customeremailaddress (for better readability)

### Initialize Variable

Initialize Variable is a step used to declare a variable and assign its initial value before it is used anywhere in the workflow.

#### When to Initialize?

* At the start of a workflow
* Before using a variable in conditions, API mapping, or transformations

**Examples**

{% columns %}
{% column %}
Variable Name: *customerEmail*

Initial Value: *""*

Type: *String*
{% endcolumn %}

{% column %}
Variable Name: *retryCount*

Initial Value: *0*

Type: *Number*
{% endcolumn %}
{% endcolumns %}

### Pre-Step & Post-Step Variables

#### Execution order

Pre-Step Variables → Actual Step Execution → Post-Step Variables

#### Pre-Step Variable

Pre-step variables are executede before the actual execution of a step.

Used for:

* Preparing input data
* Modifying request payloads
* Setting headers or query parameters
* Conditional execution

**Examples**

Before making Create Customer API call, to set a page limit of 1000 and to increment the page number by 1. It will increment the existing page number before making the api call.

{% columns %}
{% column width="50%" %}
Variable Name: page\_limit

Value: 1000

Type: *Number*
{% endcolumn %}

{% column width="50%" %}
Variable Name: page\_number

Value: `{{ page_number.increment()   }}`

Type: *Number*
{% endcolumn %}
{% endcolumns %}

#### Post-Step Variable

Post-step variables are executed after the respective step execution. Step responses can be referenced, but these variable definitions or updates are executed only after the step, so it cannot be accessed inside the step. Available to all downstream steps

**Used for**

* Storing API responses
* Extracting IDs
* Passing data to next steps
* Error or success validation

**Examples**

To store the customer ID which is returned in the response of that step, we can create post-step variable as following

{% columns %}
{% column width="58.333333333333336%" %}
Variable Name: createdCustomerId

Value: `{{ <particular_step_id>.response.id }}`&#x20;

Type: *Datahub*
{% endcolumn %}

{% column width="41.666666666666664%" %}

{% endcolumn %}
{% endcolumns %}

### How to Use Variables

Variables can be used anywhere DataHub values are allowed. Just like referencing responses from another step, variables can be easily called and reused throughout the flow.

#### Using Variables in API Mapping

```
{
  "email": "{{variables.customerEmail}}",
  "id": "{{variables.createdCustomerId}}"
}
```

#### Using Variables in Conditions

Condition:

```
{{variables.retryCount}} < 3
```

#### Updating Variable Value

Variables can be updated by assigning a static value or using [inline transformation](/project-manager/workflows/inline-transformations).

```
{{variables.retryCount.increment()}}
```

{% hint style="success" %}
If variables are used without being declared or initialized, they will return `null` or `None`. This is handled gracefully and will not throw any errors.
{% endhint %}

#### Steps Supporting Pre-Step & Post-Step Variables

{% columns %}
{% column %}

* API Step
* Decision Step
* Loop Step
  {% endcolumn %}

{% column %}

* Formatter Step
* Notification Step
* Code Runner Step
  {% endcolumn %}

{% column %}

* Detail Logger Step
* Set Response Step
* Snippet Step
  {% endcolumn %}
  {% endcolumns %}

{% hint style="info" %}
Initialize Variable is a standalone step at the start of the workflow.
{% endhint %}

### Variable Overview Panel

Since variables are defined inside steps, a Variable Overview Panel is provided for visibility and management. From this panel, you can:

* View all variables used in the workflow
* See each variable’s data type
* Identify which steps create or update each variable
* Jump directly to those steps
* Search or filter variables

The panel also clearly distinguishes variables that share the same name across:

* Workflow scope
* Snippet scope

### Deleting a Step

If a step that creates or updates variables is deleted:

* All variable operations from that step are removed
* A warning lists the affected variables
* You can choose to move or reassign those variables
* Any unresolved issues appear in the Global Error Panel

{% hint style="danger" %}
All variable operations from that step are removed
{% endhint %}

### Snippets and Variable Scope

* Variables created inside a snippet are accessible only within that snippet
* Variables created at the workflow level remain accessible across all workflow steps


# Inline Transformations

### Overview

Inline Transformations allow you to modify or derive values directly inside workflow fields, without adding extra steps or using a Code Runner.

They provide a safe, readable way to transform step responses and variables right where the value is used, keeping workflows concise and easy to understand.

### Why Inline Transformations?

To avoid the usage of Code Runners for even small changes such as trimming text or converting a string to uppercase letters.

Inline transformations solve this by enabling:

* Fewer workflow steps
* Reduced dependency on Code Runners
* Faster workflow creation
* Cleaner, more readable workflows

### How Inline Transformations Work

Transformations are written inside `{{ }}` using a dot-based function syntax like `toUpper()`

#### Syntax Rules

* Dots without () → Data access
  * `{{ 1.response.email }}`
* Dots with () → Transformation or operation
  * `{{ 1.response.email.toUpper() }}`

Transformation functions are applied to the respective field values. You can refer to the list of supported functions to transform your data.

{% content-ref url="/pages/GXzd3nq9o9C9HPoqVrkW" %}
[Allowed Functions](/project-manager/workflows/inline-transformations/allowed-functions)
{% endcontent-ref %}

### Examples

#### Basic Transformations

```
{{ 1.response.email.toUpper() }}
{{ 2.response.users.0.name.trim() }}
```

#### Working with Variables

```
{{ variables.counter.add(5).increment() }}
{{ variables.settings.merge({"theme":"dark"}) }}
```

Navigate to below page for more examples.

{% content-ref url="/pages/WoCxKogpyEh9exMTwqn8" %}
[Examples](/project-manager/workflows/inline-transformations/examples)
{% endcontent-ref %}

### Error Handling & Fallbacks

Inline transformations are designed to fail safely.

#### When an Error Occurs

* A non-blocking warning is logged
* The workflow continues execution
* No data is mutated

#### Using Fallback Values

You can define fallback values if a transformation fails:

```
{{ 2.response.count.add(10).increment().fallback(0) }}
{{ 3.response.items.5.fallback("N/A") }}
```

### Security & Safety

Inline transformations are secure by design:

* Only approved, type-safe functions are allowed
* No eval, no runtime access, no system calls
* Transformations are strictly read-only

{% hint style="info" %}
Inline transformations can derive values, but they never mutate step responses or variables directly.
{% endhint %}


# Allowed Functions

Inline Transformation Functions allow you to apply operations directly inside expressions wrapped with `{{ }}`. Functions can be chained, and execution happens left to right. The output of one function becomes the input for the next.

Example: `{{ 3.response.name.toUpper().startsWith("A").fallback(false) }}`

### Boolean Functions

#### toBoolean()

* Converts the current value to a boolean using the Convert utility.
* Allowed Parameters: None
* Structure: `toBoolean()`
* Examples:
  * `{{ "true".toBoolean() }}`
  * `{{ 1.toBoolean() }}`

#### toggle()

* Toggle the current boolean value (True becomes False, False becomes True).
* Allowed Parameters: None
* Structure: `toggle()`
* Examples:
  * `{{ is_active.toggle() }}`
  * `{{ true.toggle() }}`

#### and()

* Perform a logical AND between the current boolean value and another value.
* Allowed Parameters: rhs (Any)
* Structure: and(rhs)
* Examples:
  * `{{ is_valid.and(is_authenticated) }}`

#### or()

* Perform a logical OR between the current boolean value and another value.
* Allowed Parameters: `rhs (Any)`
* Structure: `or(rhs)`
* Examples:
  * `{{ is_admin.or(is_editor) }}`

### String Functions

#### toUpper()

* Converts the current string value to uppercase.
* Allowed Parameters: None
* Structure: `toUpper()`
* Examples:
  * `{{ user.name.toUpper() }}`

#### toLower()

* Converts the current string value to lowercase.
* Allowed Parameters: None
* Structure: `toLower()`
* Examples:
  * `{{ "HELLO".toLower() }}`

#### trim()

* Remove leading and trailing whitespace from the current string value.
* Allowed Parameters: None
* Structure: `trim()`
* Examples:
  * `{{ " hello ".trim() }}`

#### toString()

* Converts the current value to a string.
* Allowed Parameters: None
* Structure: `toString()`
* Examples:
  * `{{ price.toString() }}`

#### contains()

* Check if the current string value contains the given substring.
* Allowed Parameters: `substring (string)`
* Structure: `contains(substring)`
* Examples:
  * `{{ email.contains("@") }}`

#### startsWith()

* Check if the current string value starts with the given prefix.
* Allowed Parameters: `prefix (string)`
* Structure: `startsWith(prefix)`
* Examples:
  * `{{ phone.startsWith("+1") }}`

#### endsWith()

* Check if the current string value ends with the given suffix.
* Allowed Parameters: `suffix (string)`
* Structure: `endsWith(suffix)`
* Examples:
  * `{{ filename.endsWith(".pdf") }}`

#### replace()

* Replace all occurrences of a substring with a new substring.
* Allowed Parameters: `old (string), new (string)`
* Structure: `replace(old,new)`
* Examples:
  * `{{ text.replace("bad", "good") }}`

#### slugify()

* Convert the current string value into a slug (lowercase, hyphen-separated).
* Allowed Parameters: None
* Structure: `slugify()`
* Examples:
  * `{{ title.slugify() }}`

#### split()

* Split the current string value into a list using the given separator.
* Allowed Parameters: `sep (Any)`
* Structure: `split(sep)`
* Examples:
  * `{{ tags.split(",") }}`

#### substring()

* Extract a substring using start and optional end indices.
* Allowed Parameters: `start (int), end (int, optional)`
* Structure: `substring(start,end)`
* Examples:
  * `{{ "Elephant".substring(0, 3) }}`

#### toTitleCase()

* Convert the current string value to title case (capitalize each word).
* Allowed Parameters: None
* Structure: `toTitleCase()`
* Examples:
  * `{{ "john doe".toTitleCase() }}`

#### toNumber()

* Convert the current string value to a number.
* Allowed Parameters: None
* Structure: `toNumber()`
* Examples:
  * `{{ "42.5".toNumber() }}`

#### padStart()

* Pad the current string on the left until it reaches the given length.
* Allowed Parameters: `length (int), char (string, optional)`
* Structure: `padStart(length,char)`
* Examples:
  * `{{ "5".padStart(2, "0") }}`

#### padEnd()

* Pad the current string on the right until it reaches the given length.
* Allowed Parameters: `length (int), char (string, optional)`
* Structure: `padEnd(length,char)`
* Examples:
  * `{{ "5".padEnd(3, "0") }}`

#### parseJSON()

* Parse the current string value as JSON safely.
* Allowed Parameters: None
* Structure: `parseJSON()`
* Examples:
  * `{{ json_string.parseJSON() }}`

### Numeric Functions

#### add()

* Add a given number to the current value.
* Allowed Parameters: `number (Any)`
* Structure: `add(number)`
* Examples:
  * `{{ 10.add(5) }}`

#### subtract()

* Subtract a given number from the current value.
* Allowed Parameters: `number (Any)`
* Structure: `subtract(number)`
* Examples:
  * `{{ 20.subtract(5) }}`

#### increment()

* Increase the current numeric value by 1.
* Allowed Parameters: None
* Structure: `increment()`
* Examples:
  * `{{ count.increment() }}`

#### decrement()

* Decrease the current numeric value by 1.
* Allowed Parameters: None
* Structure: `decrement()`
* Examples:
  * `{{ count.decrement() }}`

#### round()

* Round the current float value to the specified decimal places.
* Allowed Parameters: `decimals (int, optional)`
* Structure: `round(decimals)`
* Examples:
  * `{{ 3.14159.round(2) }}`

#### toInteger()

* Convert the current float value to an integer.
* Allowed Parameters: `args (Any)`
* Structure: `toInteger(args)`
* Examples:
  * `{{ 9.99.toInteger() }}`

***

### List Functions

#### length()

* Get the number of items in the current list.
* Allowed Parameters: None
* Structure: `length()`
* Examples:
  * `{{ items.length() }}`

#### push()

* Append an item to the end of the current list.
* Allowed Parameters: `item (Any)`
* Structure: `push(item)`
* Examples:
  * `{{ cart.push("apple") }}`

#### prepend()

* Insert an item at the beginning of the current list.
* Allowed Parameters: `item (Any)`
* Structure: `prepend(item)`
* Examples:
  * `{{ history.prepend("new_event") }}`

#### pop()

* Remove the last item from the current list.
* Allowed Parameters: None
* Structure: `pop()`
* Examples:
  * `{{ stack.pop() }}`

#### removeAt()

* Remove the item at the specified index.
* Allowed Parameters: `index (int)`
* Structure: `removeAt(index)`
* Examples:
  * `{{ list.removeAt(0) }}`

#### extend()

* Extend the list by appending all items from another list.
* Allowed Parameters: `items (Any)`
* Structure: `extend(items)`
* Examples:
  * `{{ list_a.extend(list_b) }}`

#### unique()

* Remove duplicate items from the current list.
* Allowed Parameters: None
* Structure: `unique()`
* Examples:
  * `{{ categories.unique() }}`

#### join()

* Join all items in the list into a string.
* Allowed Parameters: `sep (Any)`
* Structure: `join(sep)`
* Examples:
  * `{{ words.join(" ") }}`

#### pluck()

* Extract values for a given key from each dictionary in the list.
* Allowed Parameters: `key (Any)`
* Structure: `pluck(key)`
* Examples:
  * `{{ users.pluck("id") }}`

#### filter()

* Filter items based on a condition (use 'element' as context).
* Allowed Parameters: `condition (string)`
* Structure: `filter(condition)`
* Examples:
  * `{{ numbers.filter("element > 10") }}`

***

### JSON Functions (Objects and Arrays)

#### setKey()

* Set a key in the JSON object to the given value.
* Allowed Parameters: `key (Any), value (Any)`
* Structure: `setKey(key,value)`
* Examples:
  * `{{ user.setKey("status", "active") }}`

#### removeKey()

* Remove a key from the JSON object.
* Allowed Parameters: `key (Any)`
* Structure: `removeKey(key)`
* Examples:
  * `{{ user.removeKey("password") }}`

#### merge()

* Merge another dictionary into the current object.
* Allowed Parameters: `obj (Any)`
* Structure: `merge(obj)`
* Examples:
  * `{{ settings.merge(default_settings) }}`

#### pick()

* Create a new object containing only the specified keys.
* Allowed Parameters: `keys (Any)`
* Structure: `pick(keys)`
* Examples:
  * `{{ profile.pick(["name", "email"]) }}`

***

### DateTime Functions

#### fromTimestamp()

* Convert a Unix timestamp into a UTC datetime value.
* Allowed Parameters: `ts (int)`
* Structure: `fromTimestamp(ts)`
* Examples:
  * `{{ 1704067200.fromTimestamp() }}`

#### toTimestamp()

* Convert the current datetime value into a Unix timestamp.
* Allowed Parameters: None
* Structure: `toTimestamp()`
* Examples:
  * `{{ now.toTimestamp() }}`

#### format()

* Format the datetime into a string with optional timezone.
* Allowed Parameters: `format (string, optional), tz (string, optional)`
* Structure: `format(format,tz)`
* Examples:
  * `{{ event.date.format("%Y-%m-%d", "UTC") }}`

#### addDays()

* Add a given number of days to the current datetime.
* Allowed Parameters: `number (int)`
* Structure: `addDays(number)`
* Examples:
  * `{{ today.addDays(7) }}`

#### subtractDays()

* Subtract a given number of days from the current datetime.
* Allowed Parameters: `number (int)`
* Structure: `subtractDays(number)`
* Examples:
  * `{{ today.subtractDays(1) }}`

#### addHours()

* Add a given number of hours to the current datetime.
* Allowed Parameters: number (int)
* Structure: addHours(number)
* Examples:
  * `{{ now.addHours(2) }}`

#### diffDays()

* Calculate the difference in days between two datetimes.
* Allowed Parameters: other (Any)
* Structure: `diffDays(other)`
* Examples:
  * `{{ deadline.diffDays(now) }}`

#### isAfter()

* Check if the current datetime is after another datetime.
* Allowed Parameters: other (Any)
* Structure: `isAfter(other)`
* Examples:
  * `{{ delivery_date.isAfter(order_date) }}`

#### isBefore()

* Check if the current datetime is before another datetime.
* Allowed Parameters: other (Any)
* Structure: `isBefore(other)`
* Examples:
  * `{{ start_date.isBefore(end_date) }}`

#### startOfDay()

* Set the datetime to 00:00:00.
* Allowed Parameters: None
* Structure: `startOfDay()`
* Examples:
  * `{{ now.startOfDay() }}`

#### endOfDay()

* Set the datetime to 23:59:59.999999.
* Allowed Parameters: None
* Structure: `endOfDay()`
* Examples:
  * `{{ now.endOfDay() }}`

#### getDate()

* Extract the date portion as an ISO string (YYYY-MM-DD).
* Allowed Parameters: None
* Structure: `getDate()`
* Examples:
  * `{{ event.getDate() }}`

#### getTime()

* Extract the time portion as an ISO string (HH:MM:SS).
* Allowed Parameters: None
* Structure: `getTime()`
* Examples:
  * `{{ now.getTime() }}`

#### toISO()

* Convert the datetime into an ISO 8601 string.
* Allowed Parameters: None
* Structure: `toISO()`
* Examples:
  * `{{ updated_at.toISO() }}`

#### toRFC2822()

* Convert the datetime into an RFC 2822 string.
* Allowed Parameters: None
* Structure: `toRFC2822()`
* Examples:
  * `{{ created_at.toRFC2822() }}`

### Utility Functions

#### fallback()

* Returns the specified fallback value if a runtime error occurs during execution.
* Allowed Parameters: Any (accepts fallback value in syntax)
* Structure: `fallback("Fallback Value")`
* Examples:
  * `{{ user.address.city.fallback("N/A") }}`


# Examples

### Basic Transformations

**UseCase 1:** Navigates through a nested JSON response to find a specific customer's last name and converts the text to all capital letters.

```
{{3.response.customers.0.last_name.toUpper()}} 
```

**UseCase 2:** Demonstrates chaining multiple string functions where each transformation is applied to the result of the previous one.

```
{{3.response.customers.0.last_name.toUpper().toLower().toTitleCase()}} 
```

### Dynamic and Nested Transformations

**UseCase 1:** Retrieves a value from expression 3 to use as a key. It then looks up that dynamic key inside object 2 and accesses the "foo" property within that result.

```
{{2.{{3.name}}.foo}} 
```

**UseCase 2:** Executes a search-and-replace where both the search term and the replacement term are processed by functions before being passed into the parent replace function. The inner expressions are executed first, and the values are passed as arguments to the main expression.

{% code overflow="wrap" %}

```
{{3.response.customers.0.default_address.name.replace({{3.response.customers.0.last_name.toLower()}}, {{3.response.customers.0.first_name.toUpper()}})}} 
```

{% endcode %}

**UseCase 3:** Resolves a dynamic key from expression 3 to find a value, then performs a replacement using another dynamic value from expression 4 as the search target.

```
{{variables.customer_data.{{3.key}}.value.replace({{4.x}},'z')}}
```

### Logical and List Transformations

**UseCase 1:** Converts a raw string stored in variable 21 into a structured JSON object, then extracts the value associated with the "name" property.

```
{{21.parseJSON().name}} 
```

**UseCase 2:** Combines the current settings object with a default settings object (overwriting where necessary) and then discards all keys except for 'theme' and 'lang'.

```
{{4.payload.settings.merge({{5.defaults}}).pick(['theme', 'lang'])}} 
```

**UseCase 3:** Scans a list for active users, extracts only their email fields, and joins them into a single semicolon-separated string.

```
{{2.users.filter("element.active == true").pluck('email').join('; ')}} 
```

### Error Handling and Fallback Option

**UseCase 1:** Attempts a calculation; if the field "name" is missing or is not a number, the entire operation safely returns the numeric value 0.

```
{{3.response.name.add(10).increment().fallback(0)}}
```

**UseCase 2:** Demonstrates error skipping. Because add("Guna") fails, the engine skips all keys and functions until the next fallback (.toString().add(2).toUpper() are ignored). It then continues execution from fallback(1) into the .increment() function.

```
{{3.response.customers.3.orders_count.add("Guna").toString().add(2).toUpper().fallback(1).increment().fallback(10)}} 
```

**UseCase 3:** Uses a fallback within an inner expression. If the dynamic "age" value is missing, it defaults to 10 for the addition. If the primary "orders\_count" path is broken, the outer fallback returns 100.

```
{{3.response.customers.0.orders_count.add({{78.age.fallback(10)}}).fallback(100)}} 
```


# Snippets

Snippets are reusable sets of logical steps within workflows that enhance both reusability and readability. They allow for more efficient workflow management by simplifying complex integrations.

<figure><img src="/files/Yc1zgV5Y0Ah19bWblvhG" alt=""><figcaption></figcaption></figure>

**Reusability**

A set of logical steps within a workflow needs to be reused in multiple instances within the same workflow.

**Readability**

For complex integrations, workflows often require a large number of steps. Adding a layer of abstraction helps structure the workflow and enhances readability.<br>

Snippets help speed up workflow development by minimizing repetitive steps. A snippet can consist of one step or a collection of steps. Once created, users can include snippets using the [Snippet Tool](/project-manager/workflows/actions/snippet) in the main workflow.

## Creating Snippets

Apart from inputs and outputs, a snippet must contain at least one step to use snippet in main workflow.

### Inputs and Outputs

Inputs are defined to access data inside the snippet from the main workflow. And output is required and used to return data to the main workflow.

Inputs are optional and multiple inputs can be defined.

#### Inputs

Multiple Inputs format Supported: String, Number, Boolean, JSON. Users can also specify whether an input field is mandatory using the required option (Yes/No).&#x20;

If an input field is not required, users can provide a default value. Snippet uses the default value if actual value is empty during execution.

#### Output

The output is the snippet's response. It is required and can be of any supported data types.

The output can either be a single step response or a list of responses from multiple steps, as determined by the user. Only one output will be returned from the snippet, which will then be accessible within the main workflow.&#x20;

All other local step responses within a snippet will remain inaccessible outside the snippet.

### Test Snippets

Using the Test Snippet option, users can test snippets during the workflow development process to ensure the functionality by providing sample inputs.

## Using Snippets

Snippets can be used in the main workflow using the [Snippet Tool](/project-manager/workflows/actions/snippet).&#x20;

## Limitations

* The scope of DataHub values are limited to the snippet.
* Users can only access the defined snippet input inside a snippet and can only access the snippet response in the main workflow.
* No Nested Snippets.Snippets can only be used at one level.
* The Stop tool is not available inside the snippet tool.
* The debugger option is currently not available for snippet steps.


# Actions

Formerly Handlers.

Actions are used to build a flow in a tree structure, left to right. Every action has its functional logic and requires a certain set of inputs to be defined to carry out its activities. Multiple Actions are available to the user to build their flow.

Available actions are

* [API Call](/project-manager/workflows/actions/api-call)
* [Console](/project-manager/workflows/actions/console)
* [Decision](/project-manager/workflows/actions/decision)
* [Loop](/project-manager/workflows/actions/loop)
* [Detail Logger](/project-manager/workflows/actions/detail-logger)
* [Error Logger](/project-manager/workflows/actions/error-logger)
* [Code Runner](/project-manager/workflows/actions/code-runner)
* [Formatter](/project-manager/workflows/actions/formatter)
* [Notification](/project-manager/workflows/actions/notification)
* [Return](/project-manager/workflows/actions/return)
* [Sleep](/project-manager/workflows/actions/sleep)

### Action/Step Output in Console Logs

Each action/step has an option `Show output in console logs` which allows the users to control each step outputs in console logs.&#x20;

* If enabled, the execution status of the action or step output is logged in console logs.&#x20;
  * For API calls, users can customize the information in more detail by selecting options such as Request Information, Response Information, and more.
* If disabled, the respective action step output will not be logged in console logs.&#x20;

This allows the users to customize the information available in the console logs.

{% hint style="info" %}
This option will only work if console logging is enabled both in the project settings and for the specific pipe or workflow.
{% endhint %}


# API Call

Triggers an API Call in which you can pass parameters and payload to any system. The API responses will be returned as step output which is available under the data hub for further usage in the workflow.

## Options

1. [Choose System](#choose-system)
2. [Choose API](#choose-api)
3. [Choose Credentials](#choose-credential)
4. [Provide API Information](#api-information)

### Choose System

Search and select the target system from the list of private and public systems available under the current project as shown in the below image.

<figure><img src="/files/vzwk4C9DSt8Idg1RVzWC" alt=""><figcaption></figcaption></figure>

### Choose API

After selecting the target system, the list of available active APIs of the selected system will be seen as shown in the below image. This can be managed in the [API Manager](/project-manager/systems/api-manager).

<figure><img src="/files/f8btlz2s3L4AtklgBEaX" alt=""><figcaption></figcaption></figure>

### Choose Credential

After selecting the target API, you have to choose or add the credentials to connect to the target system.

<figure><img src="/files/WcIK6vId6QO3CZQ0MFAp" alt=""><figcaption></figcaption></figure>

Here you can also test the credentials before selecting it, using the option `Test` with Fresh token.

{% hint style="warning" %}
API Call action is allowed to save only after selecting the System, Api and Credentials
{% endhint %}

### API Information

<figure><img src="/files/M2KjaUtR0wP2biOru8Bm" alt=""><figcaption></figcaption></figure>

#### **Payload**

API Request Body. This section allows the user to provide payload and also the ability to modify using `Mapping & Modifiers` and `Preprocessor`. The final payload will be sent while making the API request.

<figure><img src="/files/gZ7qobkHnEoeAoB4Ymio" alt=""><figcaption></figcaption></figure>

* ***Payload -*** Request Body. Information is sent along with the API call. You can provide data directly to the payload or select the data of previous steps from the data hub.
* ***Total Records -*** Number of records received/created using the API call. You can provide an integer value directly or select the length of data from previous steps using the data hub.
  * ***Mapping & Modifiers -*** Provides the ability to get mappings from the user and format data before calling destination API.

    * Data from the source fields are mapped to the associated destination fields and then formatted using Modifiers.
    * Payload is considered as Source Data.
    * For more details on how to create a mapping, navigate to [Mapping and Modifiers](https://docs.dckapintegrator.com/project-manager/integrations/mapping-and-modifiers)

    <figure><img src="/files/q8t7MNyT7luEnuCqHE3j" alt=""><figcaption></figcaption></figure>

**Using Tokens in API Payloads**

The API call step also supports inserting tokens directly into the payload. For token-based systems, the token value is available in DataHub, and you can easily add it to the payload by clicking the token. If the token is in JSON format, you can reference specific keys using dot notation, for example:\
`{{special.credentials.token.access_token}}`

#### **Preprocessor**

Provides the ability to modify the payload before making an api call. Use the code editor to modify the data.

<figure><img src="/files/7EnNurlJfkuxu1NlkY4k" alt=""><figcaption></figcaption></figure>

Use the preprocessor when you need to:

* Modify or set payload data
* Modify or set a parameter value based on a condition
* Modify or set a header value based on a condition

This avoids duplicating steps or adding complex logic to earlier workflow stages. Preprocessor runs before the request is sent, allowing you to update keys and values conditionally.

**Payload - Order of Execution**

Payload ➡️ Mapping & Modifiers ➡️ Preprocessor

The initial payload will be modified in `Mapping & Modifiers`. The mapped payload will be modified in Preprocessor. If mapping is not configured, the initial payload will be modified in the Preprocessor.

<figure><img src="/files/gZ7qobkHnEoeAoB4Ymio" alt=""><figcaption></figcaption></figure>

The order cannot be changed. If payload modification is not needed, `Mapping & Modifiers` and `Preprocessor` can be skipped.

#### Response Validation

Users can set conditions to validate the API response. If the condition is met, it follows the successful workflow path; if not, it takes the failure path. Conditions can include checking if the API is successful using the status code or ensuring it contains data, among other business-specific criteria.&#x20;

By default, each API call includes a condition to check if it's successful using the status code, but users can modify this condition using the condition builder to better suit their needs. This ensures flexibility and adaptability in response validation.

<figure><img src="/files/NJf9HENa3RsK8ReehMAV" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
For some systems, the successful API response status code is not just 200. It may return 201 too. In such cases, you can modify the condition builder to use the "in" condition from the dropdown and provide values as a list. Example: \[200, 201]
{% endhint %}

#### Advanced Options

The following are the other additional parameters which you can provide to make an API call.

<figure><img src="/files/WQ6Jr3gfJxgqD3ZMZh1W" alt=""><figcaption></figcaption></figure>

* ***Headers -*** Request Headers. Example: `{"Accept": "application/json"}`
* ***Files -*** Upload one or many file contents. Example: `[('file', ('foo.csv', "hello,there,csv,data")), ('file',('bar.txt', "this is a file content"))]`
* ***URL Arguments -*** Arguments used in a dynamic URL.
  * Example Use Case:

    API URL: `/api/customer/{customer_id}/fetch`

    URL Argument: `{"customer_id":"2"}`

    Formatted URL: `/api/customer/2/fetch`

    In this case, `customer_id` is replaced with the number `2`.
* ***Parameters -*** Request parameters
  * Example Use Case:

    API URL: `api/customer/get/?format={format}`

    Query Params: `{"format":"json"}`

    Formatted URL: `api/customer/get/?format=json`

    Here, `format = json` will be the query parameters.
* ***Override Timeout -*** To override the timeout at the flow level.&#x20;
  * To override the API manager timeout at the Flow level.
    * **Choose -** Yes/No from the drop-down list. Yes - Override the timeout based on the read and connect values mentioned here. No - Do not override the timeout based on read and connect values mentioned here
    * "**Connect**" refers to the maximum allowed time for a DCKAP Integrator to establish communication with the system to which the API call is made.
    * "**Read**" refers to the maximum allowed time for the system to respond back to the DCKAP Integrator.

#### For XML Payload (Examples)

#### Plain request

`{'plain_request': {'key1':'value1','key2':'value2'}}`

#### Not a plain request

`{'body':{'key1':'value1','key2':'value2'}}`

Use keywords(`DYNAMIC_TOKEN`, `GET_FROM_CREDENTIALS`) to fetch and pass the respective dynamic information in headers and payload.

* DCKAP Integrator accepts API responses in JSON, CSV and Text formats.
* API Call action also has the facility to add headers from Flows.

#### To add additional envelope namespace&#x20;

Along with the above request, add another key “envelope\_namespace” to add additional namespace with default namespace

XML Request Body

```xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterprise.soap.sforce.com">
   <soapenv:Header>
   </soapenv:Header>
   <soapenv:Body>
      <urn:login>
         <urn:username>user1@ddckap.com</urn:username>
         <urn:password>user1@123</urn:password>
      </urn:login>
   </soapenv:Body>
</soapenv:Envelope>
```

Converted JSON request Body

<pre class="language-json"><code class="lang-json">{
    "envelope_namespace": "xmlns:urn='urn:enterprise.soap.sforce.com'",
<strong>    "body": {
</strong>        "urn:login": {
            "urn:username": "user1@ddckap.com", 
            "urn:password": "user1@123"
        }
    }
}
</code></pre>


# Console

Displays messages in the `Logs` section console area. This is especially useful in debugging the workflow and the messages can be either static or dynamic.

<div data-full-width="false"><figure><img src="/files/9D7bKgMArGtRX0ZMDIpf" alt=""><figcaption></figcaption></figure></div>

### **Options**

* ***Message*** - Content that needs to be displayed. Dynamic fields are selected from Data Hub. Example: `{{1.response.first_name}}`, `{{special.current_datetime}}`. Static values can be directly provided. Example: `HelloWorld`, `12345`
  * It can be a combination of both: `{{1.response.first_name}} is created successfully at {{special.current_datetime}}`


# Decision

Used to define multiple option paths and proceed to a particular path when the respective condition is satisfied. Allows the user to add multiple option paths with their own title and condition.

The option that satisfies the given condition will be executed. If all conditions are failed then the else option will be executed.

<figure><img src="/files/p3kZHQ3HlOtjic1viZOz" alt=""><figcaption></figcaption></figure>

### Options

For each option

* Title - Title of the option for better readability and understandability. Keep it short.
* Condition
  * Field - Selected from [Data Hub](/project-manager/workflows/flow-builder#data-hub)
  * Operator - to compare the field and value
  * Value - to which the field is compared

In a single option, multiple conditions can be configured with the joining operators `AND, OR`. The nested level is also allowed to provide precedence to the sub-condition.

**Example:** `{{1.name}}` is equal to `Alice` <mark style="color:orange;">AND</mark> (`{{1.city}}` is equal to `New York` <mark style="color:orange;">OR</mark> `{{1.zipcode}}` is equal to `10001`)

In the above example, the precedence is given to city and zip code. Nested is used to provide that precedence in Condition Builder.

There are no limitations on how many options can be added.&#x20;

### Use Cases:

Multiple options to execute different workflow paths based on the city of the customer.

**Option A:**&#x20;

Title: Customer from New York

Condition: `{{1.customer.city}}` is equal to `New York`&#x20;

<mark style="color:green;">This will be executed when the customer is from New York</mark>

**Option B:**&#x20;

Title: Customer from Los Angeles

Condition: `{{1.customer.city}}` is equal to `Los Angeles`&#x20;

<mark style="color:green;">This will be executed when the customer is from Los Angeles</mark>

**Else Option**

No condition is needed for the else option. <mark style="color:green;">This will be executed when the customer is neither from</mark> <mark style="color:green;"></mark><mark style="color:green;">`New York`</mark> <mark style="color:green;"></mark><mark style="color:green;">nor</mark> <mark style="color:green;"></mark><mark style="color:green;">`Los Angeles`</mark><mark style="color:green;">.</mark>


# Loop

Executes a block of code a specified number of times or based on a range of values.

<figure><img src="/files/MqJZKP1pHIHXRZwvqIVT" alt=""><figcaption></figcaption></figure>

### Options

* ***Iterable** -* Iterable element which can be traversed or looped through its items one at a time.&#x20;

  You can select the previous node value from the data hub or you can provide it directly.
* ***Batch Processing** -* Allows processing a group of records in batches, rather than one by one.
* ***Batch size** -* Single batch size. To be provided, only if batch processing is enabled. The batch size should be a minimum of 100.

### Examples

<table data-header-hidden><thead><tr><th width="245">Iterable</th><th width="165.33333333333331">Batch Processing</th><th>Output</th></tr></thead><tbody><tr><td>[11,12,13,14,15]</td><td>No</td><td><p>Number of iterations: 5</p><p></p><p>Iteration 1: <em>{'item': 11, 'index': 0}</em></p><p>Iteration 2: <em>{'item': 12, 'index': 1}</em></p><p>Iteration 3: <em>{'item': 13, 'index': 2}</em></p><p>Iteration 4: <em>{'item': 14, 'index': 3}</em></p><p>Iteration 5: <em>{'item': 15, 'index': 4}</em></p></td></tr><tr><td>[11,12,13,14,15]</td><td><p>Yes. </p><p>Batch size: 3 </p></td><td><p>Number of iterations: 2</p><p></p><p>Iteration 1: <em>{'item': [11,12,13], 'index': 0}</em><br>Iteration 2: <em>{'item': [14,15], 'index': 1}</em></p></td></tr><tr><td>[{"name": "abc", "age": 20}, {"name": "def", "age": 25}, {"name": "ghi", "age": 30}, {"name": "jkl", "age": 35}, {"name": "mno", "age": 40}] </td><td><p>Yes. </p><p>Batch size: 3 </p></td><td><p>Number of iterations: 2</p><p></p><p>Iteration 1: </p><p><em>{'item': [{"name": "abc", "age": 20}, {"name": "def", "age": 25}, {"name": "ghi", "age": 30}], 'index': 0}</em></p><p>Iteration 2: <br><em>{'item': [{"name": "jkl", "age": 35}, {"name": "mno", "age": 40}], 'index': 1}</em></p></td></tr><tr><td>{{1.response.products}}</td><td><p>Yes. </p><p>Batch size: 100</p></td><td>It will return each product data with index. </td></tr></tbody></table>

{% hint style="info" %}
*Batch size 3 is used for illustration purpose only. Minimum Batch Size allowed is 100.*
{% endhint %}


# Detail Logger

Detail Logger is similar to the Error Logger but is used to provide logs at the item level. Detail Logger marks every single entity(like each product, customer, or order) inside the loop as a **Success** or **Failure**.

This can be viewed by clicking the "View" button in the Logs section.

<figure><img src="/files/xiSox0ptKcSopIznJl7C" alt=""><figcaption></figcaption></figure>

### Options

* ***Status*** - Status of the execution. Success or Failure
* ***Entity ID*** - ID of the entry. Useful in identifying if the entities succeeded or failed. Exampl&#x65;*:* `{{2.item.product_id}}`
* ***Short Message*** - Content to be logged. Keep it short and readable.
* ***Detailed Message*** - Log request or response information in more detail, in case of failures. Otherwise, avoid logging large data as it might slow down the logs page.

### Examples

**Success Entity Use Case**

* Status: `Success`
* Entity ID: `{{2.item.product_id}}`
* Short Message: `Product {{2.item.product_id}} Created`
* Detailed Message: Empty. As it is not needed.

**Failure Entity Use Case**

* Status: `Failure`
* Entity ID: `{{2.item.product_id}}`
* Short Message: `Product ID: {{2.item.product_id}}, Error: {{2.item.error_message}}`
* Detailed Message: `{{2.item}}`


# Error Logger

Error Logger handler is used to log any general errors or warnings in the flow. The Logs menu in the project area displays all the logs from the synchronization.

<figure><img src="/files/IbZEEYpSJuQatfwEXRLi" alt=""><figcaption></figcaption></figure>

### Options

* ***Message*** - Content to be logged. Shown on the logs page when the user clicks the "View detail logs" button. Message value character limit is 200.

{% hint style="warning" %}
Each Error Logger step supports a maximum of 200 characters and a total of 1000 characters per workflow. Longer messages will be truncated to the above character limit.
{% endhint %}

### Examples:

It can be a raw string

<pre><code><strong>Unable to make the get products API because of missing category ID.
</strong></code></pre>

or a field from [Data Hub](/project-manager/workflows/flow-builder#data-hub)

```python
{{1.response.error_message}}
```

or both

<pre><code><strong>Get products is failed. More details: {{1.response.error_message}}
</strong></code></pre>


# Code Runner

Code Runner allows the user to use Python code to perform operations.&#x20;

<figure><img src="/files/s1IRBT4EuARDtZjisB3r" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
The output should be stored in a variable called response at the end of Code Runner.&#x20;

response = "Hello World"
{% endhint %}

The previous step responses from Data Hub can be used in Code Runner by enclosing the step number (optionally followed by a dot and variable name in case of nested structure) within double curly brackets.&#x20;

```python
email = {{1.response.customer.email}}
// Do something here
```

## Restrictions

* Allowed packages:  `JSON, datetime, math, re and time`
* Allowed built-in methods: `min, max, len, range, all, any, bool, dict, enumerate, filter, float, int, isinstance, list, map, reversed and sum`
* Other than the above-specified packages and built-in methods, no other packages can be imported as `Import` is restricted.

## Use Cases

### "response" Variable

Code Runner should have a variable called `response` which holds the final result. If there is no variable called response, there will be a validation error.

**Example 1:**

```python
response = {"ids": [1,3,5,6]}
```

Output:

`{"ids": [1,3,5,6]}`

**Example 2:**

```python
def check(email):
    if(re.fullmatch(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b', email)):
        return True
    else:
        return False
response=check("abc@dckap.com")
```

Output:&#x20;

`True`

### Import is restricted

Importing other packages/modules is not allowed in Code Runner. If imported, the code will throw an error and will not be executed.

**Example:**

```python
import pandas as pd
data = {"items": ['pen', 'pencil', 'sharpener'], "quantity": [50, 40, 45]}
df = pd.DataFrame(data)
response = df
```

Output:

`Execution failed because import found in code`

### Built-in methods

The usage of built-in methods other than the listed methods is not supported.&#x20;

**Example 1: Using an allowed built-in method**

```python
a = [1,2,3,4]
response = min(a)
```

Output:&#x20;

`1`<br>

**Example 2: Using a not allowed built-in method**

```python
a = [1,2,3,4]
response = type(a)
```

Output:

`name 'type' is not defined`<br>

{% hint style="info" %}
If any restricted methods are needed for you, reach out to us with your use case by raising a ticket in the Support Portal.
{% endhint %}

### Execution Time Limit

<mark style="color:green;">`3 minutes`</mark>

If the code takes more than that for execution, a timeout occurs and an error is thrown.

### ~~Modify~~ Duplicate Previous Step Values

Changing the result of the previous step is restricted in workflows. However, with the help of Code Runner, any previous step from the Data hub can be duplicated and modified. The response of Code Runner can be used where the modified data is needed.


# Formatter

Formatter is used to format the given data. It is designed to handle the conversion of data between different formats, such as CSV, string, XML, and JSON. Also, the formatter provides the ability to generate the timestamp and convert between timezones. This tool facilitates the transformation of data to and from the JSON format, offering seamless interoperability.

### Options

* ***Data (to be formatted)*** - the data that will be formatted according to the selected `Formatter Action`
* ***Formatter Action*** - action to be applied to the above data
  * [JSON to STRING](#json-to-string)
  * [STRING to JSON](#string-to-json)
  * [XML to JSON](#xml-to-json)
  * [JSON to CSV](#json-to-csv)
  * [CSV to JSON](#csv-to-json)
  * [Generate Timestamp](#generate-timestamp)
  * [Convert Timezone](#convert-timezone)
* ***Delimiter*** - Separator used in CSV. Applicable to `JSON to CSV` and `CSV to JSON` options. `,` is the default value.&#x20;
* ***From Time Zone*** - Applicable only to [Convert Timezone](#convert-timezone)
* ***To Time Zone*** - Applicable only to [Convert Timezone](#convert-timezone)
* ***Output Format*** - Applicable only to [Convert Timezone](#convert-timezone)

### Formatter Actions

#### JSON to STRING

Converts JSON to Stringified JSON.

```json
Data:
{"name": "John Doe",   "age": 30,   "city": "Exampleville" }

Output:
"{\"name\": \"John Doe\", \"age\": 30, \"city\": \"Exampleville\" }"
```

<figure><img src="/files/hGMcuPiTjGRZf16My5QR" alt=""><figcaption></figcaption></figure>

#### STRING to JSON

Converts stringified JSON to JSON.

```json
Data:
"{\"name\": \"John Doe\", \"age\": 30, \"city\": \"Exampleville\"}"

Output:
{"name": "John Doe", "age": 30, "city": "Exampleville"
```

<figure><img src="/files/rWsuOMdqNSUMIppGkT8s" alt=""><figcaption></figcaption></figure>

#### XML to JSON

Converts XML to JSON format

```xml
Data:
<person><name>John Doe</name><age>30</age><city>Exampleville</city></person>

Output:
{'person': {'name': 'John Doe', 'age': '30', 'city': 'Exampleville'}}
```

<figure><img src="/files/Zpgq22f2vHbOU5a22g3f" alt=""><figcaption></figcaption></figure>

#### JSON to CSV

Converts JSON to CSV format

```json
Data:
[
  {
    "name": "John Doe",
    "age": 30,
    "email": "john@example.com",
     "street": "123 Main St",
      "city": "New York",
      "zip": "10001"
  },
  {
    "name": "Jane Smith",
    "age": 25,
    "email": "jane@example.com",
      "street": "456 Elm St",
      "city": "Los Angeles",
      "zip": "90001"
  }
]

Output:
b'name,age,email,street,city,zip\nJohn Doe,30,john@example.com,123 Main St,New York,10001\nJane Smith,25,jane@example.com,456 Elm St,Los Angeles,90001\n'
```

<figure><img src="/files/LTJFFVpiBFUubc1BJQ5f" alt=""><figcaption></figcaption></figure>

#### CSV to JSON

Converts CSV to JSON format. New lines can be entered as a new line or as `\n`

```json
Data 1:
"name,age,email,street,city,zip
John Doe,30,john@example.com,123 Main St,New York,10001
Jane Smith,25,jane@example.com,456 Elm St,Los Angeles,90001"

Data 2:
"name,age,email,street,city,zip\nJohn Doe,30,john@example.com,123 Main St,New York,10001\nJane Smith,25,jane@example.com,456 Elm St,Los Angeles,90001\n"

Output:
[{'name': 'John Doe', 'age': '30', 'email': 'john@example.com', 'street': '123 Main St', 'city': 'New York', 'zip': '10001'}, {'name': 'Jane Smith', 'age': '25', 'email': 'jane@example.com', 'street': '456 Elm St', 'city': 'Los Angeles', 'zip': '90001'}]
```

<figure><img src="/files/g14mnhcAADnYxLYwefJC" alt=""><figcaption></figcaption></figure>

#### Generate Timestamp

Option to generate a timestamp from a given date time.&#x20;

**Usage Example**

Data (to be formatted): Enter the date and time from which you want to generate a timestamp.

From Time Zone: Select the time zone of the input date and time you want to convert the timestamp to.

<figure><img src="/files/ugy2PrnriPF0CDIdaGSG" alt=""><figcaption></figcaption></figure>

Refer [Allowed Datetime Formats](#allowed-datetime-formats) for the datetime structure format

#### Convert Timezone

Option to convert date and time from one timezone to another. This is particularly useful when you need to work with date and time data originating from different locations around the world.

**Usage Example**

Data (to be formatted): Enter the date and time you want to convert

For date-time input: Provide your date-time input.

From Time Zone: Select the original time zone of the input date and time.

To Time Zone: Choose the target time zone to which you want to convert the input date and time.

Output Date Format: Specify the desired format for the converted date and time. You can use the format codes described below to define the format as per your requirements.

<figure><img src="/files/G8OzOOsu462TYNeI8NtT" alt=""><figcaption></figcaption></figure>

Refer [Allowed Datetime Formats](#allowed-datetime-formats) for the datetime structure format

#### Output

The "Convert Timezone" option will provide the date and time converted to the specified target time zone, formatted according to your specified output date format.

### Allowed DateTime Formats

#### The following formats are supported:

| Format | Value    | Description                                |
| ------ | -------- | ------------------------------------------ |
| %d     | 27       | numerical representation of day            |
| %a     | Sat      | short alphabetical representation of day   |
| %A     | Saturday | alphabetical representation of day         |
| %m     | 01       | numerical representation of month          |
| %b     | Jan      | short alphabetical representation of month |
| %B     | January  | alphabetical representation of month       |
| %y     | 18       | short representation of year               |
| %Y     | 2018     | numerical representation of year           |
| %H     | 10       | hour                                       |
| %M     | 30       | minute                                     |
| %f     | 012345   | microseconds                               |
| %p     | AM       | meridiem                                   |
| %z     | +0530    | timezone offset                            |

#### Examples for reference :

| Input                           | Format                   |
| ------------------------------- | ------------------------ |
| 2021-05-27 01:30:00 PM          | %Y-%m-%d %H:%M:%S %p     |
| 2021-05-12T09:46:47-0400        | %Y-%m-%dT%H:%M:%S%z      |
| Sat, 27 Jan 2018 17:16:55 +0000 | %a, %d %b %Y %H:%M:%S %z |
| 2018-01-27T13:34:25.518993+0530 | %Y-%m-%dT%H:%M:%S.%f%z   |


# Notification

Sends an email from the workflow to the given recipient list.

<figure><img src="/files/HULmAtSr8mgfmdW7Bd8t" alt=""><figcaption></figcaption></figure>

### Options

* ***Send To*** - Recipient emails in comma-separated values
* ***Subject*** - Subject line of the email. Keep it short.
* ***Character Set*** - To be interpreted in the emails. Options: `US-ASCII, ISO-8859-1, UTF-8`
* ***Content Transfer Encoding*** - Mail encoding method. Options: `Quoted Printable, Base64, 7Bit, 8Bit, Binary`
* ***Message Type*** - `Plain Text` for sending string messages. `HTML` for sending mail as per a template
* ***Dynamic Data*** - Only for the `HTML` message type to pass the dynamic data. Provide in JSON format.
* ***Message*** - Email Content or Body.

### Examples

**Plain Email**

* Subject: `Plain Text Mail Demo`
* Character Set: `US-ASCII` (Default Value)
* Content Transfer Encoding: `7 bit` (Default Value)
* Message Type: `Plain Text`
* Message:&#x20;

  <pre><code><strong>Dear Sir,
  </strong>This is to inform you that we received your ticket.
  </code></pre>

![Example 1](/files/UBkNuDwkgtd29XhZrBFT)

**HTML Email without dynamic content**

* Subject: `HTML Static Mail Demo`
* Character Set: `US-ASCII` (Default Value)
* Content Transfer Encoding: `7 bit` (Default Value)
* Message Type: `HTML`
* Message:&#x20;

  ```html
  <html>
     <head>
        <h1> Line1 </h1>
     </head>
     <body>
        <i>This is a mail to communicate that we are working on your ticket </i>
     </body>
  </html>
  ```

![Example 2](/files/M4zM2pZnwJGfEuVm8YfD)

**HTML Email with dynamic content**

* Subject: `Dynamic HTML Mail Demo`
* Character Set: `US-ASCII` (Default Value)
* Content Transfer Encoding: `7 bit` (Default Value)
* Message Type: `HTML`
* Dynamic Data&#x20;

  ```json
  {
      "keys": ["Name","Age","Company"],
      "records": [
          {"name": "Alex", "age": 25, "company": "DCKAP"},
          {"name": "David", "age": 28, "company": "DCKAP"}
      ]
  }
  ```
* Message:&#x20;

  ```html
  <!DOCTYPE html> 
  <html>
     <head>
        <style> 
           table, th, td { border: 1px solid black; } 
        </style>
     </head>
     <body>
        <table>
           <tr>
              {% for key in keys %}
              <td>{{key}}</td>
              {% endfor %} 
           </tr>
           <tr>
                 {% for dict_item in records %}
                        {% for key, value in dict_item.items() %} 
                                <td>{{value}}</td>
                        {% endfor %}
                        <tr></tr>
                 {% endfor %} 
           </tr> 
        </table>
     </body>
  </html>
  ```

![Example 3](/files/VPGzwiSxgQDsyPxQTvLU)

{% hint style="warning" %}
Base-64 HTML Combination and occasionally Base-64 plain text combinations don't work as expected. This will be addressed in the upcoming releases.
{% endhint %}


# Snippet

Using snippet tool, snippets can be configured and used in the main workflow. Users must provide values to the required inputs after selecting the snippet.&#x20;

Same snippet can be used in different places with different input values.

### Options

***Snippet:*** Select a snippet (ensure snippets are added before using them here).

***Inputs:*** Configure the input values. The fields are dynamic and depend on the selected snippet.


# Return

Returns data to the caller, in real time.&#x20;

{% hint style="danger" %}
This applies only to dynamic workflows.
{% endhint %}

<figure><img src="/files/e8BdrrvQwRClXUitGzn3" alt=""><figcaption></figcaption></figure>

### Options

* ***Response Data*** - Response to be returned to the dynamic calls. Example: `{{1.response.data}}` , `Some error Occurred. Please check logs`
* ***Status Code*** - Status code to be returned to the dynamic calls. Example: 200, 500


# Sleep

Pause execution for a given time in seconds.

<figure><img src="/files/tW6I0bqny2cIyR3hA7sx" alt=""><figcaption></figcaption></figure>

### Options

* ***Time In Seconds*****&#x20;-** Number of seconds to pause the execution


# Mock Data

For Code Runner and Formatter

Users can now manually override DataHub variables using mock JSON data, directly from the DataHub. This ability allows configuring and testing step responses even before a workflow is synced, specifically within Code Runner and Formatter steps.

#### How It Works

* Locate a Code Runner or Formatter step in the DataHub.
* Click the mock data icon next to the step response.
* A popup will appear allowing you to edit and input mock JSON data.
* The provided mock data will:
  * override the existing response for that step.
  * be used as the response for downstream mapping or logic.
  * be replaced automatically when the workflow is synced and a realtime response is generated.

#### Use Case

This is particularly useful for:

* Testing workflows before real data is available
* Manually configuring mappings when building new flows
* Debugging formatters or custom logic using controlled input

#### Example

Mock JSON data:

```json
{
  "orderId": "12345",
  "status": "PENDING",
  "customer": {
    "id": "9876",
    "email": "test@example.com"
  }
}
```

This input will be treated as the step response for downstream mapping or transformation logic.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfXHKmMVSJdCL6eI0hGiNbrUJp2q25DQKXAbj-udYCt8bMbgd4YPjsVMDmf_mur6U0CGzxSUwrZLigOMqlKtjj87n2Oa9gFAqN8Hpi9PWD5JtbvZptC4fGxHL-Xg3Q9CR3MLJ3oSQ?key=wC4f4SBvUvQBDAaSHX4Z5qRA" alt=""><figcaption></figcaption></figure>

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcT79yOnvawF1vnumCXadVHaPCbSWoCGXXsAZIyMW31VsMrTZqOQ5L9caRlYnjUuWJgGNzx3zKBxgeN4Gc4GY3fRp_iBvvKgtGxtM2wFzLmK9nvU68K5vZU6uSKKsXDjmwkcd_aBA?key=wC4f4SBvUvQBDAaSHX4Z5qRA" alt=""><figcaption></figcaption></figure>

<br>


# FAQs

### What are the systems which are not supported in workflows yet?

MySQL and MSSQL are not supported in workflows now. These tasks are planned in our roadmap.

### Do we have the ability to migrate integrations from the old approach to workflows?

For now, No. We may come up with a migration tool in the coming months. As there will not be much difference between the old and new approach in terms of capabilities, you can keep your existing integrations, as it is.&#x20;

We encourage you to start building new integrations in Workflows.

### In case of any other issues or feature requests, how to reach out?

Like you always do. Through Support Ticketing Portal.

* Click the "Help & Support" Icon on the bottom-left of the application
* [Raise a Ticket](/user-guide/contact-support/raise-a-ticket)


# Systems (Old)

The Systems page is where users can add, edit, and maintain systems with its APIs and credentials for a project. These APIs will be used in building Flows and Integration pipes.

The individual platforms that DCKAP Integrator directly connects to, or connects using APIs are known as systems. *For example*, ERP is a system. These systems need to be configured in DCKAP Integrator in order to be able to communicate with them (read, write, and update data).

## Add/Edit System

Click on the Add New button on the Systems page. Here users will be able to choose any existing public system and configure its credentials. These credentials will be used to authorize the API connections in flows.&#x20;

#### Step 1: Choose a system

<figure><img src="/files/5QsrzG9XlICEEJUOxVDk" alt=""><figcaption></figcaption></figure>

**Step 2: Provide credentials**

Provide the necessary keys. [Learn more.](/project-manager/systems/credentials#add-edit-credential)

<figure><img src="/files/a57LgBDyr17kJ4Hx7jpq" alt=""><figcaption></figcaption></figure>

**Step 3: Test credentials**

Test your credentials with the fresh token. [Learn more.](/project-manager/systems/credentials#reuse-token-in-test-connection)

<figure><img src="/files/oF92n5RrvXww0S4MLArD" alt=""><figcaption></figcaption></figure>

## Private Systems

If you cannot find the system that you are looking for, you can create a private system and use it. These systems are private and only accessible to the project members.

{% content-ref url="/pages/62jdAYSR9SyVr6SQOvXC" %}
[Private Systems](/project-manager/systems/private-systems)
{% endcontent-ref %}

## API Manager

As a next step, to view, add and manage this system's APIs, navigate here.

{% content-ref url="/pages/-LvPaUHZ6mnfjvbbrrWp" %}
[API Manager](/project-manager/systems/api-manager)
{% endcontent-ref %}


# Credentials

This is where the user will configure the system credential details. These credentials will be used by the Integration pipes to access data in a system.

* [Add/Edit Credential](#add-edit-credential)
* [Reuse Token in Test Connection](#reuse-token-in-test-connection)
* [Server Health Checkup](#server-health-check-up)

## Add/Edit Credential

From the Credentials section on the systems page, click on **Add New Credential** to create new credential details:&#x20;

<figure><img src="/files/a57LgBDyr17kJ4Hx7jpq" alt=""><figcaption></figcaption></figure>

Provide the following fields:&#x20;

<table data-header-hidden><thead><tr><th width="186.5">Field Name</th><th>Description</th></tr></thead><tbody><tr><td>Field Name</td><td>Description</td></tr><tr><td>Name</td><td>Enter a suitable name for your Credential details</td></tr><tr><td>Hostname</td><td><p>Enter your system URL in the format.</p><p><code>https://www.domainname.com</code></p></td></tr><tr><td>Timezone</td><td>Select the target system server timezone. This will be used to fetch data based on the respective timezone.</td></tr><tr><td>Secure Keys</td><td>Provide secure keys depending on the system chosen</td></tr></tbody></table>

{% hint style="danger" %}
*Do not include a slash at the end while providing Hostname*
{% endhint %}

Click on **Submit** to save the credential details. Once added, [test the connection](/project-manager/systems/credentials#test-connection) to ensure that proper credential details are provided.

## Reuse Token in Test Connection

{% hint style="success" %}
*Test connection is used to validate the provided credentials by making an authorized connection to the target system.*
{% endhint %}

When the test connection button is clicked, DCKAP Integrator generates a token and reuses it. This token can be reused till it's valid. Users have the ability to test with a fresh token or with an existing token.

* Test with Fresh Token: DCKAP Integrator will generate a new token for testing the connection.
* Test with Existing Token: DCKAP Integrator will use the previously generated token for testing the connection with the system.&#x20;

## Server Health Check-up

The Server Health Check-up is used to check the status of the server (Available or Down) by pinging the server at regular intervals. If the server is down/not available during the ping, DCKAP Integrator will notify the Project Owner and Admin via email.

<figure><img src="/files/RluwqZrWPscDiZZcDIMT" alt=""><figcaption></figcaption></figure>

Click `Configure` in the respective credential row in the credentials section.

Provide the values to the below fields

* Checker Status: Setting this to Yes will enable the Server Health Check-up.
* Ping Interval: The frequency of checkups


# API Manager

The DCKAP Integrator API Manager provides a user-friendly template to add, edit, manage and store any number of system APIs. The APIs that are added here are later used in Flows and Mapping.

<figure><img src="/files/qLWvpynzzK1D1s6KgI79" alt=""><figcaption></figcaption></figure>

* [Add/Edit API](#add-edit-api)
* [Create as Private API](#create-as-private-api)
* [Test API](#test-api)

## Add/Edit API

To manage a new API, click on "Add New" on the API manager page. A new window will open and this is where you will define parameters and other details for your API.

{% hint style="success" %}
For a private system, APIs can be added only when it has at least one credential.
{% endhint %}

{% hint style="danger" %}
DCKAP Integrator API Manager is only intended to manage APIs. The API is expected to be available in the respective systems. Adding an API here will not create the API in the respective system.
{% endhint %}

<figure><img src="/files/2Xmv2kCboaNVHX2MAKs0" alt=""><figcaption></figcaption></figure>

Provide the values for the below fields.

1. **Name**: Provide a suitable name for your API. Example: Magento2 Update Customers, P21 Get Customer Info, etc.
2. **Status**: This is a toggle ON/OFF button that allows you to enable/disable an API
3. Provide request [method](/project-manager/systems/api-manager/api-components#request-methods), [URL](/project-manager/systems/api-manager/api-components#relative-url-endpoint), [headers](/project-manager/systems/api-manager/api-components#headers), [params](/project-manager/systems/api-manager/api-components#params) and [body](/project-manager/systems/api-manager/api-components#request-body) for the API
4. Provide [request and response](#for-mapping-request-and-response) to use in the mapping. [Learn more.](/developers/api-and-mapping)
5. Provide [other details](#other-details) section (Optional)
6. API can be tested from here if needed. Navigate to [Test API](/project-manager/systems/api-manager/test-api)
7. Click `Save API` button to save this API.&#x20;

{% hint style="success" %}
Use the `Save All API` button to save multiple added/modified APIs at once
{% endhint %}

{% hint style="info" %}
For protocols like FTP and SFTP, APIs cannot be added. Instead, it will be used with the help of flow handlers like [FTP Reader](/developers/flows#ftp-reader), [FTP Writer](/developers/flows#ftp-writer), [SFTP Reader](/developers/flows#sftp-reader) & [SFTP Writer](/developers/flows#sftp-writer).&#x20;
{% endhint %}

### For Mapping: Request and Response

The Request and Response sections contain sample JSON data. The keys given in this JSON sample are displayed as fields in the Mapping area Source and Destination sections to enable mapping.

<figure><img src="/files/sywY5SN28zHQIMLXts8a" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
The sample request and response fields are optional (but ***recommended***) in the API Manager. If no data is entered here, then the Source and Destination fields will be empty on the Mapping configuration page.
{% endhint %}

### Other Details

#### **Skip Authentication**

Ability to skip the parent system authentication. Applicable only to systems using the following protocols - OAuth1, OAuth2, NTLM, Amazon-LWA.

#### **Override Timeout**

This is a toggle ON/OFF button that lets you choose between custom/default "maximum allowed time" values, before which a Timeout error is thrown. *Users can enter only 4-digit numeric values in the Connect and Read fields.*&#x20;

* **Override Timeout ON**: Once the Override Timeout is set to ON, two fields- Connect and Read- are displayed. You may set a time (in seconds)   in both these fields.
  * "Connect" refers to the maximum allowed time for DCKAP Integrator to establish communication with the system to which the API call is made.&#x20;
  * "Read" refers to the maximum allowed time for the system to respond back to DCKAP Integrator.
* **Override Timeout OFF:** Setting the Override Timeout to OFF, will consider default values for "Connect" and "Read".
* The default value for Read = 240 seconds. The default value for Connect = 30 seconds

#### **Description**

Provide the description/notes for the API

## Create as Private API

This is applicable to Public APIs only. Using this option, any public API can be duplicated and created as a private API to make necessary modifications.

<figure><img src="/files/WWCkYQCaSLRLaZcLlLoI" alt=""><figcaption></figcaption></figure>

## Test API

Navigate below to learn about API testing from Integrator

{% content-ref url="/pages/8M8oSck8mUbBIuvMsIxB" %}
[Test API](/project-manager/systems/api-manager/test-api)
{% endcontent-ref %}


# API Components

The following are the components that are required in making successful API Calls to a system:

* [Request Methods](#request-methods)
* [URL](#relative-url-endpoint)
* [Params](#params)
* [Headers](#headers)
* [Body](#request-body)

### Params, Headers, Body Structure

Three fields are set for each parameter/header/body:

<table data-header-hidden><thead><tr><th width="143.5">Field</th><th width="296">Description</th><th>Example</th></tr></thead><tbody><tr><td>Field</td><td>Description</td><td>Example</td></tr><tr><td>Label</td><td>A suitable display name for headers/params/body data</td><td>Content-Type</td></tr><tr><td>Key</td><td>Variable name at which the value is populated</td><td>Content-Type</td></tr><tr><td>Value</td><td>The actual value stored in the Key</td><td>application/json</td></tr></tbody></table>

> The above values can be bulk edited in the format: `label::key::value`
>
> `Content-Type::Content-Type::application/json`
>
> `Accept::Accept::application/json`

{% hint style="info" %}
[`GET_FROM_CREDENTIALS`](https://docs.dckapintegrator.com/project-manager/systems/api-manager/pages/62jdAYSR9SyVr6SQOvXC#2.-get_from_credentials) and [`DYNAMIC_TOKEN`](https://docs.dckapintegrator.com/project-manager/systems/api-manager/pages/62jdAYSR9SyVr6SQOvXC#1.-dynamic_token) keywords can be used in API Manager params, header and body values, just like in the systems [test connection](/project-manager/systems/private-systems#test-connection) section.
{% endhint %}

### Request Methods

Request Methods specify the action to be performed by an API call, on a resource. Choose from the drop-down list.

![](/files/-LwNo6Qpq0oq0oQ4U45j)

For more information on Request methods click [here](https://developer.mozilla.org/en-US/docs/Glossary/Request_header).

### Relative URL / Endpoint:

The endpoint is the location or touch-point of communication, from which the API can access resources to carry out its functions.

Let's say you want to invoke an API call using a URL such as `http://www.example.com/api/customers`.

Here, the host-name `www.example.com` is provided in the credentials section in the Projects Area. So only the relative URL `/api/customers` needs to be provided here.

Some examples are

```http
<GET> /api/customers/{customer_id}

<POST> /api/customers

<PUT> /api/customers/{shipping_id}/editshipping
```

In an API call, URL arguments and query parameters can also be sent. These are defined in the 'API Call' handler in Flows.

**Use Case - URL Arguments**

Let’s say, you want to make an API call with dynamic values in the URL like `http://www.example.com/api/customers/2`. Here, `2` is the dynamic value. This can be achieved by replacing the dynamic value with a unique variable name and this value will be provided in Flows during run-time.

The Endpoint provided in the API Manager will be: `/api/customers/{customer_id}`

In order to assign the dynamic value, enter `{"customer_id":"2"}` in API Call Handler in the URL Arguments box. The Endpoint will then replace the URL argument as: `/api/customers/2`, which indicates that information from `customer_id = 2` is accessed.

### **Params**

Query parameters are also assigned in the API Call handler in Flows. Let’s say, you want to make an API call with query params in the URL like `/api/customers/?format=json`

The Endpoint provided in the API Manager will be:  `/api/customers` and the query parameter defined in the API Call handler is `{"format":"json"}`.

The Endpoint will then include the query parameter.

![Setting URL arguments and params in the API Call Handler](/files/-LwNo6QqsYtXR3Msf82q)

### Headers

Header data are passed as part of an API call.

![](/files/-LwNo6QrSHA-vrOoAHle)

Commonly used Header data include:

1. Content-Type
2. Accept

For more information on Headers please click [here](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).

### Request Body

JSON objects that are sent along with a POST or PUT request, to create/ update a resource. Body parameters are dynamic data, usually assigned in the Payload section of the API Call handler in Flows.

![Setting Body data in the API Call Handler](/files/-LwNo6Qs0DjFGabpgw6F)

##


# Test API

This feature allows the users to test the API in the API Manager. This avoids the need for any external API testing applications for testing the API.

<figure><img src="/files/4jjM3HftxbDh2XuBv5CW" alt=""><figcaption></figcaption></figure>

### How to test?

* Navigate to the respective system and open the API Manager by clicking the “view all” button. It will display all the APIs associated with this system.
* Choose any existing APIs from the list or create a new API by providing the necessary information.
* Open the "Test Details" tab in the API and choose one of the below options to provide the necessary information
  * [Use Credentials](#use-credentials)
  * [Use Direct Values](#use-direct-values)
* Click the "Test" button to test the API.
* Once the API response is received, the response status and content will be displayed below the requested API.

{% hint style="success" %}
APIs can be tested while in the draft itself. This helps to test the API without saving first.
{% endhint %}

#### Use Credentials

This option allows the user to choose any existing credentials to authorize and test the API.

<figure><img src="/files/yPIjWi015kIKG0IO26VA" alt=""><figcaption></figcaption></figure>

#### Use Direct Values

This option allows the user to provide the credential information directly here. For security reasons, this credential information is <mark style="color:green;">not stored</mark> to reuse later.

<figure><img src="/files/rjL2WdwKhd9Bn3bKurgb" alt=""><figcaption></figcaption></figure>


# Private Systems

If you cannot find the system that you are looking for, you can create a private system and use it. These systems are private and only accessible to the project members.

* [Add a Private System](#add-private-system)
* [Edit a Private System](#edit-a-private-system)

## Add Private System

#### Step 1: Choose from Systems

<figure><img src="/files/Nl65GoDO2McPikTYzAx0" alt=""><figcaption></figcaption></figure>

#### Step 2: Provide system details

<figure><img src="/files/iPaiuqiUuvRIjNvNQ0Hd" alt=""><figcaption></figcaption></figure>

Provide the following information and then provide the necessary credentials to make the connection.

* **System Name:** Name of the system
* **System Logo:** Image file of the system logo
* **Get Hostname from User (Yes/No):**&#x20;
  * If yes, the hostname will be prompted from the Credentials. This will be helpful when you have multiple environments like staging and production.
  * If no, the user has to provide the URL with the hostname in the API Manager
* **Status enabled/disabled:** To enable or disable the system to use in other modules
* **Authentication Type:** The Authentication to be used by the system. The following authentication methods are available in the dropdown list:
  * No Auth
  * Cookies Authentication
  * OAuth1
  * [OAuth2](/project-manager/systems/authentication-types/oauth-2.0)
  * NTLM
  * Basic Authentication
  * MySQL Authentication
* **Description:** Description of the system
* **Token Failure Status Code:** The status code that the system will return for an invalid token. Example: 401, 403
* **Timeout:** This is the "maximum allowed time" value, before which a Timeout error is thrown. You can set a time (in seconds) for both the "Connect" and "Read" fields.
  * "Connect" refers to the maximum allowed time for DCKAP Integrator to establish communication with the system to which the API call is made.
  * "Read" refers to the maximum allowed time for the system to respond back to DCKAP Integrator.

{% hint style="info" %}
Users can enter only 4-digit numeric values in the Connect and Read fields.

* The default value for Connect = 30 seconds
* The default value for Read = 240 seconds
  {% endhint %}

### Test Connection

#### URL

The Test connection API is used to check if DCKAP Integrator is successfully connected to your system.&#x20;

{% hint style="info" %}
If the user has chosen `Get Hostname from User` as `NO`, then the hostname should be provided in the URL here.
{% endhint %}

Some example URLs are:

```
/SapB1/controller/testConnection
https://www.example.com/api/Ping/PingToken
```

#### Params, Header, and Body

Three fields are set for each parameter/header/body:

<table data-header-hidden><thead><tr><th width="134.66666666666669">Field</th><th width="301">Description</th><th>Example</th></tr></thead><tbody><tr><td>Field</td><td>Description</td><td>Example</td></tr><tr><td>Label</td><td>A suitable display name for headers/params/body data</td><td>Content-Type</td></tr><tr><td>Key</td><td>Variable name at which the value is populated</td><td>Content-Type</td></tr><tr><td>Value</td><td>The actual value stored in the Key</td><td><p>Support Content Types</p><ul><li>application/json</li><li>application/xml</li></ul></td></tr></tbody></table>

If the `Authorization` Header key has a value: "DYNAMIC\_TOKEN", and then the Dynamic Token section gets populated on the screen. [Learn more.](#1.-dynamic_token)

{% hint style="info" %}
DCKAP Integrator has the ability to provide a static value directly here. But if the dynamic token is to be generated from a different URL, this keyword can be used.
{% endhint %}

#### Error Handler

By default, DCKAP Integrator treats all status codes other than 200 as errors. But some systems provide error responses in the 200 OK status code itself. This section is used to identify those scenarios and treat them as errors. Users can configure the error messages that need to be displayed during the "Test Connection" process.

Provide the following details:

* **Status Code**: The code for which the error is thrown. *Example*: 200
* **Validator**: The logic that validates the error message. *Example*: isValid= Yes/No
* **Message**: Enter the content that needs to be displayed in the error message. The "key" of the message to be displayed is given here.&#x20;

  *Example*: <br>

  `200 Error Response`

  `{"isValid": "No", message: "Some Error Occured"}`<br>

  `200 Success Response`

  `{"isValid": "Yes", data: {...}}`<br>

#### Available Keywords

#### 1. DYNAMIC\_TOKEN

Example Dynamic Token URL: `/connect/token`

The Dynamic token body contains information on how the token is generated. It can either be a username/ password combination or a client id/ client secret combination got from the user. The token generated using this information is utilized while triggering any API Call to the system.

{% hint style="info" %}
DYNAMIC\_TOKEN is also supported in the raw body of the request. While using in the body, the user can provide a content type to pass in the respective format. By default, DYNAMIC\_TOKEN will be passed as a string. To pass as JSON, add `content-type: application/json`.
{% endhint %}

**Authorization**: This is the Header that is used in most API calls and is used to validate the API request using the authorization token. This token is stored in the system and will be inherited whenever the API is called.

Define the TokenURL in the System page as /get/token or /connect/token, etc.. depending on the system.

![](/files/-MMV5gVKPHDadb5EffeR)

**Sample Use Cases:** Now, let's say your system requires a Username and Password to return a token. After providing the Username and Password on the System page, DCKAP Integrator will use that information to get the token by triggering the TokenUrl.

The following are four use cases explaining how to provide Authorization details in the API Manager page to retrieve token details from the TokenURL API response.

<table data-header-hidden><thead><tr><th width="227">Sample Response from the TokenURL API</th><th width="231.66666666666669">Format in which the system API Accepts token</th><th>Structure to enter in your API managerLabel: As you wishKey: Usually "Authorization". This might differ according to your system</th></tr></thead><tbody><tr><td>Sample Response from the TokenURL API</td><td>Format in which the system API Accepts token</td><td>Structure to enter in your API manager</td></tr><tr><td><strong>Value</strong>:</td><td><strong>Label</strong>: As you wish</td><td><strong>Key</strong>: Usually "Authorization". This might differ according to your system</td></tr><tr><td><p>response =</p><p> {</p><p>"token":"TOKEN_VALUE_FROM_THE_SYSTEM"</p><p>}</p></td><td>Bearer TOKEN_VALUE_FROM_THE_SYSTEM</td><td>Bearer DYNAMIC_TOKEN[token]</td></tr><tr><td>response = "TOKEN_VALUE_FROM_THE_SYSTEM"</td><td>Bearer TOKEN_VALUE_FROM_THE_SYSTEM</td><td>Bearer DYNAMIC_TOKEN</td></tr><tr><td><p>response =</p><p> {</p><p>"authentication":{</p><p>"access_token":"TOKEN_VALUE_FROM_THE_SYSTEM"</p><p>}</p><p>}</p></td><td>Bearer TOKEN_VALUE_FROM_THE_SYSTEM</td><td>Bearer DYNAMIC_TOKEN[authentication][access_token]</td></tr><tr><td><p>response = {</p><p>"authentication":{</p><p>"access_token":"TOKEN_VALUE_FROM_THE_SYSTEM"</p><p>}</p><p>}</p></td><td>Basic TOKEN_VALUE_FROM_THE_SYSTEM</td><td>Basic DYNAMIC_TOKEN[authentication][access_token]</td></tr></tbody></table>

#### 2. GET\_FROM\_CREDENTIALS

The data field for which `GET_FROM_CREDENTIALS` is entered here will be obtained from the user while configuring the System Credentials.

In the following example, the "username" value will be populated in the Credentials section for the user to enter.

<figure><img src="/files/UuzSfBnp5dZnDRJMfFIf" alt=""><figcaption></figcaption></figure>

Below is the prompt in the credentials section

!["username" field populates in Credentials page](/files/-MMV5gVMM61Es0sdHLuV)

## Edit a Private System

Click "Edit System" on the System details page to manage the system fields.

<figure><img src="/files/gsReV46qQXkceTTETB7Q" alt=""><figcaption></figcaption></figure>


# Authentication Types

DCKAP Integrator supports different authentication types to securely connect to various systems. The following authentication methods are available:

* No Auth
* Cookies Authentication
* OAuth 1
* [OAuth 2.0](/project-manager/systems/authentication-types/oauth-2.0)
* NTLM
* Basic Authentication
* MySQL Authentication


# OAuth 2.0

OAuth 2.0 is an authorization framework that lets DCKAP Integrator access certain data of another application (like e-commerce or ERP or any system). This allows us to get the users consent once with defined scope and use it further to automate things. This way, you stay in control of your information!

DCKAP Integrator supports four major grant types

1. [Authorization Code](#authorization-code)
2. [Authorization Code with PKCE](#authorization-code-with-pkce-proof-key-code-exchange)
3. [Resource Owner Credentials](#resource-owner-credentials)
4. [Client Credentials](#client-credentials)

## **Authorization Code**

Let us try to understand it with an analogy. Imagine you’ve ordered a special package from a store but can’t pick it up yourself. You ask a trusted friend to handle it for you.

1. Granting Permission: You give your friend a special authorization slip that says, "My friend is allowed to pick up this specific package for me." This slip is like the authorization code.
2. Collecting the Package: Your friend takes the authorization slip to the store. The store verifies the slip and, if it's valid, hands over the package to your friend. The package represents the access token.
3. Delivering the Package: Your friend brings the package to you. They can only pick up the package you’ve authorized and nothing more.

Now, this is what happens when you use the Authorization Code Grant of OAuth 2.0.&#x20;

### Configuration Steps

To create a new private system with OAuth 2.0 Authorization Code Authentication, configure the below fields along with the[ basic system creation fields](/project-manager/systems/private-systems#add-private-system).

<table><thead><tr><th width="192">Field Name</th><th>Purpose/Value</th></tr></thead><tbody><tr><td>Grant Type</td><td>Authorization Code</td></tr><tr><td>Client Authentication</td><td>Choose Send Client Credentials in Body when Client ID and Client Secret are to be passed in the body and Send as Basic Auth Header if they are to be passed as Basic Auth Header as per your System Specification.</td></tr><tr><td>Add Authorization Data to</td><td>Once the access token is generated, it is sent for all API calls to get authorized. If the authorization key has to be added in the header, choose Request Headers or vice versa.</td></tr><tr><td>Authorization Format</td><td><p>The format in which the token has to be sent for all API calls.</p><p></p><p><strong>Example 1:</strong></p><p>If your system returns token as <code>“ABCDEFGHIJKLMNOPQRSTUVWXYZ”</code> and </p><ol><li>In API Calls if you need to send <code>{“Authorization”: “ABCDEFGHIJKLMNOPQRSTUVWXYZ”}</code>, then the authorization format is <code>DYNAMIC_TOKEN</code>. </li><li>In API Calls if you need to send <code>{“Authorization”: “Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ”}</code>, then the authorization format is <code>Bearer DYNAMIC_TOKEN</code>. </li></ol><p><strong>Example 2:</strong> </p><p>If your system returns token as <code>{“access_token”: “ABCDEFGHIJKLMNOPQRSTUVWXYZ”}</code> and in API Calls you need to send  <code>{“Authorization”: “Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ”}</code>, then authorization format is <code>Bearer DYNAMIC_TOKEN[access_token]</code></p></td></tr><tr><td>Client ID</td><td>Client ID of your application</td></tr><tr><td>Client Secret</td><td>Client Secret of your application</td></tr><tr><td>Authorization URL</td><td>The absolute base URL for authorizing your System. Refer to your system documentation for Authorization Base URL. Ignore the query parameters part. This is the URL hit for requesting authorization code.</td></tr><tr><td>Token URL</td><td>The absolute token URL for requesting access token using the authorization code. Refer to your system documentation.</td></tr><tr><td>Scope</td><td><p>Scope of access you want to provide to DCKAP Integrator (Check the allowed scopes in your system documentation). When you want to grant access to more than one scope, use space to separate. Also, your access token will be usually short lived. To allow DCKAP Integrator to auto-generate the access token using refresh token without your intervention, kindly check your System’s documentation for the scope to generate access token along with refresh token. </p><p></p><p>Example: <code>api offline_access</code> </p></td></tr><tr><td>Redirect URL</td><td>Configure this redirect URL in your system’s application</td></tr></tbody></table>

{% hint style="success" %}
State is auto-generated internally to avoid CSRF Attacks.
{% endhint %}

Provide test connection details and test it in the credentials page by adding a new connection. When adding credentials, if the access token is generated successfully after giving consent, the credentials will be saved. If not, you will either receive an error in the pop-up window or in the Credentials page.

### **Authorization Code with PKCE (Proof Key Code Exchange)**

{% hint style="success" %}
This is the recommended approach
{% endhint %}

This is an additional level of security provided to mitigate the authorization code interception attack of Authorization Code Grant. To have stronger security, OAuth 2.0 has special protections like PKCE to keep the authorization code safe from third party who might try to grab it. A code verifier is required along with the authorization code to obtain the access token.&#x20;

{% hint style="info" %}
Your end system or application should have support to use Authorization Code with PKCE authentication.
{% endhint %}

All the steps are the same as in the Authorization Code process, except that the grant type is Authorization Code with PKCE, and you need to choose the transformation method. It's recommended to use SHA-256.

### **Resource Owner Credentials**

Choose Grant Type as Resource Owner Credentials. This allows the users to provide username and password in the credentials section.

In case of confidential clients (i.e, your system requires client ID and client secret for accessing), these fields are mandatory, failing which might result in error.

### **Client Credentials**

This is similar to resource owner credentials but the major difference is that these credentials are not the resource owner’s original credentials but rather credentials created for DCKAP Integrator by the user with a restricted access as per need. So, the credentials part doesn’t have username and password in this grant type.

{% hint style="info" %}
OAuth 2.0 will soon be supported in dynamic workflows, add new pipes page and templates.&#x20;
{% endhint %}


# Systems (Beta)

The Systems page displays details of both public and private systems connected in the project.

{% hint style="success" %}
Users can use only one version of a system in a project. They may upgrade or downgrade to a different version, but multiple versions of the same system cannot be used in a single project.
{% endhint %}

{% hint style="info" %}
DCKAP Integrator will continue to support the older version of the system. It will be marked with an “Old” label. For newer systems, the specific version number will be shown alongside the system.&#x20;
{% endhint %}

For old systems documentation, navigate here.

{% content-ref url="/pages/-MMV5CiNb44lw4cOqkmD" %}
[Systems (Old)](/project-manager/systems)
{% endcontent-ref %}

### **Show System Usage**

Shows both the credentials connected to the system and the workflows which are using it.

### **User Credentials**

Lists the credentials connected to the system. Users can add, edit, validate, or delete credentials using the action icon.


# Connecting Systems (From Systems Page)

To connect DCKAP Integrator with an external system, credentials must be created.

* Open the Systems menu – Displays all available systems (public and private).
* Select a System – A credential creation popup appears.

{% hint style="info" %}
For first-time connection, the Version Selector dropdown is shown to choose from versions published by the System Builder. Once selected, the form loads fields specific to that version.
{% endhint %}

### Credential Details

* **Credential Name**: A unique name to identify the credentials. This field is mandatory and limited to 100 characters.
* **Timezone**: Defaults to UTC (Coordinated Universal Time), with the option to change it via a dropdown menu.
* **Show Credential on Data Hub**: A toggle switch allows users to control whether this credential is accessible in the Data Hub.

### Authentication Details

Choose an authentication type from the list of supported types. Remaining fields depend on the chosen authentication type (e.g., Basic Auth, OAuth2, Token Auth) and may include custom fields such as host\_name, api\_key, or region. All required fields must be completed.

### Save the Credentials

Select Test and Save to verify the connection in real time. Credentials are saved only if the test succeeds.

### System Versioning Rules

* Only one version of a system can be used in a project.
* Once connected, the selected version is locked for that system.
* To change the version, either upgrade/downgrade or delete all credentials for the current version before reconnecting.


# Connecting Systems (From Workflows)

Using Workflows, Users can connect to external Systems through existing or new credentials. Below is a guide on how the connection logic works:

### Connecting to an Existing System

* If credentials already exist for a system, Users can connect only to the specific version associated with those credentials.
* Users will not be able to choose a different version from the workflow.

### Creating a New Credential from the Workflow Page

Depending on whether credentials already exist, Users will have different options:

* If credentials exist for the system (means if the system is already connected):
  * Users can create a new credential, but only for the same version those credentials are tied to.
* If credentials do not exist:
  * Users can create a new credential, but only for the recommended version of that system.
  * Version selection is not available within the workflow.&#x20;

{% hint style="info" %}
Version selection is available only on the Systems page and only during the first connection.
{% endhint %}

### Supported System Types

* Users can connect to both public and private systems directly from within a workflow.

{% hint style="warning" %}
FTP, SFTP, and S3 are not yet supported for new systems.
{% endhint %}


# Upgrading Systems

New system versions are released from time to time by the system builders or administrators. The options to upgrade or downgrade buttons are located in the user systems section, particularly within the version history tab.

Users can upgrade directly between any published API versions, not just adjacent ones. For example, upgrading from v1.0 to v5.0 or downgrading from v5.0 to v1.0 is allowed. Switching to deprecated versions is not permitted.

The system automatically highlights Added, Modified, and Deleted APIs when comparing the source and target versions. If any workflow or snippet uses an API that is missing in the target version, the upgrade will be blocked.

### Step 1: Initiate the Upgrade

To begin the upgrade process, click the Upgrade button available for that particular system.

{% hint style="success" %}
Users can only upgrade or downgrade one version up or down.
{% endhint %}

### Step 2: Review Changes and Release Notes

Upon clicking Upgrade, the release notes and list of changes introduced in the new version are shown. Carefully review this information.

By clicking Next, Users will be advancing to the Pre-Check Validation..

#### Pre-Check Validation

Before proceeding further, the system performs the following pre-checks:

* No project transfer should be in progress.
* No other upgrade/downgrade process should be active for the same system in the same project.

If any check fails, an appropriate error message will be shown and the process must be restarted.

Once all checks pass, the Next button is enabled.

### Step 3:  Disable Workflows & Deleted API Usage (Optional but Recommended)

Users will be prompted to disable all workflows currently using this system to ensure smooth transition.

Click Disable all now to proceed. A confirmation pop-up will appear.

* The system displays a list of deleted APIs and the workflows where they're used.
* Click the arrow icon next to any workflow to open it in a new tab, change the deleted api and save the workflow. Once done, all warning messages will disappear.

{% hint style="info" %}
If the workflow is modified in a different tab, changes (such as a deleted API or a disabled alert) will appear only after switching to the respective tab in the upgrade modal or refreshing the page.
{% endhint %}

If no deleted APIs are present, Users can proceed by clicking Next.

### Step 4: Kill Running Jobs

The next step shows a list of all running jobs for the current system version.

Click Kill Now to stop all running jobs. A confirmation pop-up will be displayed.

Once all jobs are successfully terminated, proceed to the next section.

{% hint style="info" %}
If the workflow is modified in a different tab, changes (such as removal of a processing and queued jobs) will appear only after switching to the respective tab in the upgrade modal or refreshing the page.
{% endhint %}

### Step 5: Update Credentials (if required)

If the new version contains major breaking changes related to authentication, such as:

* Used authentication deletion
* New credential input fields
* Key name changes
* OAuth2 or Token Auth any modifications

Users will need to re-configure credentials only when major changes are detected; otherwise, Integrator will re-use the credentials from the previous version. Once the valid credentials have been updated, the Next button will become active.

{% hint style="warning" %}
Editing is currently restricted to adding new credentials only. This step is required for major changes, but may be skipped for minor ones.
{% endhint %}

### Step 6: Final Confirmation and Upgrade

Users will now see the final confirmation screen.

On clicking Upgrade, the system performs a final check for deleted APIs in use, running or queued jobs, and enabled workflows. If any check fails, the upgrade is aborted and must be restarted from the beginning.

### Lock-in Period

If no action is taken on the final screen, a one-hour lock-in period begins to prevent consequences or interruptions. During this time, no upgrade or downgrade can be triggered for the same system. After one hour, the upgrade/downgrade option is re-enabled.

### Enable Workflows After Upgrade

Once the upgrade is completed, click Enable All Workflows to re-enable only those workflows that were active before the upgrade.

If this step is skipped and the window is closed, Users must manually enable the required workflows later. It is highly recommended to test one or two workflows before enabling all workflows.

Previous-version credentials are retained for 24 hours. After 24 hours, these credentials expire and are permanently deleted. Users can revert to the previous version within 23 hours using the retained credentials.


# Downgrading Systems

The buttons for upgrade or downgrade buttons  are located in the user systems section, particularly within the version history tab.

Users can downgrade directly between any published API versions, not just adjacent ones. For example, upgrading from v1.0 to v5.0 or downgrading from v5.0 to v1.0 is allowed. Switching to deprecated versions is not permitted.

The system automatically highlights Added, Modified, and Deleted APIs when comparing the source and target versions. If any workflow or snippet uses an API that is missing in the target version, the downgrade will be blocked.

### Step 1: Initiate the Downgrade

To begin the downgrade process, click the Downgrade button available for that particular system.

{% hint style="info" %}
Only one upgrade or downgrade can be done at a time. Downgrading is not allowed from the default or current version and is only possible if the version was upgraded from an earlier one.
{% endhint %}

### Step 2: Review Changes and Release Notes

Upon clicking Downgrade, a screen will display the release notes and list of changes for the previous version. Carefully review this information.

By clicking Next, Users will be advancing to the Pre-Check Validation..

#### Pre-Check Validation

Before proceeding further, the system performs the following pre-checks:

* No project transfer should be in progress.
* No other upgrade/downgrade process should be active for the same system in the same project.

If any check fails, an appropriate error message will be shown and the process must be restarted.

Once all checks pass, the Next button is enabled.

### Step 3: Disable Workflows & Deleted API Usage (Optional but Recommended)

Users will be prompted to disable all workflows currently using this system to ensure smooth transition.

Click Disable all now to proceed. A confirmation pop-up will appear.

* The system displays a list of deleted APIs and the workflows where they're used.
* Click the arrow icon next to any workflow to open it in a new tab.

If no deleted APIs are present, Users can proceed by clicking Next.

{% hint style="info" %}
If the workflow is modified in a different tab, changes (such as a deleted API or a disabled alert) will appear only after switching to the respective tab in the upgrade modal or refreshing the page.
{% endhint %}

### Step 4: Kill Running Jobs

The next step shows a list of all running jobs for the current system version.

Click Kill Now to stop all running jobs. A confirmation pop-up will be displayed.

Once all jobs are successfully terminated, proceed to the next section.

{% hint style="info" %}
If the workflow is modified in a different tab, changes (such as removal of a processing and queued jobs) will appear only after switching to the respective tab in the upgrade modal or refreshing the page.
{% endhint %}

### Step 5: Final Confirmation and Downgrade

Users now see the final confirmation screen.

On clicking Downgrade, the system performs a final check for deleted APIs in use, running or queued jobs, and enabled workflows. If any check fails, the downgrade is aborted and must be restarted from the beginning.

### Lock-in Period

If no action is taken on the final screen, a one-hour lock-in period begins to prevent consequences or interruptions. During this time, no upgrade or downgrade can be triggered for the same system. After one hour, the upgrade/downgrade option is re-enabled.

### Enable Workflows After Downgrade

Once the downgrade is completed, click Enable All Workflows to re-enable only those workflows that were active before the downgrade.

If this step is skipped and the window is closed, Users must manually enable the required workflows later. It is highly recommended to test one or two workflows before enabling all workflows.

Previous-version credentials are retained for 24 hours. After 24 hours, these credentials expire and are permanently deleted. Users can revert to the previous version within 23 hours using the retained credentials.


# API Manager

This is same as the System Builder API Manager with restricted limitations like editing public APIs.&#x20;

Learn more about API Manager here.

{% content-ref url="/pages/paCKyvMxg9SFzm7H8ym0" %}
[API Manager](/project-manager/systems-builder/api-manager)
{% endcontent-ref %}


# Systems Builder

System Builder allows the user to build a new private system to connect and use in the workflows. Private systems are accessible only inside the project and cannot be accessed elsewhere.&#x20;

This page displays both old and new private systems available in the project. It also displays the recommended version of the system set during publishing. If no published version is available, the draft or deprecated version will be shown.

{% hint style="info" %}
Old systems are marked with an “Old” label.
{% endhint %}

### **Show System Usage**

This option displays the credentials connected to the system and lists the workflows which are using it.

{% hint style="success" %}
The Delete option is not yet introduced for new system versions. It will be released in the upcoming releases.
{% endhint %}


# New Private System

## Steps to Create a System

In the Systems Builder tab, click on the + Create New System button. You will now be redirected to the System Create screen.

{% stepper %}
{% step %}
Add Basic System Details
{% endstep %}

{% step %}
Select the Allowed Authentication Type
{% endstep %}

{% step %}
Add Credential Inputs
{% endstep %}

{% step %}
Configure Test Connection
{% endstep %}
{% endstepper %}


# Basic Details

Step 1: Add Basic System Details

Provide the essential information required to create the system. These details help accurately categorize and describe the system for future identification and use.

Fields to collect:

* **System Logo**\
  Builders are required to upload a system image to visually represent the system. The image must be less than 5MB in size and must be in one of the following formats: JPEG, JPG, or PNG.
* **System Name**\
  A unique and clear name for the system. This is how it will be identified across workflows and configurations.
* **System Documentation Link**\
  A URL pointing to the API documentation or user guide for the system. Helps system users understand how to use or integrate with the system.
* **System Type**\
  Choose from one of the following predefined types:

  * ERP: For enterprise resource planning systems like SAP, NetSuite, or Oracle ERP.
  * CRM: For customer relationship management systems like Salesforce or HubSpot.
  * Files: For file storage and transfer systems like Google Drive, Dropbox, or SFTP.
  * ECommerce: For online commerce platforms like Shopify, Magento, or WooCommerce.
  * Others: For any system that doesn’t fit the above categories.<br>

  Selecting the right type helps in organizing systems, filtering them, and possibly applying pre-configured defaults or behaviors based on type.
* **Description**\
  An optional text field to describe the purpose or behavior of the system for better clarity.


# Authentication Types

Step 2: Select the Allowed Authentication Type

Once the system basics are entered, the next step is to choose the authentication required for connecting to this system. By default, Basic Authentication is selected. You can delete the authentication by clicking on the three dots and add your preferred type by clicking on Add Authentication Button. If applicable, fill the authentication details and click on Save and Continue Button.

{% hint style="info" %}
As of now, only one authentication type can be configured for a version of a system.<br>
{% endhint %}

## Authentication Methods

DCKAP Integrator supports five types of authentications&#x20;

1. No Authentication
2. Dynamic Token Authentication
3. Basic Authentication
4. OAuth1.0
5. OAuth2.0

### No Authentication

This is the authentication that can be used when we don’t have any authentication or when we want to use a static API Key or Bearer Token for Authentication.

**How to set up a static API Key Authentication?**

* Add a new credential input in the next step to get the static API Key or Bearer Token - Example:&#x20;

| Display Name | Key | Type  |
| ------------ | --- | ----- |
| API Key      | key | input |

* To use the key in API Manager Section, add header in the below format

| Authorization | Bearer {{inputs.key}} |
| ------------- | --------------------- |

{% hint style="info" %}
If all APIs use the same field, add it to API Common Fields in API Manager instead of manually typing it out.
{% endhint %}

### Dynamic Token Authentication

Gets access tokens through one or more token endpoints. Manually add them to API headers or parameters.&#x20;

**Configure the API details for getting the token**

If you want to make an API call and use that result in the next API call, you can use the format `{{<step_number>.<key_name>}}`

Example: `{{1.client_id}}`&#x20;

The result of the last API is stored and that can be used via `{{token.<keyname>}}` format in API Manager Section. If the last API returns `{“access_token”: “123”}`, to use it in API Manager Section as `Bearer 123`, configure it as `{{token.access_token}}`.

Mention the Authorization header or param explicitly in API Manager. If all APIs require the header, configure it in API Manager Common Fields.

### Basic Authentication

Basic Authentication is a simple authentication method where the client sends a username and password encoded in Base64 with each HTTP request.

{% hint style="info" %}
You don’t need to manually add the Authorization header in your API definitions. DCKAP Integrator automatically gets username and password from the system user and handles authentication by auto-populating the required header in the API Call for you. To skip this autopopulation for any of the APIs, choose Skip Auth in API Manager.&#x20;
{% endhint %}

### OAuth1.0

Allows clients to access protected resources using pre-obtained token credentials - consumer key, secret, access token, and token secret - without requiring interactive user authorization during each request.

{% hint style="info" %}
You don’t need to manually add the Authorization header in your API definitions. DCKAP Integrator automatically gets the necessary fields from the system user and handles authentication by auto-populating the required header in the API Call for you. To skip this autopopulation for any of the APIs, choose Skip Auth in API Manager.&#x20;
{% endhint %}

### OAuth2.0

A widely adopted protocol that provides secure, token-based authentication and authorization.&#x20;

| Grant Type                   | DCKAP Integrator supports Authorization Code Grant and Authorization Code Grant with PKCE (Proof Key for Code Exchange).                                                     |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Redirect URL                 | Configure the given redirect URL in your system                                                                                                                              |
| Authorization URL            | Authorization URL should begin with https                                                                                                                                    |
| Scope                        | If there are many scopes, separate with a space in between. Ensure that you enable offline token access via scope.                                                           |
| Token URL                    | Token URL should begin with https                                                                                                                                            |
| Client ID                    | Configure your app’s client ID                                                                                                                                               |
| Client Secret                | Configure your app’s client secret                                                                                                                                           |
| Add Client Authentication To | Choose where the client details should be sent when the Token URL is hit in Header/Body                                                                                      |
| Authorization Key            | Key Name of Authorization Field - Example: Authorization                                                                                                                     |
| Authorization Format         | If your token API Call returns `{“access_token”: “123”}` and you want to send “Bearer 123” in your request, mark the authorization format as Bearer `{{token.access_token}}` |
| Add Authorization Data to    | When making API calls, where should the Authorization Key and Value be added - if in header, choose Request Headers, if in Params, choose URL                                |

{% hint style="info" %}
By default, this authorization data is added to all API Calls. To skip this for any API Call, choose Skip Auth in API configuration.<br>
{% endhint %}


# Credential Inputs

Step 3: Add Credential Inputs

The Credential Inputs section in the System Builder allows you to configure the fields that must be collected from users when they create credentials for a system. This feature enables System Builders to design flexible, secure, and user-friendly credential input experiences.

By default, the `host_name` field is included as a required field. It is greyed out, cannot be deleted or edited, and will always be collected from users unless the System Builder provides an override value. If the system builder provides the override value, the system will use that value and will not prompt users to enter it.&#x20;

System Builders can add custom credential fields to collect specific information such as API keys, client secrets, regions, or other parameters.&#x20;

{% hint style="info" %}
For Basic Authentication, username and password fields are automatically asked from the system user. You need not manually configure them. Similarly for OAuth1, Consumer Key, Consumer Secret, Access Token, Access Token Secret, Signature Method and an optional realm value are asked from the system user automatically.&#x20;
{% endhint %}

When adding a field, the following properties must be configured:

* **Display Name** is the label shown to end users during credential input. It should be descriptive and easy to understand - for example, “API Key” or “Region.”
* **Key** is the internal identifier for the field used in backend operations and database storage. It must be unique and must not conflict with built-in keys like host\_name. The platform validates key names to prevent duplication or use of reserved keys.
* **Type** defines how the input is rendered for the user. There are four supported types:
  * **input**: a standard text input field.
  * **mask**: a password-style input field that hides the characters typed by the user. The value is obscured in the UI and can be revealed temporarily by clicking an eye icon during credential entry. This is purely a visual masking and does not encrypt or store the data differently.
  * **dropdown**: a selection list that displays user-friendly labels and stores the corresponding key. For dropdowns, the Options field must contain a valid JSON object. For example, `{"in": "India", "eu": "Europe"}` will show India and Europe in the dropdown, but store in or eu in the database for further use.
  * **Sensitive** : It works the same as a mask field. It will be updated in further releases as non-viewable once added. .
* **Dropdown Options** is a field that is required only when the type is set to dropdown.This field is unnecessary for other field types and should be left blank.
* **Override Value** allows the System Builder to predefine a fixed value for the field so that the user is not prompted to provide it. Currently, this feature is only supported for the host\_name field. If set, the value is automatically applied at credential creation.
* **Required** is a setting that determines whether the user must fill out the field when creating credentials. It is unchecked by default, but can be checked to make the field mandatory.<br>

Each field can be edited after creation (except for host\_name), and custom fields can be removed using the delete icon.&#x20;

This configuration is crucial for defining what information users must provide and which values can be fixed or pre-set by the System Builder, ultimately simplifying and securing the credential creation process.&#x20;

Any fields created here can be used using `{{inputs.<keyname>}}` in APIs.

<br>


# Test Connection

Step 4: Configure Test Connection

The Test Connection tab allows System Builders or users to verify connectivity with a system by entering a sample API endpoint. This is a useful tool to ensure the configured credentials are valid and that the system is reachable.&#x20;

As a best practice, it is recommended to use a simple GET API without URL arguments or version numbers as the Test Connection API to ensure consistency and reliability in testing. The user has the flexibility to freely navigate between tabs without needing to save their progress. If credential fields are typed in (but not yet saved), the “Use Direct Values” option in the Test Connection tab will still reflect these unsaved values on the front end, allowing users to test with live inputs.

To use the value of any credential input in the API endpoint or request, the syntax `{{inputs.keyname}}` should be used. For example, to insert a user-entered API key with the key name api\_key, use `{{inputs.api_key}}` within your request or headers. The base URL for the Test Connection API and all related API endpoints will always begin with `{{inputs.host_name}}/`, which is non-editable and must be assumed as a required prefix to all test URLs.

The system supports two ways of testing:

1. **Using Stored Credentials** – credentials that have already been saved to the system.
2. **Using Direct Values** – credentials that are typed in temporarily for testing purposes, without needing to be saved first.

However, for OAuth2 and Token Authentication methods, only stored credentials can be used for testing. In these cases, the “Use Direct Values” option will not be available, as these authentication types depend on stored tokens and authorization flows that cannot be simulated with direct inputs.


# Builder Credentials

The Builder Credentials tab allows System Builders to create credentials solely for testing APIs during the system creation process for each system version. It appears next to the System Details tab on the System Overview page and lists all added credentials. Builders can Add, Edit, Delete or Test credentials as needed.

## Adding a Credential

When you click “Add Credential,” a pop-up appears where you can enter test credential details. The form fields change depending on the selected authentication type (e.g., Basic, OAuth1, OAuth2, Token, etc.).

### **Credential Fields (Basic Auth Example)**&#x20;

* **Credential Name** (required):\
  A unique and recognizable name for the credential.
* **Timezone**:\
  Select the timezone relevant to the credential (affects time-based API testing).
* **Username** (required):\
  Username for authentication.
* **Password** (required):\
  Password for authentication (eye icon available to toggle visibility).

{% hint style="info" %}
Field options adjust automatically based on the selected authentication type. Any fields added under the Credential Inputs section will also appear when adding or editing a credential.
{% endhint %}

## Testing and Saving

Click “Test and Save” to validate the credential. Only valid credentials will be saved. If Test Connection fails due to invalid credentials, the save will be blocked and an error log will appear.

## Testing Existing Credentials

Use the “Test Connection” button to verify if an added credential is working properly with the system.

## Important Notes

* Only one builder credential per authentication type is allowed per system version.
* Each credential is tied to a specific version of the system (including drafts).
* Only one authentication type is supported per system in the initial release.
* This tab is visible only to System Builders - end users cannot access it.
* This feature is meant for building systems and testing APIs before use.


# API Manager

The API Manager allows you to add, edit, manage, and store any number of system APIs.

To create a new API, click on "Add New API" from the API Manager page. Configuration options, including parameters and other details, will appear on the right side of the screen.\
\
For Private systems, you can make modifications/deletions to APIs only in Draft mode.

### System Types and API Permissions

**Private Systems:**

* APIs can be added or edited only by system builders when the system is in draft mode.

**Public Systems:**

* Users can add, edit, or delete private APIs.
* Public APIs cannot be modified directly.

If users need to make changes to a public API, "Create as Private API" option can be used. This allows you to duplicate the public API and create a private version, which can then be modified as required.

For such duplicated APIs, a separate Save button is available. Use this button to store the modified changes to the private version.

### Filtering Options

The API list supports filtering by:

* Type: All / Private / Public
* Method: All / GET / POST / PATCH / PUT / DELETE

### Save All and Delete Options

Next to the "Add New API" button, you’ll find three actions:

* **Save All**:\
  Save multiple APIs at once with a single click.
* **Delete**:\
  Select and delete one or more private APIs. Public APIs cannot be deleted.

### Creating an API

When adding a new API:

* Provide a meaningful unique name (e.g., Get Customers , Create Order ).
* Specify the request method, URL, headers, parameters, and body.
* Make sure to upload the sample request and response data for mapping purposes.
* During execution, System Credentials are automatically applied to all APIs.\
  If you want to exclude credentials for a specific API, enable the “Skip Auth” option in the Others tab.
* The default API timeout during execution is 240 seconds.\
  You can modify this value in the Others tab of the API settings.
* Credential Inputs (`{{inputs.keyname}}`)\
  Use these to insert values from the selected system credentials into the API's URL, headers, params, or body.\
  Example: `{{inputs.album}}` fetches the album value defined in the credentials.
* Token Values (`{{token.keyname}}`)\
  Use these to include dynamic tokens (e.g., access tokens) generated during execution based on system auth type.\
  Example: Authorization: Bearer `{{token.access_token}}`

### Cloning and Deleting your APIs

You can manage an API by clicking the three-dot menu next to it. You'll see two options:

* **Clone**:\
  This allows you to clone the selected API. The cloned API will have '-CLONED' appended to its name.&#x20;

{% hint style="info" %}
Cloning is only available for private APIs, you cannot clone public APIs. However, you can use the 'Create as Private API' option to replicate a public API as a private one.<br>
{% endhint %}

* **Delete**:\
  This lets you flag APIs for deletion. You can switch between APIs and flag the ones you want to delete. Once done, click Save — the flagged APIs will then be permanently deleted.

### API Common Fields

The API Manager also supports configuration of common headers and parameters through the API Common Fields section. These fields provide a centralized way to define shared headers and parameters across all APIs.

* Any headers or parameters defined here are automatically populated in all APIs, including the Test API.
* Even if the common fields are not explicitly saved, they are dynamically applied during usage in draft mode for testing purposes. Make sure to click save to save the changes.

{% hint style="success" %}
While creating a new system, the **Content-Type: application/json** header is added by default in the Headers section. You can edit or delete this header at any time in the **Common Fields** section under **API Manager**.
{% endhint %}

### API Testing in API Manager

You can test the API you're developing directly within API Manager. Click the “Test” button located on the right side of the Request URL section, or go to the “Test Details” tab in the API sidebar. This will open the Test Area on the same page, where you can either:

* Select an existing credential. (or)
* Manually enter credentials to test the API.

When testing APIs that include variables in the URL or parameters, the system now prompts users to enter values for those variables.

1. Once configured, click the “Test” button to trigger the API call.
2. Provide values for the required variables.
3. Select or enter credentials.
4. Proceed with testing as usual.

This ensures accurate population of variable values during test execution. The test results will be displayed below, including: Body, Request Headers and Response Headers.


# Versioning

System versioning allows builders to maintain multiple versions of a single system. A new draft version can be created by clicking the Create New Version button located next to the system name on the System Overview page.

{% hint style="info" %}
Only one draft version can be maintained at a time.
{% endhint %}

Draft versions are not visible to end users. A version becomes visible only after it is published. Once a system version is published, it cannot be edited.

When a new version is created, it clones information from the latest version, including:

* System Information
* Builder Credentials
* System APIs

Users can switch between system versions using the version dropdown on the System Overview page.

{% hint style="info" %}
During draft version changes, if updates are required for an existing API, kindly apply the changes directly to the existing API. Do not delete or create a new API for the same functionality, as it will break version tracking and disrupt the upgrade process.
{% endhint %}

In the version listing, each system version is labeled with a status flag such as:

* Latest Version
* Currently Used Version
* Deprecated Version

{% hint style="warning" %}
Cloning of System Builder credentials is restricted when creating a new system version. This prevents potential conflicts that may arise if fields in the system credentials section are modified.
{% endhint %}

## **Deprecate A Version**

Builders can deprecate a published version using the Action icon in the Version History tab.

Even after deprecation:

* The system remains usable, but a warning message will be displayed.
* Workflows using the deprecated version will continue to function without any issues.

{% hint style="danger" %}
Deleting a version is not currently supported.
{% endhint %}

## Publish System

The Publish option is available under the Version History tab. Here, builders can find the Test and Publish button to initiate the system version publishing process.

If the Test and Publish button is disabled, please ensure that all changes in the version have been saved.

Once the Test and Publish option is clicked, a pop-up will appear requesting the following version-related details:

* **Version Number**\
  A unique identifier to differentiate the system version.
  * Examples
    * 2.4.0 (Magento)
    * 2025-04 (Shopify)
    * v2 (Bigcommerce)
* **Recommended Version**\
  If set to Yes, this version will be shown by default when adding the system.
* **Recommended Release Type**\
  Determines how the version will be upgraded.
  * **Manual** (default): The user must manually upgrade the version.
  * **Automatic**: The version is automatically upgraded after publishing.

{% hint style="info" %}
Automatic upgrade is not currently supported. It will be available in a future update
{% endhint %}

* **Release Notes**\
  Builders should provide release notes or changelogs describing the changes made in this version.

After filling in the details, Builders must validate the system version by clicking the Test Connection button. Valid dynamic credentials or builder credentials must be provided to successfully publish the system.

{% hint style="success" %}
Only one version can be marked as the Recommended Version.
{% endhint %}

If a new version is set as recommended, the previously recommended version will be automatically updated to No.


# Delete & Deprecate System

### Delete a System with its associated versions

The System Builder can delete a system along with all its versions directly from the System Builder listing page (the page that opens when you click the **System Builder** menu).

A system can be deleted only if none of its published versions have associated users. If any user is linked to any published version, the system cannot be deleted.

When a system is deleted, all its versions, APIs, and builder credentials are permanently removed.

### Delete a Version of a System

If a specific version of a system has no associated users, the System Builder can delete that version from the Version History tab within the system editor. Deleting a version permanently removes all APIs and builder credentials linked to that version.

If the System Builder deletes the recommended version, they will be prompted to select a new recommended version, provided more than one published version exists. If only one published version remains, it will automatically become the recommended version.

If a system has no published versions, the system becomes inaccessible to users.

### Deprecate a Version of a System

If the System Builder wants to discourage the use of a specific version while there are existing users, the version can be deprecated. Deprecating a version prevents new users from selecting it while still supporting existing users. A deprecated version can be restored at any time using the “Undo Deprecate” option.

If the System Builder deprecates the recommended version, they will be prompted to select a new recommended version when more than one published version exists. If only one published version is available, it is automatically set as the recommended version.&#x20;

If no published versions exist for a system, the system cannot be accessed by new users.

When users access a deprecated version, they will see a warning message:

* If a recommended version exists, the warning prompts the user to switch to the recommended version.
* If no recommended version exists, the warning advises the user to discontinue using the system.


# Logs

View actual numbers and results of the data synchronization

The Logs and Results can be accessed in two ways:

1. From the Integrations page: Click on **View Logs** under the Sync Now/ Copy URL button
2. From the Projects Navigation Menu: Click on the **Logs icon.**<img src="/files/pMHTSVn0TY09RRu4FbuC" alt="" data-size="line">&#x20;
3. If a sync fails, then the "Synchronized (with error)" icon will also redirect to the Logs page.

<figure><img src="/files/yqoLs6XU5PmDVm3XbmGF" alt="" width="375"><figcaption></figcaption></figure>

The Logs page displays the following fields in tabular form:&#x20;

<figure><img src="/files/9yxGYQP1PCpD4LOhD7yA" alt=""><figcaption></figcaption></figure>

| Field name                                      | Description                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Pipe Name/Workflow Name                         | The Integration name                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Total                                           | Total number of records processed in that sync                                                                                                                                                                                                                                                                                                                                                                                                   |
| Succeeded                                       | Number of records processed successfully                                                                                                                                                                                                                                                                                                                                                                                                         |
| Failed                                          | Number of records that were not processed                                                                                                                                                                                                                                                                                                                                                                                                        |
| [Duration](/project-manager/logs#logs-duration) | Time taken for the sync to complete.                                                                                                                                                                                                                                                                                                                                                                                                             |
| API Time                                        | Time taken for an API call in a synchronization                                                                                                                                                                                                                                                                                                                                                                                                  |
| Started At                                      | Time when the sync was started                                                                                                                                                                                                                                                                                                                                                                                                                   |
| Finished At                                     | Time when the sync process ended                                                                                                                                                                                                                                                                                                                                                                                                                 |
| Status                                          | Status of the sync                                                                                                                                                                                                                                                                                                                                                                                                                               |
| View Console button                             | The Console Log file can be downloaded from here. (The Console Log is defined by the 'Console' statement in the Flow)                                                                                                                                                                                                                                                                                                                            |
| Action                                          | <ul><li><p>Reprocess: To reprocess the synchronization with the same data</p><ul><li>For Batch Processing: Reprocess uses the same date as the data that failed to sync</li></ul></li><li><p>View Detailed Logs: </p><p>Displays either</p><ul><li>A general log message (as a popup), defined by the 'Logger' statement in the Flow</li><li>An entity level log message, defined by the 'Step Logger' statement in the Flow</li></ul></li></ul> |

<figure><img src="/files/HwQKXlVxBmtyeFJe81cB" alt=""><figcaption><p>Console Logs</p></figcaption></figure>

## Logs Duration

The duration split-up information for every synchronization is displayed upon hovering over the Duration field. You can then click “View all APIs” to see detailed information such as System Name, API Name, API Count (number of times the API was called), Average Duration, and Total Duration.

<figure><img src="/files/fwMtGQwzKxgn3x4pSipe" alt=""><figcaption><p>Logs Duration with records</p></figcaption></figure>

<figure><img src="/files/X1mcJ76TEpk0hJVld1aQ" alt=""><figcaption><p>Logs Duration Split-up on API Level</p></figcaption></figure>

## Logs Filter

<figure><img src="/files/q12enMWkMEfPwpk2cPuH" alt=""><figcaption><p>Logs Filter</p></figcaption></figure>

The Logs can be filtered based on:&#x20;

1. Pipe Name
2. Entity ID
3. Status of the Logs&#x20;
4. Total records

### **Default Date Filter**

The default date filter is automatically added to logs page to improve performance. Users can choose from predefined time ranges, such as recent hours or days, to quickly filter logs. (e.g., Last 3 hours or Last 7 days)

Users can also specify a custom date range (e.g., Jan 01, 2025, 12:00 AM – Jan 10, 2025, 12:00 AM)

By default, logs from the last 7 days are displayed.

## Logs Timezone &#x20;

* All times are displayed in respective project timezone. If not configured, Default Timezone is UTC (Coordinated Universal Time).
* If a user overrides a project timezone by account timezone in account settings, Logs will be displayed in the account timezone set by the user. This change will be reflected only for that user.

## Pipes Reprocessing

This feature allows the ability to reprocess the pipes with the same information again. This can be used when errors in a pipe are fixed, and users wish to resync the same data.

{% hint style="info" %}
Some systems could not work well with the reprocessing feature because of its limitations.
{% endhint %}

#### Pipes Reprocessing enable/disable options

The Option to enable and disable logs is found within the project settings as displayed in the image below:&#x20;

<figure><img src="/files/k8ErzlGBIIUX3tKLmIJ0" alt=""><figcaption></figcaption></figure>

On enabling the pipes reprocessing option, DCKAP Integrator logs the information of the pipe on the first run, to reprocess the same data again.

## Important Notes

{% hint style="info" %}

* All the date and time entries shown here are displayed in the timezone configured in project settings
* The **View Console** button will be displayed and Console messages are logged only when the setting is enabled in the project settings (Click here to go to [Project Settings](/project-manager/project-settings))
* For Batch synchronization, Console logs greater than 5 MB may be downloaded as a text file
* Dynamic services will not be able to log more than 5 MB in Console logs
* Console logs will be automatically deleted except the last 5 days' records.
* **IMPORTANT**: Console Log download link is valid only for 5 minutes. You will need to refresh the page to get a new link in the Console Log Area.&#x20;
  {% endhint %}

{% hint style="warning" %}
Any kind of logs (Logs Summary, Detailed Logs, Console Logs) will be retained only for 30 days in  DCKAP Integrator.&#x20;
{% endhint %}


# Project Settings

Configure parameters for a project that will facilitate seamless execution and accurate results.

Check out this quick video explainer of Creating and Managing Projects.

{% embed url="<https://www.youtube.com/watch?v=li_rszstdlg>" %}

After creating a new project, it is best recommended that you update the project settings to enable smooth execution.&#x20;

<figure><img src="/files/Kx7sig787bsOyv2A3JJB" alt=""><figcaption><p>Project Settings</p></figcaption></figure>

These settings include:&#x20;

## General

### Project Name

Here simply enter your Project's name

### Project Description

Give a brief description of your project.

### Timezone

To schedule and manage everything in your timezone; Choose from the drop-down list

![](/files/-M5v6u_t44XIl5vl551A)

### Activity Logs

The Activity Logs are used to track when users create, update, or delete any entity within the project, along with their creation date and time.

Activity Logs are turned off by default, but you can enable them.

<figure><img src="/files/iimZCB8hbde8JC4P9PWm" alt=""><figcaption></figcaption></figure>

## Console Logs&#x20;

Console logs are used to track and debug the transactions in the DCKAP Integrator application.

### Enable Console Logs

To enable or disable console logs to be displayed on the Logs page.

![](/files/-M5v7Qs-sZCYpsqhVpPY)

### Console Log Options&#x20;

<figure><img src="/files/oNgpYIoo2RDT1J28yE8L" alt=""><figcaption></figcaption></figure>

Four log display options are available to the user to choose from:

* API Method and URL
* API Request Information&#x20;
* API Response Information
* API Header Information
* API Params Information

Selected options will be logged for all Pipes in the Project.

## Email Alerts&#x20;

### Enable Failure Alerts

To enable or disable synchronization-failure email alerts. These emails are sent if an error occurs during the data synchronization.&#x20;

<figure><img src="/files/wGaWDNI7EIxMmRMfGmQ0" alt=""><figcaption></figcaption></figure>

### Email Addresses&#x20;

Provide one or more email addresses to which alerts have to be sent.&#x20;

### Failure Alert Options

Choose one of three options to trigger emails when the selected events happen:&#x20;

* All Failed&#x20;
* Partially Failed Only&#x20;
* Completed Failed Only&#x20;

<figure><img src="/files/fFx96EEbzwcx5Pk3OvmX" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Email alerts can be set at the Pipe Level too. [Click here to Learn More.](https://docs.cloras.com/user-guide/projects/integrations/add-new-pipe#email-alerts-at-pipe-level)
{% endhint %}

## Users

Check out this quick video explainer of  Adding a New User to a Project.

{% embed url="<https://www.youtube.com/watch?v=q_gah0BYBOo>" %}

Check out this quick video explainer of Adding an Existing User to a Project.

{% embed url="<https://www.youtube.com/watch?v=DvlX27VLld8>" %}

&#x20;

To add a User to the Project,  provide the email address of the User, give the necessary access permission - either **Admin** or **Standard** and, click on **Add User.**&#x20;

* **Admin**: Has the privilege of project owner with the following limitations:
  * cannot delete the project and
  * cannot transfer the project
* **Standard**: Has the privilege of Admin with the following limitations:
  * cannot delete the project
  * cannot transfer the project
  * cannot modify configuration/settings
  * cannot provide project access to any other users/groups

An invitation will be sent to the user to accept or reject the access.&#x20;

{% hint style="success" %}
Non-DCKAP Integrator users may also be added to the project. An invitation will be sent out to them to sign up for a DCKAP Integrator account.&#x20;
{% endhint %}

The email addresses of added users are displayed in the lower section of the page. Here, the project owner can see if the User has accepted or rejected the access invite. Also, the user's access level can be modified or revoked by the project owner/admin if needed.&#x20;

<figure><img src="/files/wObhVWqrRXQMxIEZbuMJ" alt=""><figcaption></figcaption></figure>

## User Groups

Here, the project owner/admin can add a User Group to give access to the project. (The User Group can be added only once the users in the group have accepted the Group invite).  Once the User Group is added, it will be displayed in the lower right section of the page. The access permission for this group is already defined in the [User Groups ](/user-guide/account-management/user-groups)page. A Revoke button is present, which allows the project owner/admin to remove access for the User Group.

{% hint style="warning" %}
An email will not be sent to individual users of the group when the group is added to a project.
{% endhint %}

{% hint style="danger" %}
The project owner/administrator can only add groups that they own to the project. They cannot add groups owned by some other users.
{% endhint %}


# Project Analytics

To view analytics for a specific project, navigate to the project and click on the analytics icon. Project-level analytics are accessible to all users associated with the project. More details in below section.

{% content-ref url="/pages/Go5XXqJ67suKQgl7bu56" %}
[Analytics](/getting-started/analytics)
{% endcontent-ref %}


# Advanced

Developer related modules to build Flows and manage APIs.


# Flows

Flows are functional modules that resemble pseudocodes and form the building blocks of every integration.

Flows act as the neural schema for system integration, and carry out the whole integration logic end to end. The Flow is responsible for making API calls to the targeted system, formatting and validating data, logging transactions, and so on.

The Flows landing page contains the following information in tabular form:&#x20;

| Title          | Name of the Flow                                    |
| -------------- | --------------------------------------------------- |
| Description    | Brief description of the Flow                       |
| Created By     | The user who created the Flow                       |
| Status         | Displays if the Flow is in Active or Inactive state |
| Open Simulator | To simulate the Flow. Used for testing purposes     |

For detailed information on [Flows and Handlers, click here.](/developers/flows)


# Project Documents

Module to upload and link any documents associated with the Project

The Project Documents module allows Project Owners and users to upload and documents associated with the Project.&#x20;

To access the Project Documents section, click on this icon from the Projects Page:

![](/files/-MityPkeBbWaRGELtcGx)

The Project Documents page will open.&#x20;

## Upload a new Project Document

1. On the Project Documents page, click on Add New.&#x20;

![](/files/-Mitys-NQaCc9sD_jfLh)

2\. The Add Project Documents page will open.

3\. Two options are available here:&#x20;

![](/files/-MitzWT2_VPrxIUvi3es)

* **Add Documents**
  1. Click on Upload files under Add Documents to select and add the files to attach to this project.
  2. These documents can be downloaded and viewed by Project users
* **Add Links**
  1. Insert the document link in the space given and click on Add.&#x20;
  2. Clicking on the link will redirect users to the document page.
* The documents will now be available on the Project Documents page for all Project users to access

{% hint style="warning" %}
Only Project Owners can delete a document/link that has been uploaded/added.&#x20;
{% endhint %}

{% hint style="danger" %}
**File size for uploads**

File size for uploads should be less than 10MB and allowed formats are ( .doc, .docx, .pdf, .csv, .xls, .xlsx, .txt, .odt, .json, .ppt, .pptx, .jpg, .jpeg, .png)
{% endhint %}


# Flows & Handlers

"Flows" are a set of statements, written like pseudocode using simplified language, for implementing integrations.

"Flows" are a set of statements like pseudocode, written using simplified language, for implementing integrations.

## Introduction to Flows

Flows act as a neural schema for system integration, carrying out the whole integration process end to end. The flow is responsible for handling business logic, making API calls to the targeted system, formatting and validating data, logging transactions and so on.

Flows are created by developing a logical program sequence using lines of code-representation known as Handlers. Handlers form the backbone of every Flow.

![](/files/-LvRN3viYzY3xmAsbuCQ)

{% hint style="info" %}

1. The list of Pipes associated with a Flow are displayed below the Flow Status Area.&#x20;
   {% endhint %}

![Pipe List in the Flows page](/files/GiDyoKgcpyNPcPAqpSJ2)

### What are Handlers?

Handlers are statements used to build a flow, in the form of code-representation by following an algorithmic approach. Every handler has its functional logic and requires a certain set of parameters to be defined to carry out its activities. Multiple Handlers are available to the user to build their flow.

![](/files/-LvQN1NElwIuB3FxIwwS)

Some example functionalities that Handlers can perform include

* :arrow\_upper\_right: Making API calls to any system
* :aries: Assigning data to variables
* :twisted\_rightwards\_arrows: Mapping of the API fields
* :notepad\_spiral: Display log messages
* :fast\_forward: Sending data to the destination system in the required format
* :envelope\_with\_arrow: Sending emails and so on

The same handler can be used N number of times in a Flow.

### How to use Handlers?

Simply drag and drop Handlers to the ‘Play Area’ to include them in your Flow. Once it is positioned in the coding area, its parameters need to be assigned. These parameters are different for each handler and are discussed in detail [below](/developers/flows#available-handlers).

![Drag & Drop Feature](/files/-LvR38fwxlQ9wZJvVhlj)

Handlers can also be copied, moved, and commented on within the Play Area and can also be deleted when they are no longer needed.

### Selecting Multiple Handlers

Multiple Handlers can be selected by selecting the checkbox alongside each handler statement. Once the handlers are selected, user may Cut/Copy/Delete/Comment the statements as needed. &#x20;

![](/files/-MiaBNgouC60fu5oc-Ut)

## Available Handlers

### API Calls

Triggers an API Call in which you can pass parameters and payload to any system. The API responses will be stored in a defined variable which is available for further usage in the Flow.

![API Call Handler](/files/-LvQPCjTJRdlmKttVP77)

While clicking on the API dropdown list, a differentiator to identify public and private APIs will be seen. See image below:&#x20;

![](/files/PBLRBYLTHnxJAqcgqcIf)

{% hint style="success" %}
It is recommended to use the `If, Else` handlers after the `API call` handler, to ensure the validity of the API response.
{% endhint %}

<table data-header-hidden><thead><tr><th>Parameters</th><th width="299.5806451612903">Definition</th><th>Type</th></tr></thead><tbody><tr><td><em>Parameters</em></td><td><em>Definition</em></td><td><em>Type</em></td></tr><tr><td>Systems</td><td>Platform to send and receive responses</td><td>DropDown</td></tr><tr><td>API</td><td>API endpoints of the selected system. Depending on the Platform chosen, the list of API’s in the dropdown changes.</td><td>DropDown</td></tr><tr><td>Response Variable</td><td><p>Stores API response</p><p>Example: <code>customer_info</code>, <code>create_customer_data</code>, etc</p></td><td>Variable</td></tr><tr><td>Payload</td><td>Request Body. Information sent along with the API call </td><td>Variable (defined), JSON, Array</td></tr><tr><td>Files</td><td><p>Upload one or many files contents. Example: <br><code>[</code> </p><p><code>('file', ('foo.csv', "hello,there,csv,data")), ('file', ('bar.txt', "this is a file content"))</code> </p><p><code>]</code></p></td><td>Variable (defined), JSON, Array</td></tr><tr><td>Headers</td><td><p>Request Headers </p><p>Example: </p><p><code>{"Accept": "application/json"}</code></p></td><td>Variable (defined), JSON</td></tr><tr><td>URL Arguments</td><td><p>Arguments used in a dynamic URL.</p><p></p><p>API URL: <code>/api/customer/{customer_id}/fetch</code></p><p>URL Argument: <code>{"customer_id":"2"}</code></p><p>Formatted URL: <code>/api/customer/2/fetch</code></p><p></p><p>In this case, <code>customer_id</code> is replaced with the number <code>2</code>.</p></td><td>Variable (defined), JSON</td></tr><tr><td>Parameters</td><td><p>Request parameters</p><p></p><p>API URL: <code>api/customer/get/?format={format}</code></p><p>Query Params: <code>{"format":"json"}</code></p><p>Formatted URL: <code>api/customer/get/?format=json</code></p><p></p><p>Here, <code>format = json</code> will be the query parameters.</p></td><td>Variable (defined), JSON</td></tr><tr><td>Override time</td><td>To override the timeout at Flow level. Read more below.</td><td></td></tr></tbody></table>

#### **For XML Payload (Examples)**

#### Plain request

`{'plain_request': {'key1':'value1','key2':'value2'}}`

#### Not a plain request

`{'body':{'key1':'value1','key2':'value2'}}`

{% hint style="info" %}
`Use keywords(DYNAMIC_TOKEN, GET_FROM_CREDENTIALS) to fetch and pass the respective dynamic information in headers and payload.`
{% endhint %}

* DCKAP Integrator accepts API responses in JSON, CSV and Text formats.
* API Call Handler also has the facility to add headers from Flows.

#### To add additional envelope namespace&#x20;

Along with the above request, add another key “envelope\_namespace” to add additional namespace with default namespace

XML Request Body

```xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterprise.soap.sforce.com">
   <soapenv:Header>
   </soapenv:Header>
   <soapenv:Body>
      <urn:login>
         <urn:username>user1@ddckap.com</urn:username>
         <urn:password>user1@123</urn:password>
      </urn:login>
   </soapenv:Body>
</soapenv:Envelope>
```

Converted JSON request Body

<pre class="language-json"><code class="lang-json">{
    "envelope_namespace": "xmlns:urn='urn:enterprise.soap.sforce.com'",
<strong>    "body": {
</strong>        "urn:login": {
            "urn:username": "user1@ddckap.com", 
            "urn:password": "user1@123"
        }
    }
}
</code></pre>

{% hint style="info" %}
To <mark style="color:blue;">override</mark> the API manager timeout at the Flow level.

Choose: Yes/No from the drop-down list Yes - Override the timeout based on read and connect values mentioned here No - Do not override the timeout based on read and connect values mentioned here

"Connect" refers to the maximum allowed time for DCKAP Integrator to establish communication with the system to which the API call is made.&#x20;

"Read" refers to the maximum allowed time for the system to respond back to DCKAP Integrator.
{% endhint %}

### MySQL

Connects to the SQL database and allows users to configure data in the SQL database.

| *Parameters*  | *Definition*                                                   | *Type*            |
| ------------- | -------------------------------------------------------------- | ----------------- |
| Variable      | Stores the response data (SQL response)                        | Variable          |
| Systems       | System to connect to                                           | DropDown          |
| Database Name | Database name to connect to                                    |                   |
| Action        | Operation to be performed on the data. See below for examples. | DropDown          |
| Data          | Data to be configured in the database                          | String/Non-string |
| Table Name    | Table name in the database                                     | String/Non-string |
| Condition     | Condition to validate to configure the data                    | String/Non-string |
| Limit         | Number of records needed                                       | String/Non-string |

**Different Action Types with examples**:&#x20;

```
Action: Insert 
Description: Used to insert a record into a table
Example: 
INSERT into table_name (name, email, contact_no) values ('John Smith', 'johnsmith@gmail.com', '+17427772299');
```

```
Action: Insert Many 
Description: Used to insert multiple records into a table
Example:  
INSERT into table_name (name, email, contact_no) values ('John Smith', 'johnsmith@gmail.com', '+17427772299'), ('Max Roger', 'roger@gmail.com', '+17217772299'), ('Mike Hussey', 'hussey@gmail.com', '+17347772299');
```

```
Action: Replace 
Description: Used to insert records into a table if there is no record found already, otherwise records will get updated
Example:
INSERT into table_name (name, email, contact_no) values ('John Smith', 'johnsmith@gmail.com', '+17427772299'), ('Mike Hussey', 'hussey@gmail.com', '+17347772299') ON DUPLICATE KEY UPDATE name=VALUES(name), email=VALUES(email), contact_no=VALUES(contact_no);
```

```
Action: Update 
Description: Used to update a record from the table
Example: UPDATE table_name SET name='Steve Smith', contact_no='+17433773377' WHERE email='steve@gmail.com';
```

```
Action: Delete 
Description: Used to delete a record from the table
Example:
DELETE from table_name WHERE email='hussey@gmail.com';
```

```
Action: Select 
Description: Used to retrieve a record from the table
Example: SELECT * FROM table_name WHERE email='johnsmith@gmail.com' limit 10;

To retrieve column names from the table below example query should be executed,
Query: SELECT * FROM table_name WHERE 1=0;
```

### Incrementer

Increments the value of a specified variable by a given step.

![Incrementer Handler](/files/-LvQVnzgbnHNNlLIY8OK)

| *Parameters* | *Definition*                                                                                             | *Type*                      |
| ------------ | -------------------------------------------------------------------------------------------------------- | --------------------------- |
| Variable     | <p>Variable to be incremented.</p><p>Example: <code>line\_number</code>, <code>total\_records</code></p> | Variable (defined)          |
| Value        | Value by which the respective variable is increased                                                      | Numeric, Variable (defined) |

**Example**

```
Increment variable line_number by 1
```

Here, the variable line\_number will be incremented by value 1

### Formatter

The formatter is used to stringify/dump the JSON.

![Formatter Handler](/files/-LvQVnzeLjmSiBJb0KRe)

| *Parameters*  | *Definition*                                                                                                                                                                                           | *Type*                                |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------- |
| Value         | <p>Data to be formatted.</p><p></p><p>Example: <code>orders\_summary</code>, <code>\["test", "array", "data"]</code>, <code>{'data': orders\_summary}</code></p>                                       | Variable (Defined), Array, Dictionary |
| Variable      | Stores formatted value                                                                                                                                                                                 | Variable                              |
| Delimiter     | One or more characters for specifying boundary  between separate entities                                                                                                                              |                                       |
| Line ending   |                                                                                                                                                                                                        |                                       |
| Default Value | <p>Available Options</p><ul><li>JSON Dumps - the output might include white-spaces.</li><li>JSON Dumps with separators - Eliminate white-space. To get the most compact JSON representation.</li></ul> |                                       |

### Try Block

&#x20;The Try Block is used to catch an error.

{% hint style="info" %}
No parameters are assigned for the Try Block
{% endhint %}

### Exception Block

The Exception block handles the exceptions caught by the Try Block

![Exception Handler](/files/-LvQWTcKMVAXL9XRcfIx)

| *Parameters* | *Definition*                                                                             | *Type*   |
| ------------ | ---------------------------------------------------------------------------------------- | -------- |
| Catch        | <p>Types of Exception</p><p>Example: <code>Exception</code>, <code>ValueError</code></p> | String   |
| Variable     | Stores exception data                                                                    | Variable |

### Email Sender

Sends an email from the Flow to the assigned recipient list.&#x20;

| *Parameters*              | *Definition*                                                                                                                                                                         | *Type*                                                                                                                       |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
| Send To                   | Recipient emails in comma-separated values                                                                                                                                           | String                                                                                                                       |
| Subject                   | Subject Line of the email                                                                                                                                                            | String                                                                                                                       |
| Character Set             | Choose one option from the drop-down for the character set type to be interpreted in the emails                                                                                      | <p>Choose from drop-down: </p><ul><li>US-ASCII </li><li>ISO-8859-1</li><li>UTF-8</li></ul>                                   |
| Content Transfer Encoding | Mail encoding method                                                                                                                                                                 | <p>Choose from drop-down: </p><ul><li>Quoted Printable </li><li>Base64 </li><li>7Bit </li><li>8Bit </li><li>Binary</li></ul> |
| Message Type              | <ul><li>Plain Text for sending string messages</li><li>HTML for sending mail as per a template</li></ul>                                                                             | <p>Choose from drop-down: </p><ul><li>Plain Text </li><li>HTML</li></ul>                                                     |
| Dynamic Data              | <ul><li>For Plain text, leave it blank</li><li>For HTML Message Type: </li></ul><p>a) if there is dynamic data, pass it as a dictionary here</p><p></p><p>b) else leave it blank</p> | Dictionary                                                                                                                   |
| Message                   | <ul><li>If string, give the string input</li><li>If non-string, provide the HTML template.</li></ul>                                                                                 | String/ Non-string                                                                                                           |

```
Example 1

Message Type: Plain Text
Dynamic Data: Leave it blank
Message: String
Dear Sir,
This is to inform you that we received your ticket.
```

```
Example 2

Message Type: HTML
Dynamic Data: Leave it blank
Message: Non-String
<html>
   <head>
      <h1> Line1 </h1>
   </head>
   <body>
      <i>This is a mail to communicate that we are working on your ticket </i>
   </body>
</html>
```

```
Example 3

Message Type: HTML
Dynamic Data:  
{"keys": ["Name","Age","Company"], 
"records": 
[
{"name": "Alex", "age": 25, "company": "DCKAP"},
{"name": "David", "age": 28, "company": "DCKAP"}
]
}
Message: Non-String
<!DOCTYPE html> 
<html>
   <head>
      <style> 
         table, th, td { border: 1px solid black; } 
      </style>
   </head>
   <body>
      <table>
         <tr>
            {% for key in keys %}
            <td>{{key}}</td>
            {% endfor %} 
         </tr>
         <tr>
               {% for dict_item in records %}
                      {% for key, value in dict_item.items() %} 
                              <td>{{value}}</td>
                      {% endfor %}
                      <tr></tr>
               {% endfor %} 
         </tr> 
      </table>
   </body>
</html>
```

{% hint style="warning" %}
Base-64 HTML Combination and occasionally Base-64 plain text combinations don't work as expected. This will be addressed in the upcoming releases.
{% endhint %}

### Initialize Variable

Assigns and stores data in the specified variable which can be used in the Flow, after the variable declaration.

![Initialize Variable](/files/-LvQVnzhh3Pu3iQnBIe6)

#### Available Options

| *Parameters* | *Definition*                                                                                                                                                                                                                                                                                     | *Type*   |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- |
| Value        | String/Non-String                                                                                                                                                                                                                                                                                | DropDown |
|              | <p>Value or data assigned to a variable</p><p></p><p>Examples: </p><ul><li>String:<code>Hello World</code></li><li><p>Non String: </p><ul><li>Number ⇒ <code>0</code></li><li>Array ⇒ <code>\[1, 2, 3, 4, 5]</code></li><li>Dictionary ⇒ <code>{ "customer\_id": 123}</code></li></ul></li></ul> | Mixed    |
| Name         | Variable that stores the assigned value.                                                                                                                                                                                                                                                         | Variable |

#### Example 1

```
Assign value 0 to variable Area_Code
```

Here, `0` is assigned to the variable: `Area_Code`

#### Example 2

```
Assign value orders_info[‘data’][‘customers’] to variable customers
```

Here, the value in the dictionary: `orders_info[‘data’][‘customers’]` is assigned to a variable: customers

#### Example 3

```
Assign value {"entity_id": customer['id'], "shipto_id": ""} to variable customer_info
```

Here, the dictionary `{"entity_id": customer['id'], "shipto_id": ""}` is assigned to variable `customer_info`

#### Example 4

```
Assign value dependent_customers[item['customer_id']]['customer_id'] to 
variable mapped_orders['hdr']['customerId']
```

Here, the value in dictionary `dependant_customers[item['customer_id']][customer_id]` is assigned to variable `mapped_orders['hdr']['customerId']`

### Modify Variable

The handler is used to change or modify the contents of a variable (mainly array and dictionary), that has already been used in the flow.

![Modify Variable Handler](/files/-LvQVnzlmA6z_uSOed4J)

#### Available Options

| *Parameters* | *Definition*                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | *Type*             |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
| Variable     | Variable to be changed or updated. This variable should be already used in the flow and is to be modified                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | Variable (defined) |
| Value        | String/Non-String                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | DropDown           |
|              | The data to replace or change in the variable                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | JSON, Array        |
| Type         | <p>Type of data to be modified</p><ul><li>Dictionary/JSON</li><li>Array</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | DropDown           |
| Action       | <p>Action to modify existing data</p><ul><li>Append ⇒  Push a value into the array as the last element</li><li>Update ⇒ Push a value into the dictionary as last element </li><li>Assign ⇒ To assign new {key: value} pair into the dictionary or to modify the existing value of a key in a dictionary</li><li><p>Pop:</p><ul><li>Array - Removes the last element</li><li>Dictionary - Removes the value of the given key </li></ul></li><li><p>Remove</p><ul><li>Array - Removes the given value</li></ul></li><li><p>Deep Copy </p><ul><li>Array and Dictionary - Makes a copy of the variable and assigns a new value </li></ul></li></ul><p>To learn more, find the use cases below</p> | String             |

#### Use Case 1 - Dictionary(Action: Assign)

```
Modify variable customer_info['customer_id'] with value custom_attribute['value']
```

* Assume the variable customer\_info is a dictionary/JSON and contains the value `{“entity_id”:12, “name”: “Alice Blue”}`
* To add more keys with values to the dictionary, the modifier handler is used
* The below step adds `customer_id` to the dictionary
* After processing, the `customer_info` variable contains the value `{“entity_id”:12, “name”: “Alice Blue”, “customer_id”: custom_attribute[‘value’]}`

#### Use Case 2 - **Array(Action: Append)**

```
Modify variable customer_info['customer_id'] with value custom_attribute['value']
```

* Assume the variable customer\_info is an array/list and contains the value `[{“entity_id: 1}, {“entity_id: 2}, {“entity_id: 3}]`
* To add an item to the array, the Modify Variable handler is used
* The below step adds `customer_id` to the Array
* After processing, the `customer_info` variable contains the value `[{“entity_id: 1}, {“entity_id: 2}, {“entity_id: 3}, {"custom_attribute['value']}]`

### Mapping

Provides the ability to get mappings from the user and format data between two different system APIs.

{% hint style="info" %}
This adds a new mapping card in the pipes section to get mappings in the pipe. The Modifiers will also be provided in the same section.
{% endhint %}

Based on the Mapping configuration, the destination payload will be prepared from the source data.

![Mapping Handler](/files/-LvQVnzklxEUav8pkLr8)

#### Available Options

| *Parameters* | *Definition*                                                                                                   | *Type*       |
| ------------ | -------------------------------------------------------------------------------------------------------------- | ------------ |
| Display name | Mapping name displayed in the pipe                                                                             | Alphanumeric |
| Source       | API used to request data from the Source system                                                                | DropDown     |
| Destination  | API used to send data to the Destination system                                                                | DropDown     |
| Variable     | Stores mapped data                                                                                             | Variable     |
| Source Data  | Source data that will be formatted and sent to destination API as per the mapping configuration                | JSON, Array  |
| Ignore Keys  | Keys that should be ignored by the system, while processing data in the mapping structure defined by the user. | Alphanumeric |

#### **Example**

```
Prepare mapping with name Customers Information from source Get Customers- Magento 2
to destination Create Customers - Epicor P21 Custom Server
```

Creates a mapping node in the pipe to provide the mapping of data between the specified source and destination APIs.

#### **Use Case - Ignore Keys**&#x20;

```
{
  "customer": [
    {
      "name":"alice",
      "address": {
        "street": "Jarvis St.",
        "door_number": "5A"
      }
    },
    {
      "name":"bob",
      "address": {
        "street": "Marvel St.",
        "door_number": "7D"
      }
    }
  ]
}
```

Assume the field `street` is mapped from source to destination system and the path generated for this field will be `customer/address/street`.

During Mapping, when the user sends this customer data(Parameter: Data) inside a loop, one entry at a time, to get the `street address`, the resulting path generated will be `address/street`.

In this case, the user should mention the parent keys to be ignored. In this case `customer`. If multiple keys need to be ignored, then the user should mention them as comma-separated values.

{% hint style="info" %}
When an API or system is changed in the Flow, then the previously configured mapping becomes unstable.&#x20;

So users will be alerted if the mapping should be retained or if it should be deleted during the save and merge process.

If the mapping is retained, the errors will be highlighted.&#x20;
{% endhint %}

### If, Else If & Else

To define and check for decision-making conditions inside the Flow.

Condition parameters are defined for the `If` and `Else If` handlers. If this condition is satisfied, the children of `If` will be executed. Otherwise, the children of `Else` will be executed.

![If Handler](/files/-LvQVnzfazUo7ux2AUr7)

#### Available Options

| *Parameters* | *Definition*                                                                                                                                                                                                               | *Type* |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
| Condition    | <p>Condition that needs to be satisfied for the children-statements to be executed</p><p></p><p>Example: <code>admin\_details\['status']</code></p><p>If the value is <code>true</code>, the children will be executed</p> | Mixed  |

{% hint style="info" %}
No parameters are assigned for the `Else` Handler.
{% endhint %}

**Examples**

```
If specified condition matched
```

Some **example** conditions that can be used with the `If` statement, which need to be `true` for the proceeding children-statements to be executed

|                              |                                                      |
| ---------------------------- | ---------------------------------------------------- |
| `customers['status']`        | If the condition returns true                        |
| `customers["status"] == 200` | If the condition is satisfied                        |
| `orders and customers`       | If both order and customers variables contain values |
| `orders or customers`        | If either one variable has value                     |
| `'customer_id' in item`      | If the dictionary `item` has key `customer_id`       |

### Loop (Works like a For Loop)

Executes a block of code repeatedly in a cyclic fashion, each time with a different value.

![Loop Handler](/files/-LvQVnzjOVvrfrDLgEgl)

#### Available Options

| *Parameters* | *Definition*                                                                                                                                                       | *Type*   |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- |
| Iterable     | <p>Data to be iterated/looped</p><p></p><p>Example: <code>Sales\_rep\_data\['data']</code></p><p>The loop will keep running until there is an item in the data</p> | Array    |
| Key          | <p>Variable assigned to the loop counter</p><p>Example: <code>key</code>, <code>item</code></p>                                                                    | Variable |

#### Examples

```
Loop till specified condition matched
```

* `orders`
* `mapped_orders["lines"]`

### MSSQL&#x20;

Connects to the Microsoft SQL database and allows users to configure data in the SQL databases.

| Parameters    | Definition                                                     | Type              |
| ------------- | -------------------------------------------------------------- | ----------------- |
| Variable      | Stores the response data (SQL response)                        | Variable          |
| Systems       | MSSQL System to connect to                                     | DropDown          |
| Database Name | Database name to connect to                                    |                   |
| Action        | Operation to be performed on the data. See below for examples. | DropDown          |
| Data          | Data to be configured in the database                          | String/Non-string |
| Table Name    | Table name in the database                                     | String/Non-string |
| Condition     | Condition to validate to configure the data                    | String/Non-string |
| Limit         | Number of records needed                                       | String/Non-string |

### Step Progress

Denotes the progress of data processed inside a loop. The outcome of this handler is visually seen in the progress bar in the Integrations page. This helps in understanding how much data synchronization has been processed.

![Step Progress Handler](/files/-LvQVnznPErwePow4IiI)

{% hint style="info" %}
Use predefined variables `records_processed` and `total_records` to track the records. Add `Incrementer` handler in the loop to increment the values on every count.
{% endhint %}

#### Available Options

| *Parameters*      | *Definition*                                     | *Type*   |
| ----------------- | ------------------------------------------------ | -------- |
| Processed Records | Number of records that are processed             | Variable |
| Total Records     | Total number of records which is to be processed | Variable |

### Steps

This handler is placed one level above the previous handler `Step Progress`. It is used to visually split the business logic of the flow, for better understanding while synchronizing the data.

![Steps Handler](/files/-LvQVnzokeYU8yi77CaF)

#### Available Options

| *Parameters* | *Definition*                                                                                                                         | *Type*       |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------ | ------------ |
| Message      | <p>Displayed in the progress bar of pipes</p><p></p><p>Examples:</p><ul><li>Fetching M2 Orders</li><li>Updating P21 Orders</li></ul> | Alphanumeric |

### Logger

The Logger handler is used to log any errors or warnings in the flow. The Logs menu in the project area displays all the logs from the synchronization.

![Logger Handler](/files/-LvQVnziqwzZVOdgES0k)

This is a general level log and to log at the entity level, click [here](/developers/flows#step-logger).

#### Available Options

| *Parameters*    | *Definition*                    | *Type* |
| --------------- | ------------------------------- | ------ |
| General Message | Content that needs to be logged | Mixed  |

### Step Logger

The Step Logger handler is similar to the Logger handler but used to provide logs at the item level. The Step Logger marks every single entity inside the loop as **Success** or **Failure**.

This can be viewed by clicking the "View" button in the Logs section.

![Step Logger Handler](/files/-LvQVnzmzP5KPFPFSrLh)

For more general level logging, click [here.](/developers/flows#logger)

#### Available Options

| *Parameters*     | *Definition*                                                                                                                                                                                                 | *Type*           |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------- |
| Type             | Status of the execution. Success or Failure.                                                                                                                                                                 | DropDown         |
| Entity ID        | <p>ID of the entry. Useful in identifying if the entities succeeded or failed.</p><p></p><p>Example<em>:</em> <code>item\[‘itemCode’]</code>, <code>mapped\_orders\['hdr']\['webReferenceNumber']</code></p> | Variable, Number |
| Message          | Content that needs to be logged                                                                                                                                                                              | Mixed            |
| Detailed Message | Detailed content to be logged. Verbose.                                                                                                                                                                      | Mixed            |

### Console

Displays messages in the `Logs` section console area. This is especially useful in debugging the Flow itself.

The messages can be either static or dynamic.

![Console Handler](/files/-LvQWTcPkvA_GOgsY_H-)

#### Available Options

| *Parameters* | *Definition*                                                                                                                                                                                         | *Type* |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
| Message      | <p>Content that needs to be displayed</p><p></p><p>Example:</p><p>Dynamic ⇒ Variable: <code>order\_info</code>, <code>line\_no</code></p><p>Static ⇒ <code>HelloWorld</code>, <code>12345</code></p> | Mixed  |

### Get Last Synchronized Time&#x20;

Gets the last synchronized time of a system, in the required time zone

![Get Timezone Handler](/files/-LvQWTcOaBm53f9qVNdp)

#### Available Options

| *Parameters*          | *Definition*                                                                                                                 | *Type*   |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -------- |
| Variable              | Stores the last updated time                                                                                                 | Variable |
| Get Last Success Time | If Yes, fetches the last succeeded sync time. If No, fetches the last synced time irrespective of its status. Default is No. | DropDown |
| Systems               | The output (Last sync time) is got in this System's timezone                                                                 | DropDown |
| Format                | <p>To change the format of the output time</p><p> Example: Month-Day-Year HH:MM:SS</p>                                       | DropDown |

### Credential Keys

Retrieves any credential details from the respective project. (Example: Name, System, Hostname)

![Credential Keys Handler](/files/-LvQWTcNEdzzXnclQdBH)

#### Available Options

| *Parameters* | *Definition*                                                                                                                                             | *Type*       |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
| Value        | <p>Data that were assigned while setting up the credentials of the system</p><p>Value: <code>Name</code>, <code>System</code>, <code>Hostname</code></p> | Alphanumeric |
| System       | System from which the credential details are to be obtained                                                                                              | DropDown     |
| Variable     | Stores the obtained value                                                                                                                                | Variable     |

### Return Value

Returns data to the caller, in real-time.&#x20;

{% hint style="danger" %}
This applies only to the dynamic pipes.
{% endhint %}

![Return Value Handler](/files/-LvQWTcMrsBrbZaLCR_I)

#### Available Options

| *Parameters* | *Definition*      | *Type*                |
| ------------ | ----------------- | --------------------- |
| Return Value | String/Non String | DropDown              |
|              | Payload           | Variable, JSON, Array |

### **Date Time Formatter**

Add or subtract minutes or hours from a given time value.&#x20;

**Available options**

| *Parameters*      | *Definition*                                                                                                             | *Type*       |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------ |
| Variable          | Stores the output                                                                                                        | Alphanumeric |
| Date              | <p>String/Non-string </p><p>Actual date-time in UTC format or variable name containing the date-time in UTC format  </p> | DropDown     |
| Action            | <p>Advance/Recede</p><p>To add or subtract hours and minutes </p>                                                        | DropDown     |
| Hours and Minutes | Value of hours and minutes to be added or subtracted to the given time                                                   | Numeric      |

### Time Converter

Converts Time from one format to the other (12Hr clock to 24Hr clock and vice versa).

| *Parameters*  | *Definition*                 | *Type*                 |
| ------------- | ---------------------------- | ---------------------- |
| Convert       | The conversion time format   | DropDown               |
| Variable      | Variable to store the output | Alphanumeric           |
| Enter Hours   | Hours value                  | Numeric (1-12 or 1-24) |
| Enter Minutes | Minutes value                | Numeric (1-60)         |
| Enter Seconds | Seconds value                | Numeric (1-60)         |
| Meridiem      | Choose AM or PM              | DropDown               |

\
**Time Zone converter**&#x20;

This handler serves two purposes:&#x20;

1. Converts datetime (object/string) from a time zone to another timezone.&#x20;
2. Generates a timestamp for a given datetime (object/string).

[Click here to Learn more about configuring the Timezone Converter and examples.](/developers/flows/timezone-converter-handler)

### **Data Type converter**

Converts data from one data type to another (string to integer or integer to string).

| *Parameters* | *Definition*                                                                  | *Type*       |
| ------------ | ----------------------------------------------------------------------------- | ------------ |
| Variable     | Stores the output                                                             | Alphanumeric |
| Value        | Value or variable whose data type has to be converted                         | Alphanumeric |
| Data type    | <p>Data type that the value has to be converted to </p><p>String/ Integer</p> | DropDown     |

### **Current DateTime**

Converts current time to the timezone of selected system.&#x20;

**Available options**

| *Parameters* | *Definition*                               | *Type*       |
| ------------ | ------------------------------------------ | ------------ |
| Variable     | Stores the output                          | Alphanumeric |
| System       | Current time is converted to this timezone | Alphanumeric |

### Pagination

To  send required paginated data for API calls. &#x20;

**Available options**

| *Parameters*      | *Definition*                                                                                                                                                 | *Type*       |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------ |
| Variable          | <p>Output from the handler</p><p>(Part of the data (from input data) as per the number of records mentioned)b</p>                                            | Alphanumeric |
| Response Data     | <p>The input to the handler i.e., the data which needs to divided into smaller arrays. </p><p>Example: response data will be the output from an API call</p> | Alphanumeric |
| Number of records | Number of records the user needs in the output every time                                                                                                    | Numeric      |

### While Loop&#x20;

Loop till specified condition is true. &#x20;

**Available options**

| *Parameters* | *Definition*                          | *Type* |
| ------------ | ------------------------------------- | ------ |
| Condition    | Loop till specified condition is true | JSON   |

### Break

To break a loop. &#x20;

### SFTP Writer

To create files in a remote location using SFTP connection.&#x20;

Prerequisite: Add SFTP Credentials

<table><thead><tr><th width="196.33333333333331">Parameters</th><th width="307.8664058133036">Definition</th><th>Type</th></tr></thead><tbody><tr><td>File</td><td>Existing remote folder location followed by file name Example: /tmp/test/file1.csv</td><td>String</td></tr><tr><td>Data</td><td>Name of variable containing the data to be written</td><td>Alphanumeric</td></tr><tr><td>Character Set</td><td>Encoding character set for the file content</td><td>Drop Down</td></tr></tbody></table>

```
To write CSV files, it should be in one of the below formats:

String:
Name,Branch,Year\nSanchit,COE,2\nHello,IT,1\nThere,CS,5

Array/List:
[['Name', 'Branch', 'Year', 'CGPA'],['Nikhil', 'COE', '2', '9.0'],
        ['Sanchit', 'COE', '2', '9.1'],
        ['Aditya', 'IT', '2', '9.3'],
        ['Sagar', 'SE', '1', '9.5'],
        ['Prateek', 'MCE', '3', '7.8'],
        ['Sahil', 'EP', '2', '9.1']]
```

### SFTP Reader

To read files from a remote location using SFTP connection.&#x20;

Prerequisite: Add SFTP Credentials

<table><thead><tr><th width="196.33333333333331">Parameters</th><th width="307.8664058133036">Definition</th><th>Type</th></tr></thead><tbody><tr><td>File</td><td>Existing remote folder location followed by file name Example: /tmp/test/file1.csv</td><td>String</td></tr><tr><td>Variable</td><td>Name of variable to store the data read from the remote location</td><td>Alphanumeric</td></tr><tr><td>Handle CSV Data</td><td>If yes, provides a list for easy looping and if no, provides raw bytes.</td><td>DropDown</td></tr><tr><td>Character Set</td><td>Decoding character set for the file content</td><td>Drop Down</td></tr></tbody></table>

### FTP Reader

To read files from a remote location using FTP connection.&#x20;

Prerequisite: Add FTP Credentials

<table><thead><tr><th width="238.54499820079164">Parameters</th><th width="307.8664058133036">Definition</th><th>Type</th></tr></thead><tbody><tr><td>File Path</td><td>File path where the new file to be read exists. Example: /testing/</td><td>String</td></tr><tr><td>File name</td><td>Name of the file to be created with extension Example: file1.txt</td><td>String</td></tr><tr><td>Variable</td><td>Name of variable to store the data read from the remote location</td><td>Alphanumeric</td></tr><tr><td>Handle CSV Data</td><td>If yes, provides a list for easy looping and if no, provides raw bytes.</td><td>DropDown</td></tr><tr><td>Character Set</td><td>Decoding character set for the file content</td><td>Drop Down</td></tr></tbody></table>

### FTP Writer

To create files in a remote location using FTP connection.&#x20;

Prerequisite: Add FTP Credentials

<table><thead><tr><th width="238.54499820079164">Parameters</th><th width="307.8664058133036">Definition</th><th>Type</th></tr></thead><tbody><tr><td>File Path</td><td>Existing file path where the new file is to be created Example: /testing/</td><td>String</td></tr><tr><td>File name</td><td>Name of the file to be created with extension Example: file1.txt</td><td>String</td></tr><tr><td>Data</td><td>Name of variable containing the data to be written</td><td>Alphanumeric</td></tr><tr><td>Character Set</td><td>Encoding character set for the file content</td><td>Drop Down</td></tr></tbody></table>

```
To write CSV files, it should be in one of the below formats:

String:
Name,Branch,Year\nSanchit,COE,2\nHello,IT,1\nThere,CS,5

Array/List
[['Name', 'Branch', 'Year', 'CGPA'],['Nikhil', 'COE', '2', '9.0'],
        ['Sanchit', 'COE', '2', '9.1'],
        ['Aditya', 'IT', '2', '9.3'],
        ['Sagar', 'SE', '1', '9.5'],
        ['Prateek', 'MCE', '3', '7.8'],
        ['Sahil', 'EP', '2', '9.1']]
```

### FTP Advanced

Lists files, deletes, renames, moves & changes permission for file and creates directory in the remote location using the established FTP connection

{% hint style="success" %}
**Note:** For root folder, use `/` in the path field
{% endhint %}

#### List files

| Parameters              | Definition                                                                                          | Type         |
| ----------------------- | --------------------------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Choose the action to be performed as list files. By default, the handler lists files.               | DropDown     |
| Path                    | <p>Location from which the list of files and folders are to be listed </p><p>Example: /testing/</p> | String       |
| Variable                | Name of variable to store the list of files and folders from the remote location                    | Alphanumeric |

#### Delete File

| Parameters              | Definition                                                                         | Type         |
| ----------------------- | ---------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Delete File                                                                        | DropDown     |
| Path                    | <p>Location from which file is to be deleted </p><p>Example: /testing/</p>         | String       |
| Variable                | Name of variable to know the status of the action - whether file is deleted or not | Alphanumeric |
| File Name               | <p>Name of the file to be deleted </p><p>Example: file1.txt</p>                    | String       |

#### Rename File

| Parameters              | Definition                                                                         | Type         |
| ----------------------- | ---------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Rename File                                                                        | DropDown     |
| Path                    | Location in which the file to be renamed exists Example: /testing/                 | String       |
| Variable                | Name of variable to know the status of the action - whether file is renamed or not | Alphanumeric |
| File Name               | <p>Name of the file to be renamed </p><p>Example: old.txt</p>                      | String       |
| New File Name           | New name of the file Example: new\.txt                                             | String       |

#### Move File

| Parameters              | Definition                                                                                                           | Type         |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Move File                                                                                                            | DropDown     |
| Path                    | <p>Location in which the file to be moved exists </p><p>Example: /testing/</p>                                       | String       |
| Destination Path        | <p>Location to which the file has to be moved </p><p>Example: /testing/folder/</p>                                   | String       |
| Variable                | Name of variable to know the status of the action - whether file is moved from the source path to destination or not | Alphanumeric |
| File Name               | <p>Name of the file to be moved </p><p>Example: file.txt</p>                                                         | String       |

#### Change Permission

| Parameters              | Definition                                                                                                                                                     | Type         |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Change Permission                                                                                                                                              | DropDown     |
| Path                    | <p>Location in which the file whose permission is to be changed exists </p><p>Example: /testing/</p>                                                           | String       |
| Variable                | Name of variable to know the status of the action - whether file’s permission is changed or not                                                                | Alphanumeric |
| File Name               | Name of the file whose permission is to be changed Example: file1.txt                                                                                          | String       |
| Desired Permission      | The desired permission is given as a three digit number - by default, it is 644 meaning read and write for the owner, read for groups and read for the public. | String       |

#### Create Directory

| Parameters              | Definition                                                                              | Type         |
| ----------------------- | --------------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Create Directory                                                                        | DropDown     |
| Path                    | <p>Location in which directory has to be created </p><p>Example: /testing/</p>          | String       |
| Variable                | Name of variable to know the status of the action - whether directory is created or not | Alphanumeric |
| Directory Name          | Name of the directory to be created                                                     | String       |

### SFTP Advanced

Lists files, deletes, renames, moves & changes permission for file and creates directory in the remote location using the established SFTP connection

{% hint style="success" %}
**Note:** For root folder, use `/` in the path field
{% endhint %}

#### List files

| Parameters              | Definition                                                                                          | Type         |
| ----------------------- | --------------------------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Choose the action to be performed as list files. By default, the handler lists files.               | DropDown     |
| Path                    | <p>Location from which the list of files and folders are to be listed </p><p>Example: /testing/</p> | String       |
| Variable                | Name of variable to store the list of files and folders from the remote location                    | Alphanumeric |

#### Delete File

| Parameters              | Definition                                                                         | Type         |
| ----------------------- | ---------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Delete File                                                                        | DropDown     |
| Path                    | <p>Location from which file is to be deleted </p><p>Example: /testing/</p>         | String       |
| Variable                | Name of variable to know the status of the action - whether file is deleted or not | Alphanumeric |
| File Name               | <p>Name of the file to be deleted </p><p>Example: file1.txt</p>                    | String       |

#### Rename File

| Parameters              | Definition                                                                         | Type         |
| ----------------------- | ---------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Rename File                                                                        | DropDown     |
| Path                    | Location in which the file to be renamed exists Example: /testing/                 | String       |
| Variable                | Name of variable to know the status of the action - whether file is renamed or not | Alphanumeric |
| File Name               | <p>Name of the file to be renamed </p><p>Example: old.txt</p>                      | String       |
| New File Name           | New name of the file Example: new\.txt                                             | String       |

#### Move File

| Parameters              | Definition                                                                                                           | Type         |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Move File                                                                                                            | DropDown     |
| Path                    | <p>Location in which the file to be moved exists </p><p>Example: /testing/</p>                                       | String       |
| Destination Path        | <p>Location to which the file has to be moved </p><p>Example: /testing/folder/</p>                                   | String       |
| Variable                | Name of variable to know the status of the action - whether file is moved from the source path to destination or not | Alphanumeric |
| File Name               | <p>Name of the file to be moved </p><p>Example: file.txt</p>                                                         | String       |

#### Change Permission

| Parameters              | Definition                                                                                                                                                     | Type         |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Change Permission                                                                                                                                              | DropDown     |
| Path                    | <p>Location in which the file whose permission is to be changed exists </p><p>Example: /testing/</p>                                                           | String       |
| Variable                | Name of variable to know the status of the action - whether file’s permission is changed or not                                                                | Alphanumeric |
| File Name               | Name of the file whose permission is to be changed Example: file1.txt                                                                                          | String       |
| Desired Permission      | The desired permission is given as a three digit number - by default, it is 644 meaning read and write for the owner, read for groups and read for the public. | String       |

#### Create Directory

| Parameters              | Definition                                                                              | Type         |
| ----------------------- | --------------------------------------------------------------------------------------- | ------------ |
| What do you want to do? | Create Directory                                                                        | DropDown     |
| Path                    | <p>Location in which directory has to be created </p><p>Example: /testing/</p>          | String       |
| Variable                | Name of variable to know the status of the action - whether directory is created or not | Alphanumeric |
| Directory Name          | Name of the directory to be created                                                     | String       |

### Internal Dynamic Call

To trigger a dynamic pipe from another pipe.

![](/files/2z4IRCbjbXuRbotk3z7c)

a) Dynamic Pipe: Choose the dynamic pipe to trigger from the dropdown list

b) Payload: The payload field is used to send data to the Dynamic Pipe that is being called. This data will be used in the Dynamic pipe to process the associated Flow.&#x20;

c) Response Variable: Once the dynamic pipe is triggered from this handler, a variable will be sent back from the dynamic pipe. The 'Response variable' field will be used to store that response.


# Add New Flow

This section lists the steps that are required to create a new Flow.

To add a new Flow, click on the **Add New** button. <br>

![](/files/-MFAwY9qUSlI0qbA8eov)

The Add Flow page contains three sections:&#x20;

## Flow Setup

Enter the following details to get started with a Flow:

* A suitable Flow Name&#x20;
* A brief description of the Flow&#x20;
* Status toggle On/Off button: To enable or disable the Flow
* Systems:  Displays systems that are configured in the Flow API

#### Add Source Response

Source API fields to display in the Mapping node.&#x20;

For dynamic calls, the user makes a POST call to the DCKAP Integrator API and provides data. When DCKAP Integrator processes this request, the Flow is unaware of the input format since there is no API to get the information. The source data will be provided to the keyword `PAYLOAD` by default and which can be used in Flows further.

To show the fields in the mapping, the user has to provide both source and destination API. However, the user doesn't have a source API, since it is directly provided in `PAYLOAD`. So the user has to provide the source response, which contains the sample template of data that the user is sending (similar to API Manager - Request) and the user has to choose the `SOURCE RESPONSE` option in the source API of mapping node.

![Mapping Handler Configuration](/files/-MFAv0qQOnQ2HUzNqX0i)

#### Import Flows

Choose a JSON file to import the flow. Only exported JSON Flow files can be imported here. This is used to transfer flows from one project to another.

#### Export Flows

Export Flows allows users to save the entire Flow as a JSON file.&#x20;

{% hint style="success" %}
Difference between Save and Save & Merge

After making changes to the Flow

* ***Save*** - if you click on Save, changes will be saved but do not reflect in the pipe
* ***Save & Merge*** - Clicking on Save & Merge, will reflect changes made in the pipe
  {% endhint %}

## Flow Builder

Users can drag and drop the Handlers to the Flow Builder. After the Handlers are placed in the Flow Builder, they are configured by adding parameters and assigning variables.

## Flow Configuration

### Handlers&#x20;

As mentioned earlier, Handlers are code-representation statements that carry out specific functionalities. Examples include API Call, If, Loop, Increment Variable, Initialize Variable, etc.&#x20;

[Learn more](/developers/flows) about handlers.

### Pipes

This tab will display the Pipes that the Flow is linked to.

### Snippets

Snippets are a small section of the Flow, consisting of a block of statements, that are inserted into the Flow as needed.  These typically include commonly used functions and loops, which can be easily included in a large Flow.

For example, the statements inside an IF loop can be composed as one snippet, which can then be used within a larger Flow.  &#x20;

This makes the Flow more readable and avoids repetitive lines of statements.

Snippets can be imported and exported between Flows.&#x20;

The Number of Snippets used in a flow is displayed as shown in the image below:

![](/files/PqsFkkeyHWDkTxbRCPgJ)


# Simulator

![](/files/-M-Syt9NMFV7llwd-9aI)

*We are working on the content for this section. Please come back in some days or reach out to* [*support@dckapintegrator.com*](mailto:support@dckapintegrator.com) *for immediate assistance.*


# Flows: Best Practices

Recommended practices to construct well organized Flows.

A good quality Flow, adhering to these recommended practices will:

* Satisfy the end user's business logic seamlessly
* Produce accurate and precise Flows
* Reduce the risk of errors

## GENERAL

### 1. If, Else handlers after an API call

**Purpose:** To verify the status of the API response.

The response of every API Call returns a dictionary or JSON with keys: `status`, `status_code`, and `response`. A good and recommended practice is to ensure that the `status`and `status_code` values from this response are processed after the API call is made.

Sample Response: `{‘status’: true, ‘status_code’: 200, ‘data’:[]}`

The `status` (true or false) depends on the `status_code` variable. If `status_code`returned is `200`, then the `status`is true, otherwise it is false for all other status codes.

Usually, the If condition is used to verify the `status`, as 'true' or 'false'.

* If `status` = true, it is logged as Success and/or you can proceed with your own logic inside the If condition.
* If `status` = false, it is marked as a Failure and also a static/dynamic message may be logged.

The If condition can also verify the response, based on the 'status code' as: `response[‘status_code’] == 300.`

```python
Create Orders API call to Epicor P21 Custom Server
If specified condition matched
    Increment variable records_passed by value 1
    Log Success message Synchronized
Else
    Log Failure message Invalid Response
```

In this example, in the If condition, the response `status` is evaluated for true or false.

If it is true, it is logged as Success and also the variable, `records_passed` is incremented by 1, to keep track of passing entities. For other status codes, a Failure message is logged.

###

### 2. Try catch inside the Loop Handler

**Purpose:** To catch errors on an item level (inside the loop).

When an error occurs while processing one item in the list, the Try block ensures that the Flow proceeds to execute the synchronization of other items in the list, instead of terminating the entire synchronization.

```python
Loop till specified condition matched
    Try block
    Create Customer API call to Epicor P21 Custom Server
    ....
    Catch Exception
    Log Failure message Some Error Occurred
```

This block of code is written to create customers one by one from a list, from another system. If an error occurs while creating one particular customer (say customer\_X), it will be logged as a Failure;

And since the try-catch handler is used inside the loop, the execution continues to move on to the next item and process it. Eventually, all the customers' information will be synchronized except customer\_X.

{% hint style="danger" %}
&#x20;The Try Catch Handler should be used only inside the loop.
{% endhint %}

### 3. Dashboard Customers and Orders

**Purpose**: To display the total number of customers and total number of orders in the Dashboard screen.

`dashboard_customers` and `dashboard_orders` are two built-in variables which need to incremented within the Flow, in order to display these numbers in the dashboard screen.

```python
Create Orders API call to Epicor P21 Custom Server
If specified condition matched
    Increment variable records_passed by value 1
    Increment variable dashboard_orders by value 1
    Log Success message Synchronized
Else
    Log Failure message Invalid Response
```

These built in variables should be used only to increment new customers and new orders.

In this example, every time the incrementer is executed, the built-in variable, `dashboard_orders`is incremented by 1, thereby increasing the order count and the respective number in the dashboard screen. This incrementer is usually used after an API call in the Flow.

In the same way, the built-in variable `dashboard_customers`is used to keep count of new customers.

Note: These built-in variables are used only to increment new customers and new orders. It should not be used while updating existing customer details or updating inventory.

###

### 4. Return the data if it is a dynamic call

**Purpose:** To return the value of a variable in real-time for a dynamic pipe.

```python
Return value formatted_data
```

A Dynamic pipe, containing a Flow with the above Handler, implies that the variable formatted\_data, which is mapped and prepared by DCKAP Integrator, is returned to the caller when the dynamic call is made.

```python
P21 Get Back Order Detail API call to Epicor P21 Custom Server
If specified condition matched
    Increment variable records_passed by value 1
    Log Success message Customer Fetched
    Return value P21_Res['data']
Else
    Log Failure message Failed
```

&#x20;In this example, a dynamic API call is made to the Epicor P21 Server. And when the specified condition is True, the If block is executed and the data in the variable `P21_Res['data']`is returned in the API response to the caller.

###

### 5. Reasonable variable names

**Purpose**: To easily comprehend the meaning of the Handler and the Flow.

Following are some recommended rules to establish a good variable name:

* Lowercase alphabets separated by an underscore
  * Example: `customer_data`, `order_data`
* It can be alphanumeric, but cannot start with a number
  * Example: `customer_id1`
* Meaningful names over random names are preferred
  * Example: `customer_data`not cust\_dat
* Avoid lengthy names
  * Example: `mailing_address`not address\_to\_ship\_item

## LOGS

### 6. Maintain total records, records processed and records passed count

**Purpose**: To keep track of processed records and also to view the result in the progress bar during the sync process.

Three built-in variables, `total_records`, `records_processed`and `records_passed`are incremented within the Flow and are used in the Step Progress handler to denote the progress of data processed inside a loop.

```python
Increment variable total_records by value 1

Increment variable records_processed by value 1

Increment variable records_passed by value 1
```

Every time these built-in variables are incremented, the progress bar in the Integrations page is updated and the number (`records_processed`out of `total_records`) is displayed as a percentage value, during the sync process.

These variables are used in the Step Progress handler, as follows.

<div align="center"><img src="/files/-LxeqcQxrfshmbdBWn0-" alt=""></div>

###

### 7. Using step level logger inside the Loop handler

**Purpose**: To log item-level errors inside a loop.

The Step Logger handler is used to display short and detailed messages of every processed entity inside the loop. It is usually used in combination with the If and Else handlers in order to log Success and Failure messages.

```python
Loop till specified condition matched
    ....
    If specified condition matched
          Log Success message Synchronized
    Else
          Log Failure message Invalid Response
```

Here, the Loop processes every entity in the list as per the specified condition, say `products_info['data'].` These records are then sent to the If and Else handler to check if the data is valid. If true, then log that entry as "Success"; else log that entry as "Failure".

{% hint style="danger" %}
Step logger should not be used outside the Loop except when you are processing only one record.
{% endhint %}

###

### 8. Use general logger to log only general errors

**Purpose:** To detect any kind of high level errors in the code, outside of the loop.

**Example:**

```python
Get Orders API call to Epicor P21 Custom Server
If specified condition matched
    ....
Else
    Log general message customers
```

In this example, the If handler is used to check for any given condition (say, `status code == 200`). If the condition is not satisfied, the Logger records a failure and it is displayed upon clicking the View button from the Logs page.

{% hint style="danger" %}
&#x20;The recommended practice is to use the Logger outside the loop for overall logging purposes. It should not be used inside the Loop.
{% endhint %}

## OTHERS

### **9. Advanced**

Batch-wise calls like processing group of 10/20 records

### 10. Variable Names for Project and Pipe&#x20;

Project Name and Pipe Name is accessible through a variable in Flows Module namely current\_project, current\_pipe.&#x20;

## WORKAROUND

### 11. Get last synchronized time workaround

**Purpose**: To override the last updated time of the pipe.

```python
Assign last updated time to variable set_sync_time from system Magento 2
Assign value 01-01-2020 00:00:00 to variable set_sync_time
```

This workaround is used when the developer wants to assign a value for the `last updated time` and initiate the sync process from the newly assigned time("set\_sync\_time") onward.


# Flows: Use Cases

![](/files/-M-Syt9NMFV7llwd-9aI)

*We are working on the content for this section. Please come back in some days or reach out to* [*support@dckapintegrator.com*](mailto:support@dckapintegrator.com) *for immediate assistance.*


# Timezone Converter Handler

Handler to convert a given timezone and generate timestamps

This  handler serves two purposes:&#x20;

1. Converts Date & Time (object/string) from one time zone to another timezone.&#x20;
2. Generates a timestamp for a given Date & Time (object/string).

The three options available in this Handler are explained in detail below:

## 1. Timezone Converter

The Timezone Converter converts a date-time input in a particular timezone to any selected timezone. The following tables list down the steps to configure the Timezone Converter Handler for two types of Output:  <br>

| **Output** | **Datetime Object Output**                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Input      | <p><strong>(i) For String Input:</strong></p><p>Select String under the “Enter Date Time” field and give your input.</p><p>Enter Input Date Format for String Input (Refer to the table below).</p><p>Choose From Timezone and To Timezone from the drop-down list.</p><p><strong>(ii) For date-time input:</strong></p><p>Select Non-String under the “Enter Date Time” field and give your input.</p><p>Choose From Timezone and To Timezone from the drop-down list.</p> |

| Output | **2. String Output**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Input  | <p><strong>(i) For String Input:</strong></p><p>Select String under the “Enter Date Time” field and give your input.</p><p>Enter Input Date Format for String Input by referring to the table below.</p><p>Enter Output Date Format for String Output by referring to the table below.</p><p>Choose From Timezone and To Timezone from the drop-down list.</p><p><strong>(ii) For date-time input:</strong></p><p>Select Non-String under the “Enter Date Time” field and give your input.</p><p>Choose From Timezone and To Timezone from the drop-down list.</p> |

## 2. Timestamp Generator

Generate timestamps from a date inputted previously (MM/DD/YYYY) to the entered Date and Time.&#x20;

**(i) For String Input**

* Select String under the “Enter Date Time” field and give your input
* Enter Input Date Format for String Input by referring to the table below
* Choose the input time zone from the drop-down in the “From timezone” field.

**(ii) For date-time input:**

* Select Non-String  under the “Enter Date Time” field and give your input.
* Choose the input time zone from the drop-down in the “From timezone” field.
* Consider this date for example, Saturday, 27 January 2018, 10:30:00.012345 AM +0530

The following formats are supporte&#x64;**:**

| Format | Value    | Description                                |
| ------ | -------- | ------------------------------------------ |
| %d     | 27       | numerical representation of day            |
| %a     | Sat      | short alphabetical representation of day   |
| %A     | Saturday | alphabetical representation of day         |
| %m     | 01       | numerical representation of month          |
| %b     | Jan      | short alphabetical representation of month |
| %B     | January  | alphabetical representation of month       |
| %y     | 18       | short representation of year               |
| %Y     | 2018     | numerical representation of year           |
| %H     | 10       | hour                                       |
| %M     | 30       | minute                                     |
| %f     | 012345   | microseconds                               |
| %p     | AM       | meridiem                                   |
| %z     | +0530    | timezone offset                            |

**Examples for reference**

| Input                           | Format                   |
| ------------------------------- | ------------------------ |
| 2021-05-27 01:30:00 PM          | %Y-%m-%d %H:%M:%S %p     |
| 2021-05-12T09:46:47-0400        | %Y-%m-%dT%H:%M:%S%z      |
| Sat, 27 Jan 2018 17:16:55 +0000 | %a, %d %b %Y %H:%M:%S %z |
| 2018-01-27T13:34:25.518993+0530 | %Y-%m-%dT%H:%M:%S.%f%z   |

## Modifier: Datetime to Timestamp Modifier

This Modifier is used to provide the timestamp starting from \<MM/DD/YYYY> to a given Date & Time input.&#x20;

* Give the input as a string&#x20;
* In the Parameters field, pass the string format using the table&#x20;
* Provide the timezone of the user input

The supported timezone parameters are listed [here: Supported Timezones](/developers/flows/supported-timezones)<br>


# Supported Timezones

List of supported time-zones

**The timezones supported are:**

Asia/Kabul, America/Anchorage, America/Juneau, America/Nome, America/Sitka, America/Yakutat, America/Boa\_Vista, America/Campo\_Grande, America/Cuiaba, America/Eirunepe, America/Manaus, America/Porto\_Velho, America/Rio\_Branco, Asia/Aden, Asia/Baghdad, Asia/Bahrain, Asia/Kuwait, Asia/Qatar, Asia/Riyadh, America/Argentina/Buenos\_Aires, America/Argentina/Catamarca, America/Argentina/Cordoba, America/Argentina/Jujuy, America/Argentina/La\_Rioja, America/Argentina/Mendoza, America/Argentina/Rio\_Gallegos, America/Argentina/Salta, America/Argentina/San\_Juan, America/Argentina/Tucuman, America/Argentina/Ushuaia, Asia/Yerevan, America/Anguilla, America/Antigua, America/Aruba, America/Barbados, America/Blanc-Sablon, America/Curacao, America/Dominica, America/Glace\_Bay, America/Goose\_Bay, America/Grenada, America/Guadeloupe, America/Halifax, America/Kralendijk, America/Lower\_Princes, America/Marigot, America/Martinique, America/Moncton, America/Montserrat, America/Port\_of\_Spain, America/Puerto\_Rico, America/Santo\_Domingo, America/St\_Barthelemy, America/St\_Kitts, America/St\_Lucia, America/St\_Thomas, America/St\_Vincent, America/Thule, America/Tortola, Atlantic/Bermuda, Australia/Adelaide, Australia/Broken\_Hill, Australia/Darwin, Australia/Eucla, Australia/Brisbane, Australia/Currie, Australia/Hobart, Australia/Lindeman, Australia/Melbourne, Australia/Sydney, Antarctica/Casey, Australia/Perth, Asia/Baku, Atlantic/Azores, Asia/Dhaka, Asia/Thimphu, America/La\_Paz, America/Araguaina, America/Bahia, America/Belem, America/Fortaleza, America/Maceio, America/Recife, America/Santarem, America/Sao\_Paulo, Asia/Brunei, Atlantic/Cape\_Verde, Africa/Blantyre, Africa/Bujumbura, Africa/Gaborone, Africa/Harare, Africa/Kigali, Africa/Lubumbashi, Africa/Lusaka, Africa/Maputo, Africa/Algiers, Africa/Ceuta, Africa/Tripoli, Africa/Tunis, Arctic/Longyearbyen, Europe/Amsterdam, Europe/Andorra, Europe/Belgrade, Europe/Berlin, Europe/Bratislava, Europe/Brussels, Europe/Budapest, Europe/Copenhagen, Europe/Gibraltar, Europe/Ljubljana, Europe/Luxembourg, Europe/Madrid, Europe/Malta, Europe/Monaco, Europe/Oslo, Europe/Paris, Europe/Podgorica, Europe/Prague, Europe/Rome, Europe/San\_Marino, Europe/Sarajevo, Europe/Skopje, Europe/Stockholm, Europe/Tirane, Europe/Vaduz, Europe/Vatican, Europe/Vienna, Europe/Warsaw, Europe/Zagreb, Europe/Zurich, Asia/Makassar, America/Bahia\_Banderas, America/Belize, America/Cancun, America/Chicago, America/Costa\_Rica, America/El\_Salvador, America/Guatemala, America/Indiana/Knox, America/Indiana/Tell\_City, America/Managua, America/Matamoros, America/Menominee, America/Merida, America/Mexico\_City, America/Monterrey, America/North\_Dakota/Beulah, America/North\_Dakota/Center, America/North\_Dakota/New\_Salem, America/Rainy\_River, America/Rankin\_Inlet, America/Regina, America/Resolute, America/Swift\_Current, America/Tegucigalpa, America/Winnipeg, Pacific/Guam, Pacific/Saipan, Pacific/Chatham, America/Santiago, Antarctica/Palmer, Asia/Macau, Asia/Shanghai, Asia/Urumqi, Asia/Choibalsan, Indian/Christmas, Pacific/Chuuk, Indian/Cocos, America/Bogota, Pacific/Rarotonga, America/Havana, Antarctica/Davis, Antarctica/DumontDUrville, Africa/Addis\_Ababa, Africa/Asmara, Africa/Dar\_es\_Salaam, Africa/Djibouti, Africa/Juba, Africa/Kampala, Africa/Khartoum, Africa/Mogadishu, Africa/Nairobi, Indian/Antananarivo, Indian/Comoro, Indian/Mayotte, America/Scoresbysund, Asia/Almaty, Asia/Qyzylorda, Asia/Dili, Pacific/Easter, Africa/Cairo, Asia/Amman, Asia/Beirut, Asia/Damascus, Asia/Gaza, Asia/Hebron, Asia/Nicosia, Europe/Athens, Europe/Bucharest, Europe/Chisinau, Europe/Helsinki, Europe/Istanbul, Europe/Kiev, Europe/Mariehamn, Europe/Riga, Europe/Simferopol, Europe/Sofia, Europe/Tallinn, Europe/Uzhgorod, Europe/Vilnius, Europe/Zaporozhye, Asia/Jayapura, America/Atikokan, America/Cayman, America/Detroit, America/Grand\_Turk, America/Indiana/Indianapolis, America/Indiana/Marengo, America/Indiana/Petersburg, America/Indiana/Vevay, America/Indiana/Vincennes, America/Indiana/Winamac, America/Iqaluit, America/Jamaica, America/Kentucky/Louisville, America/Kentucky/Monticello, America/Nassau, America/New\_York, America/Nipigon, America/Panama, America/Pangnirtung, America/Port-au-Prince, America/Thunder\_Bay, America/Toronto, America/Guayaquil, Atlantic/Stanley, America/Noronha, Pacific/Fiji, America/Cayenne, Indian/Kerguelen, America/Fort\_Nelson, America/Punta\_Arenas, Asia/Atyrau, Asia/Barnaul, Asia/Famagusta, Asia/Khandyga, Asia/Tomsk, Asia/Ust-Nera, Asia/Yangon, Europe/Astrakhan, Europe/Busingen, Europe/Kirov, Europe/Saratov, Europe/Ulyanovsk, UTC, Europe/Kaliningrad, Europe/Minsk, Pacific/Galapagos, Pacific/Gambier, Asia/Tbilisi, Pacific/Tarawa, Africa/Abidjan, Africa/Accra, Africa/Bamako, Africa/Banjul, Africa/Bissau, Africa/Conakry, Africa/Dakar, Africa/Freetown, Africa/Lome, Africa/Monrovia, Africa/Nouakchott, Africa/Ouagadougou, Africa/Sao\_Tome, America/Danmarkshavn, Atlantic/Reykjavik, Atlantic/St\_Helena, Europe/Dublin, Europe/Guernsey, Europe/Isle\_of\_Man, Europe/Jersey, Europe/London, Asia/Dubai, Asia/Muscat, America/Guyana, America/Adak, Pacific/Honolulu, Asia/Hong\_Kong, Asia/Hovd, Asia/Colombo, Asia/Kolkata, Indian/Chagos, Asia/Bangkok, Asia/Ho\_Chi\_Minh, Asia/Phnom\_Penh, Asia/Vientiane, Asia/Tehran, Asia/Irkutsk, Asia/Jerusalem, Asia/Tokyo, Asia/Pyongyang, Asia/Seoul, Pacific/Kosrae, Asia/Krasnoyarsk, Asia/Bishkek, Pacific/Kiritimati, Australia/Lord\_Howe, Antarctica/Macquarie, Asia/Anadyr, Asia/Kamchatka, Asia/Magadan, Asia/Kuala\_Lumpur, Asia/Kuching, Indian/Maldives, Pacific/Marquesas, Pacific/Kwajalein, Pacific/Majuro, Indian/Mauritius, Antarctica/Mawson, Europe/Moscow, Europe/Samara, America/Boise, America/Cambridge\_Bay, America/Chihuahua, America/Creston, America/Dawson\_Creek, America/Denver, America/Edmonton, America/Hermosillo, America/Inuvik, America/Mazatlan, America/Ojinaga, America/Phoenix, America/Yellowknife, Pacific/Nauru, Asia/Kathmandu, Pacific/Noumea, Antarctica/McMurdo, Pacific/Auckland, America/St\_Johns, Pacific/Niue, Pacific/Norfolk, Asia/Novokuznetsk, Asia/Novosibirsk, Asia/Omsk, America/Dawson, America/Los\_Angeles, America/Metlakatla, America/Tijuana, America/Vancouver, America/Whitehorse, Asia/Karachi, Pacific/Palau, Pacific/Port\_Moresby, America/Asuncion, America/Lima, Asia/Manila, Pacific/Enderbury, Pacific/Pitcairn, Pacific/Pohnpei, Indian/Reunion, Antarctica/Rothera, America/Miquelon, Asia/Sakhalin, Pacific/Apia, Pacific/Midway, Pacific/Pago\_Pago, Indian/Mahe, Asia/Singapore, Pacific/Guadalcanal, Africa/Johannesburg, Africa/Maseru, Africa/Mbabane, Atlantic/South\_Georgia, America/Paramaribo, Antarctica/Syowa, Pacific/Tahiti, Asia/Taipei, Asia/Dushanbe, Pacific/Fakaofo, Pacific/Tongatapu, Asia/Ashgabat, Pacific/Funafuti, Asia/Ulaanbaatar, America/Montevideo, Asia/Samarkand, Asia/Tashkent, Pacific/Efate, America/Caracas, Asia/Vladivostok, Europe/Volgograd, Antarctica/Vostok, Pacific/Wake, Pacific/Wallis, Africa/Bangui, Africa/Brazzaville, Africa/Douala, Africa/Kinshasa, Africa/Lagos, Africa/Libreville, Africa/Luanda, Africa/Malabo, Africa/Ndjamena, Africa/Niamey, Africa/Porto-Novo, Africa/Windhoek, America/Godthab, Asia/Aqtau, Asia/Aqtobe, Asia/Oral, America/Argentina/San\_Luis, Africa/Casablanca, Africa/El\_Aaiun, Atlantic/Canary, Atlantic/Faroe, Atlantic/Madeira, Europe/Lisbon, Asia/Jakarta, Asia/Pontianak, Asia/Yakutsk, Asia/Yekaterinburg<br>


# API and Mapping

While creating APIs in the API Manager, sample request and response are provided. The keys entered in this sample are reflected in the Source and Destination sections in the Mapping configuration page

### Step 1: API Manager

When an API is created in the API manager, a [system is chosen](/project-manager/systems/api-manager#add-new-api) for the API to be associated with. Also, [sample request and response data](/project-manager/systems/api-manager#request-and-response) are given while creating an API.

For more information, click[ here.](/project-manager/systems/api-manager#request-and-response)

![Selecting System while adding a new API in API Manager](/files/-LwNo6QwZrb4kCqEV52c)

Now let us see how this API gets linked with the Mapping node

### Step 2: Flows - API Call Handler

The API Call Handler is added to the Flow to make an API call to a system. Depending on the system chosen, you can select an associated API from the drop down list. Any newly added API from [here](/project-manager/systems/api-manager#add-new-api) will also be available in the list.

More than one API Call can be added in a Flow.

![](/files/-LwNo6Qxqx5jnQ61iXKj)

![](/files/-LwNo6QyuDxJH6-gQp_b)![](/files/-LwNo6QzgkugdOmXaZxh)

### Step 3: Flows - Mapping Handler

The Mapping Handler is added to link data from a source API to a destination API.

When a Mapping Handler is added to the Flow, you will be choosing two API's (a source and a destination) to map. Note that, only API calls made within the Flow will be available for the user to select from.

![Mapping page showing Source and Destination APIs](/files/-LwNo6Qv30w0jaQBZAWo)

#### Sample Request JSON

```python
{
 "company_id": "string",
 "customer_id": 0,
 "idAlreadyExists": true,
 "id": "string",
 "first_name": "string",
 "last_name": "string",
 "title": "string",
 "direct_phone": "string",
 "email_address": "string",
 "isUpdate": true
}
```

#### Sample Response JSON

```python
{
 "order_no": 225333,
 "shipping_cost": 30.00,
 "status": “paid”,
 "tax": 0,
 "payment_desc": "",
 "shipping_method": "fa",
 "order_date": "2019-10-21T04:13:37.541Z",
 "expiration_date": "2019-10-21T04:13:37.541Z",
 "ship2_name": "Alice",
 "ship2_city": "San Francisco",
 "ship_to_phone": "1234567890",
 "ship2_state": "California",
 "ship2_add1": "",
 "ship2_zip": "94016",
 "name": "Alice",
 "ship2_email_address": "alice@example.com",
 "mail_address1": "Jarvis St.",
 "mail_city": "San Francisco",
 "central_phone_number": "123456790",
 "email_address": "alice@example.com",
 "cancel_flag": false,
 "orderLines": [
 {
 "inv_mast_uid": 2,
 "item_desc": "Plate Set 1",
 "item_id": "QTR12",
 "unit_price": 12.24,
 "extended_price": 0,
 "qty_ordered": 1
 }
 ]
}
```

##

![Choosing APIs in the Mapping Handler](/files/-LwNo6R-tNPrElB64zdB)

### Step 4: Integration Pipes

While adding a new Pipe, you are required to choose System Credentials. Credentials are directly related to a system.

Depending on the Credentials (System) selected, the Flows (with API calls to those systems - Step 2) will be populated in the drop-down list.

![Adding a New Pipe](/files/-LwNo6R0Il10sKHlTxYF)

Depending on the Flow selected, the Mapping nodes will be displayed (only if Mapping handler is added in the Flow - Step 2)

{% hint style="danger" %}
If no Mapping Handler is added in the Flow, Mapping node will not be displayed
{% endhint %}

![Mapping card after Flow is chosen](/files/-LwNo6R1cuPe4t90Fq2g)

### Step 5: Mapping Configuration

Click on Configure. The mapping Configuration window will open.

The Source API fields are populated from its sample **response** and Destination API fields are populated from its sample **request** provided in the API Manager page (From [Step 1](/project-manager/systems/api-manager#step-1-api-manager)).

![Source and Destination APIs in Mapping](/files/-LwNo6R2tJ_8GQGjhsRd)


# 🛠️ Workflow Builder Tutorial

This tutorial will guide you through getting started with DCKAP Integrator and help you build your own workflows step by step. Along the way, you’ll understand the purpose behind each tool, explore simple real-world use cases, and learn optimization suggestions and best practices. Practice in parallel while learning for the best experience. Exercises are provided to help you experiment and build confidence on your own.&#x20;

Wishing you a wonderful learning journey and a great time exploring Workflow Builder! ✨

<br>


# 🚀 1. Project Kickoff

Let’s get started with our first project!

{% stepper %}
{% step %}

### **Create Project**

After logging in to DCKAP Integrator, click on the Create Project button on the landing page.

<figure><img src="/files/lWLlybwdD2bzkQNN2GxF" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### **Enter Project Details**

In the window that appears:

* Enter a unique name for your project (Example: My First Project)
* Click on the Create Project button

<figure><img src="/files/NHzzPvBtpHtJYNP40y7X" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

You can explore additional options later, but these are the basic steps to get started.

#### 🎉 Congratulations! You have successfully created your first project.


# 👋 2. Hello Workflow

Say Hello to your first Workflow!

## Step-by-step guide

Stepper blocks let you break down a tutorial or guide into separate, but clearly linked steps. Each step can contain multiple different blocks, allowing you to add detailed information.

{% stepper %}
{% step %}

### &#x20;Inside a project, go to Workflows

Click on Workflows from the left navigation menu&#x20;

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAAiCAYAAADCp/A1AAAAAXNSR0IArs4c6QAAAxlJREFUWEftlssrfGEYx78jxTTuiQUKYSIzLiVmWEjKwqxtpSzM8OdQwma2sx8bJSX3YjJyW5CiMM2QcStz+fV96miYH3OOOS6LOau3877nvJ/3+zzv93kM4XA4jj/+GDKQOkUoo6ROQkIXJQ8PD7G2tiZM3d3daGho0ItP/pM2ZCwWw+TkJCwWC+LxOA4ODuByuWAwGHQDTQvy+fkZ6+vr2N7eFgUjkQg2NjbQ3t6Orq4u5Obm6gL6JcjHx0dsbm5id3dXwAoKChAOhwUoPz8fd3d3yM7OhtVqRWdnJ4xGY1qwqiBPTk6wsrKCl5cXVFRUgDkYjUZRUlICu90uOfjw8ICsrCwBOj4+lvU3NzcCazabcX5+jpycHPT09KC6uloTtCrI2dlZVFVViUoMJ+EY3vr6+k83S4S12WwCfXV1hZGREf0hZ2ZmUFdXJ3CLi4tobm4WSJPJ9OlmVHd5eRn7+/vo7+9HIBDA6ekpRkdH9YekIvPz8+BNJpgSWt5o5lxeXt6bTZmfVHxvb+/NNwy9w+FAbW2t/pD8o8fjQSgUwtjYGJijq6uruL6+ljxsbGzE5eWl2E5ZWZnkLA/EMXOWUNPT0xKJoaEhTYCafDIRUtklEbatrU180ufzoby8XOBqampegX4NkgS85VNTU2I3HDP/JiYmksz8VyEJ6vf7sbCwIGADAwNoampKCum3Q+7s7GBpaUnCyWrS29ubBOF2u+Xd8PBw0hwdgWnAQ/T19aGlpUVTXqrySdZmWpDik06nM6mKfAR5f38PWpjik2dnZ+D3Wh5VkHNzc6isrJTyx1pdWloqtTmx2/kfJK2L3VEwGBTI29tbXFxcfJ9Per1eFBYWSlk8OjqSml1cXPzamiVCcp4W9b4sUtXBwUGJipZHlZLvf/j09IStrS3JM8IWFRWJSsw5HoRjGndrays6Ojp+psH46NSEZTgJy1tNA+ct5+XSo/tR9v2SkonQvPFK00ufZNM7Pj7+d5peBVaNT2rJwfdr01Yync3VfpuBVKtUqnUZJVMppHY+o6RapVKtyyiZSiG18/8AuAT/4iVhb0wAAAAASUVORK5CYII=" alt="" height="34" width="41">
{% endstep %}

{% step %}

### Add a New Workflow

Click on the Add Workflow button

<figure><img src="/files/Tec7nPRVFfLZm8F2uLbI" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Enter Workflow Details

&#x20;In the window that appears, choose a unique name for your workflow (less than 100 characters) and select the synchronization type — Batch or Dynamic — based on your use case.

<figure><img src="/files/ZBZjYeOud6vVGnvpymNe" alt=""><figcaption></figcaption></figure>

\
To get started, you can give the name of the workflow as “Hello Workflow” and choose Batch Type (Scheduler).
{% endstep %}

{% step %}

### Start Building or Import

* Click Start Building to build the workflow from scratch
* Or click Import Workflow to upload an existing workflow

Let us click Start Building.&#x20;
{% endstep %}
{% endstepper %}

#### 🎉 You are now ready to build your workflow!

<br>


# 2.1 ▶️ Let’s Run Your First Workflow

Now comes the exciting part—running your very first workflow!

{% stepper %}
{% step %}

### 🧩 Add Your First Step

Head over to the Workflow page.\
Here, you’ll see options like Tools and Systems—these are building blocks for your workflow.

For now, let’s keep it simple:

* Choose Console under Tools

💡 What is Console?\
Think of it as a place where you can print or log messages—just like a “Hello World” when learning programming.

<figure><img src="/files/GFNJPOzfjmvh9z6xRJnp" alt=""><figcaption></figcaption></figure>

{% endstep %}

{% step %}

### ✍️ Configure the Step

You’ll see a Message field. Enter **My First Workflow** and Click the ✔ (tick icon) to confirm

✅ What you just did:\
You created a simple step that will log a message when the workflow runs.

<figure><img src="/files/POEGaRjVZGQW5QhoM7ac" alt=""><figcaption></figcaption></figure>

<br>
{% endstep %}

{% step %}

### 💾 Save Your Workflow

Don’t forget to click Save Workflow. This ensures your setup is stored before running it.

<figure><img src="/files/EKdCKAt5JPZWvF1MMyOU" alt=""><figcaption></figcaption></figure>

<br>
{% endstep %}

{% step %}

### ⚙️ Enable Console Logs

Now, let’s make sure you can actually see the output.

* Click Settings (top right)
* Turn ON the Console Log toggle

⚠️ **Common Situation (One-Time Setup Step):**\
You might see a message saying Console Logs are disabled for the project.

<figure><img src="/files/WBC5jm3lB1gudEr58IUS" alt=""><figcaption></figcaption></figure>

👉 Here’s how to fix it:

1. Go to Project Settings (left menu)&#x20;

<figure><img src="/files/2eu2PAMS9dELegug0i9K" alt=""><figcaption></figcaption></figure>

2. Under General Settings, enable Console Logs by choosing Yes
3. Click Save

<figure><img src="/files/VphAMoensw2C5oKg2NIC" alt=""><figcaption></figcaption></figure>

\
Now come back to the Workflow Page by choosing Workflows  from the left navigation menu and Edit your Workflow. Turn ON the Console Log toggle again in Settings.

<figure><img src="/files/ONq46F1A8HsQ1NwJw8Q3" alt=""><figcaption></figcaption></figure>

<br>
{% endstep %}

{% step %}

### ▶️  Run the Workflow

Click Sync Now at the top right.

<figure><img src="/files/vpF5F01W7HLfCBo9Ulmj" alt=""><figcaption></figcaption></figure>

#### 🎉 Hooray! You’ve just run your first workflow!

{% endstep %}

{% step %}

### 🔍 View/Download Your Output

Now let’s check the result. Click View Console.

👉 The button is visible for 10 seconds. Don’t see it now? Click Logs. There, you’ll find the View Console button. Click on it.<br>

<figure><img src="/files/NMXzqS9DRpzb7v8PqNA5" alt=""><figcaption></figcaption></figure>

You have the ability to download the log as well.

✅ **What you should see:**\
Your message: “**My First Workflow**” printed in the console.

<br>
{% endstep %}
{% endstepper %}

<br>


# 2.2📌 Let's Meet Workflow Variables

Variable is a temporary data holder used to store, reuse, and manipulate values during workflow execution. Let’s see it in action using an example.

{% stepper %}
{% step %}

### Initialize Variable

Create a new batch workflow. Initialize variable called name which is a string and give your name as value by clicking on the Initialize Variable button as shown below

<figure><img src="/files/nRV1YH32o9p5fqS2oTQH" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/8fc9oC5uaUd14uxVRzIt" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Configure Console

Add Console Tool. In the message field, type Hello, followed by a space. Then click the Plus icon before Variables in the Data Hub and select name to insert the variable value.

<figure><img src="/files/g9kAwzuPpqObubsWZnzp" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### View Console

In settings, turn on the console logs for the workflow. Run the workflow by clicking on Sync Now Button. Check logs from Logs -> View Console.&#x20;

<figure><img src="/files/xwE6I8HuLYFIsi1sw8ob" alt=""><figcaption></figcaption></figure>

<br>
{% endstep %}
{% endstepper %}


# 🎯 Exercise 1

Objective: Practice initializing JSON variables and using Console logs to access and display values.

#### Activity:

1\. Initialize a JSON array variable called **names**: `["Alice", "Bob", "Carol", "David"]`

2\. Initialize a JSON object variable called **user**: `{"first_name": "John", "last_name": "Doe", "email": "john@example.com"}`

3\. Add Console steps to print greetings and user information using variable references.

#### Hints:

\- To access values from a JSON array, use index notation: `{{variables.names.0}}` for the first item, `{{variables.names.1}}` for the second, and so on.

\- To access values from a JSON object, use the key name: `{{variables.user.first_name}}`, `{{variables.user.last_name}}`, etc.

**Expected Output:**&#x20;

`Hello, Alice!`

`Hello, Bob!`

`Hello, Carol!`

`Hello, David!`

`John Doe — john@example.com`

\
\
\
\ <br>


# 2.3 📧 Let’s Send an Email from Your Workflow

Now that you’ve run a basic workflow, let’s make it more useful by sending an email when it runs.

{% stepper %}
{% step %}

#### 🧩 Add Notification Step

Go to your Workflow and add a new step.

* Choose the Notification Tool.&#x20;

<figure><img src="/files/CCbZsD3iFyF9QnN3b7VA" alt=""><figcaption></figcaption></figure>

💡 **What this does:**\
This step lets your workflow send an email automatically when it runs.
{% endstep %}

{% step %}

#### ✍️ Configure Email Details

Now you’ll fill in a few simple fields:

Send to → Enter your email address

* Example: `<Your mail ID>`
* For multiple recipients, separate emails with commas<br>
* Subject → `Test Mail from DCKAP Integrator`<br>
* Message → `Hi, I am triggered from workflow.`

Click the ✔ (tick icon) to confirm.

<figure><img src="/files/W01xaZQN7gOUeHejhLXW" alt=""><figcaption></figcaption></figure>

{% endstep %}

{% step %}

### 💾 Save Your Workflow

Click Save to store your Workflow changes.

{% endstep %}

{% step %}

### ▶️ Run the Workflow

Click Sync Now.

{% endstep %}

{% step %}

### 📬 Check Your Email

Open your inbox.

✅ What you should see:\
An email with:

* Subject: `Test Mail from DCKAP Integrator`
* Message: `Hi, I am triggered from workflow.`

If you don’t see the email, check your **Spam/Junk** folder
{% endstep %}
{% endstepper %}

#### 🎉 Summary

You’ve just learned how to:

* Add an email step to a workflow
* Configure recipients and message
* Trigger real-time email notifications


# 2.4🔖Let's Transform Data Inline

{% stepper %}
{% step %}

#### Initialize a Variable

In the same workflow, let’s initialize a variable with the following details:&#x20;

| Variable      | Type | Value                                                           |
| ------------- | ---- | --------------------------------------------------------------- |
| emails        | JSON | `["<Add your company mail ID>", "<Add your personal mail ID>"]` |
| {% endstep %} |      |                                                                 |

{% step %}

#### Use Inline Transformation

* Edit the Notification step
* In the **Send To** field:
* Select the emails variable from Data Hub

👉 Now, instead of using it directly, apply transformation:

`{{variables.emails.join(",")}}`

📌 Why?

* The system expects comma-separated emails
* But our variable is a JSON array
* `.join(",")` converts it into the required format

<figure><img src="/files/W01xaZQN7gOUeHejhLXW" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Run and Verify

* Save the workflow
* Click Sync Now&#x20;
* Check your inbox
  {% endstep %}
  {% endstepper %}

#### 🎉 Congratulations, you have successfully experimented with an inline transformation.

To explore more, check [Inline Transformations](https://docs.dckapintegrator.com/project-manager/workflows/inline-transformations) and [Allowed Functions in Inline Transformation](https://docs.dckapintegrator.com/project-manager/workflows/inline-transformations/allowed-functions) with [examples](https://docs.dckapintegrator.com/project-manager/workflows/inline-transformations/examples).

<br>


# 🎯 Exercise 2

Objective: Practice using inline transformations to manipulate and format data directly within a step — without using a separate Formatter or Code Runner tool.

**Activity:**

Initialize a JSON object variable called customer:

json

`{`

&#x20; `"first_name": "alice",`

&#x20; `"last_name": "johnson",`

&#x20; `"email": "  alice.johnson@example.com  ",`

&#x20; `"score": "42.5"`

`}`

Using inline transformations, add Console steps to display the following:

1. The customer's first name in uppercase
2. The customer's full name in title case
3. The email after removing leading and trailing spaces
4. The score converted to an integer
5. A fallback value — Try converting to lower customer’s city; for fallback case, display "`City Not Available`"

**Hints:**&#x20;

* [Allowed functions](https://docs.dckapintegrator.com/project-manager/workflows/inline-transformations/allowed-functions)

**Expected Output:**

`ALICE`

`Alice Johnson`

`alice.johnson@example.com`

`42`

`City Not Available`

<br>

<br>

<br>


# 2.5 🧠 Let’s Make Our Workflow Repeat and Think

Let’s build smarter workflows with logic.

**Scenario:** From a given array of emails, print individually if an email ends with [gmail.com](http://gmail.com) or [yahoo.com](http://yahoo.com) or not.

{% stepper %}
{% step %}

### Initialize Variable

Create a New Batch Workflow. Assume you have an array of emails. Let’s initialize a variable with the following details:&#x20;

| emails | JSON | \["<abc@gmail.com>", "<def@gmail.com>", "<xyz@company.com>", "<ijk@yahoo.com>"] |
| ------ | ---- | ------------------------------------------------------------------------------- |

***

{% endstep %}

{% step %}

### Loop through the JSON Array

Add a loop tool to iterate through the JSON Array. By default, loop through values is selected as loop type which is for loop iterating through all values. In iterable, choose from Data Hub, variables -> emails.

<figure><img src="/files/3F8AcR2AfbqoH7YTd1Om" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Configure Decision Step

Add a decision step inside the loop. The Decision step works like a conditional ladder — if a condition is met, that pathway runs; otherwise it checks the next condition, and so on until the else pathway. We have the ability to configure a title for each pathway. Let us have Option A for filtering emails ending with [gmail.com](http://gmail.com), option B for filtering emails ending with Ending with [yahoo.com](http://yahoo.com) and an else pathway. For each pathway to be executed, configure the condition to satisfy as shown below.

<figure><img src="/files/2XbdqWcv8vpea6botW6k" alt=""><figcaption></figcaption></figure>

If your use case demands a complex/nested condition, you can use the plus icon.

<br>
{% endstep %}

{% step %}

### Add a Console for Option A

Click on Option A of Decision Step and add a Console. The current item being considered in the iteration is accessible in the Data Hub’s item when clicking plus icon before loop.&#x20;

<figure><img src="/files/UIklIkDs7h1yI0FF67bV" alt=""><figcaption></figcaption></figure>

Configure the message as {{1.item}} ends with [gmail.com](http://gmail.com)
{% endstep %}

{% step %}

### Add a Console for Option B

For Option B, add a console with message, {{1.item}} ends with [yahoo.com](http://yahoo.com) and for else pathway, add a console with message - {{1.item}} does not end with [gmail.com](http://gmail.com)  and [yahoo.com](http://yahoo.com)
{% endstep %}

{% step %}

### Save and Run

Enable console logs and save the workflow and run. Check logs.

<figure><img src="/files/rzMJ0HTxdIaXA3uKMle3" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

#### 🎉 You have successfully used Loop and Decision together in a workflow!

<br>




---

[Next Page](/llms-full.txt/1)

