Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Controls
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Guides to Configuring OAuth2 Applications
A universal guide outlining the common steps involved in setting up any OAuth2 application, including registering your application, obtaining client credentials, and defining redirect URIs.
https://www.activecampaign.com/
Sign-in to to your ActiveCampaign account. Once you are logged in, locate the "Settings" option. This can be found in the bottom left corner of the homepage.
Within the settings page, you will see a section labeled 'Developer'. Click on this section to navigate to the Developer page. On the 'Developer' page, you will see your API URL and your API key. 
use the API Key to authenticate ActiveCampaign components in the Appmixer Designer. 
To authenticate with AWS services Lambda, S3, and SNS, you need to provide Access Key Id and Secret Access Key. You can create a new user in the AWS IAM console (https://console.aws.amazon.com/iam/home) and assign the necessary permissions to that user.
The neccessary permissions depend on the services and components you want to use. For example, if you want to use the New S3 Object component, you need to assign the AmazonS3ReadOnlyAccess policy to your user. If you want to use the Send SNS Message component, you need to assign the AmazonSNSFullAccess policy.
Sign up with Airtable:
Specify Table name
Now the Airtable workspace/base is prepared. Let's configure the OAuth app.
The last step is to configure clientId and clientSecret in the Appmixer Backoffice for appmixer:airtable
https://platform.claude.com
The Anthropic Claude connector (AI > Anthropic Claude: AI Agent, Send Prompt, Transform Text to JSON, List Models, Make API Call) authenticates with an Anthropic API key. Each user enters their own key when connecting an account in the Designer, so there is no app to register with Anthropic.
Sign in to the Claude Console at (formerly console.anthropic.com). Create an account if you do not have one.
Open Settings > API keys ().
Create an Arcmira API key and connect the Appmixer Arcmira connector.
The Appmixer Arcmira connector (Find Transcripts, Resolve Entity, Make API Call) uses API key authentication. You do not need to register an OAuth app with Arcmira. Each user creates an API key in their Arcmira account and enters it when they connect Arcmira in Appmixer.
Sign in to Arcmira. Create an account if you do not have one. New accounts start on the Free plan.
Open Dashboard → API keys.
Click Create key.
Copy the key. It starts with arc_sk_. Arcmira shows the secret only once, so store it somewhere safe.
Dashboard keys carry the scopes read, monitors:write, trackers:write and recommendations:read. Find Transcripts and Resolve Entity only need read. Make API Call can also change monitors and trackers, as far as the key's scopes allow.
Arcmira also lets you get a key without a browser, through its sign-up API. See in the Arcmira documentation.
When you add an Arcmira component to a flow, Appmixer asks you to connect an account. Paste the key into the API Key field.
Appmixer sends the key as a bearer token (Authorization: Bearer <key>) to https://api.arcmira.com/v1. To check the key, it calls GET /v1/me, which is free and works even when the account has no credits left. The connection is named after the masked email of the key's owner (or the key label). For a team account, the team name is shown in front of it.
Make API Call only sends requests to https://api.arcmira.com/v1. It rejects other hosts, so the key is never sent anywhere else.
Arcmira limits requests per API key in a 60-second window: 60 on the Free plan, 240 on paid plans and 600 on Enterprise. The connector queues requests to stay at 60 requests per 60 seconds per connected account, so it stays under the limit on every plan.
401 when connecting: check that you copied the whole key (arc_sk_…) and that it has not been disabled on the API keys page.
402 errors when running a flow: the account has run out of credits or reached its on-demand budget. Check the plan and usage in the Arcmira dashboard.
403 insufficient_scope from Make API Call: the key does not have the scope that the request needs (for example monitors:write
Configuration ID: appmixer:arcmira. For how to set connector configuration values, see .
You do not need any Backoffice configuration to authenticate, because every user enters their own API key. There is one optional key:
outputFilePrefix: optional. A prefix for the names of CSV files created when Find Transcripts runs with the Store to CSV file output type. Files are named <prefix>-<component label in the flow>.csv. The default is arcmira-objects-export.
Sign up with Asana: https://app.asana.com
To create an OAuth app with Asana, follow the oficial documentation: https://developers.asana.com/docs/oauth#register-an-application.
Take note of the application's client ID and the client secret (which should be protected as a password)
You will need to specify the App name and Redirect URL in this step.
The App name can be anything you want.
The Redirect URL should be the URL where Asana will redirect the user after they authorize your app. This depends on your environment, usually in the following format: https://api.qa.appmixer.com/auth/asana/callback
clientId and clientSecret into Appmixer Backoffice.The last step is to configure clientId and clientSecret in the Appmixer Backoffice for appmixer:asana
HTML to JSON Converter
Description Convert an HTML table file into a JSON file.
Input Parameters
fileId (string) - The ID of the file to be converted.
Output Parameters
fileId (string) - The ID of the newly created JSON file.
fileName (string) - The name of the converted JSON file.
XLSX2JSON Component
Description: Convert an XLSX (Excel 2007+ XML format) file to JSON.
Input Parameters:
fileId (string, required): The ID of the file to be converted.
Output Parameters:
fileId (string): The unique ID of the converted JSON file.
fileName (string): The name of the generated JSON file.
Configure the Jotform.
Go to the JotForm website.
Log in with your JotForm account credentials.
Navigate to Account Settings: Click on your avatar/initials in the top right corner of the page. Choose "Settings" from the dropdown menu. Or go directly to the https://jotform.com/myaccount/api
Here, you might see a list of existing API keys if you've created any before. To generate a new one, click the “Create New Key” button

In the authentication pop-up enter your API key.









Sign up with Mailchimp: https://mailchimp.com/
Now you need to add an OAuth application. Navigate to: Profile > Extras > Registered apps.


Click on the "Register an app" button.

Now save the OAuth client and copy the client ID and secret. You will need them later.

clientId, clientSecret and subdomain into Appmixer Backoffice.The last step is to configure clientId and clientSecret in the Appmixer Backoffice for appmixer:mailchimp connector.

To authenticate Imperva connector, an API Key is required. To obtain this key, log in to your Imperva account and navigate to Account > My Profile > API Keys. Click on "Add API Key" to generate a new key. Enter a name (and optionally otherparameters) for the API Key and click on "Create".

Take note of the API ID and API Key. You will need these to authenticate the connector.

You can also view the API Key details in the API Keys section.

In the Imperva connector authentication window, use your Imperva API ID and API Key to log in.

There are three optional configuration parameters for the SetBlockIPRule action of the Imperva connector. See the table below for more information.
blockIpMaxIpsPerRule
No
20
The maximum number of IP addresses that can be added to a block rule.
blockIpMaxParallelRequests
No
5
The maximum number of parallel requests that can be made to block IP addresses.
blockIpMaxRulesInImperva
No
500
The maximum number of custom rules that can be added to Imperva. See https://docs.imperva.com/bundle/cloud-application-security/page/rules/create-rule.htm
https://platform.openai.com
OpenAI Account: The first thing you need to do is have an OpenAI account. You can sign up for free.
After signing up, go to https://platform.openai.com/api-keys.
Create a New API Key: You would find a button or link labeled "Create a new key" or "Generate API keys". Click on it.
Keep this key safe and secure. It should not be shared with anyone or exposed in client-side code, as it could be used to misuse your OpenAI services.
use the API Key to authenticate OpenAI components in the Appmixer Designer. 

In order to offer the Azure Cognitive Services components to your customers, you have to set an Azure key and endpoint through the Backoffice first.


Sign up with Pipedrive: https://www.pipedrive.com
Navigate to My Account -> Personal Preferences -> API. Copy the API token.

Use the copied token as apiKey when connecting Pipedrive components in Appmixer.
Sign up with Monday: https://auth.monday.com/users/sign_up_new
Navigate to your Monday Developer Center -> My access tokens. Create a new token and copy it.


Use the copied token as apiKey when connecting Monday components in Appmixer.
Cloudflare WAF integrations allows you to actively block attacker IP by using Cloudflare WAF infrastructure.
Cloudflare WAF connector support authentication via Account API Token or User API Token
To create the Account API Token, go to the Manage Accounts > Account API Tokens, click on "Create Token". On the next screen, select the "Create Custom Token" option.
Name the token and select the permission:
Account | Rule Rulesets | Edit

To create the User API Token, go to the Profile > API Tokens, click on "Create Token". On the next screen, select the "Create Custom Token" option.
Name the token and select the permission:
Account | Rule Rulesets | Edit
In the Cloudflare connector authentication window, use your API Token to log in.
Go to the Apps and Keys page (you can also get there from the Docs)

Add a new app:

Get the ClientId, ClientSecret and set the redirect URI:
clientId: Integration Key
clientSecret: Secret Keys
set the Redirect URI to https://[YOUR_API_BASE]/auth/docusign/callback, for example https://api.appmixer.com/auth/docusign/callback

And set the clientId, clientSecret to the service configuration in the Backoffice.
Log in to your Schoology server. Look at the top navigation bar and go to Tools > School Management.
In the new screen, click on Integrations in the left menu. Now click on the API tab. You should see your consumer key and secret. The secret is hidden, so you have to use the Reveal Existing Secret option.

Log into the Backoffice and go to the Services section. Add a new service configuration named appmixer:schoology. After it is created, add the following configuration values:

Here is the explanation for each value:
baseUrl: The API base URL. Usually is https://api.schoology.com/v1, but there are some cases where it could be different.
consumerKey and consumerSecret: The consumer key and secret we got from the Schoology server.
domain: The subdomain part from your server. For example, if your server URL is https://example.schoology.com, then the domain value is just an example.
You will need to create a new Redmine installation. Go to https://www.redmine.org/projects/redmine/wiki/RedmineInstall and follow the instructions. Alternatively, you can use a Docker image: https://hub.docker.com/_/redmine or a hosted solution.
Once you have your Redmine application make sure you have the REST API enabled. Go to Administration -> Settings -> API and check the "Enable REST web service" option.

After that, you will need to create a new API key. Go to Administration -> Users -> Edit user and create a new API key.

You will enter this API key and also the URL of your Redmine installation in when connecting each Redmine component.

Sign up with Freshdesk: https://www.freshdesk.com
Navigate to Profile Settings -> API. Copy the API token on the right side. If you don't see the API key, please refer to the Freshdesk documentation for more information.

Use the copied token as API key along with Domain when connecting Freshdesk components in Appmixer. In this example the domain is acme-help and the API key is the copied token.

Unfortunately, since August 20, 2018 Highrise no longer accepts signups.

We keep the module in Appmixer for the older customers who have their Oauth2 application. If you are a new Appmixer customer, you won't be able to create the OAuth2 application and therefore use the Highrise module. In that case, you should remove it from the platform.
Requests to the Highrise API contain headers with User-Agent property. This is set by default to Appmixer, but it can be overwritten using Backoffice:

Appmixer offers a built-in component for taking Screenshots.

It uses https://screenshotapi.net/ API. If you want to have this module on the platform you have to create your own Screenshot account and set the API token in the Backoffice.

When creating Typeform Oauth2 application (https://admin.typeform.com/account#/section/apps), you can choose between access tokens that do expire in a week and access tokens that do not expire.

The token expiration is new in Typeform. Appmixer components before version 4.2 cannot handle it.
If you're registering the Oauth application for version 4.2 or newer, you can decide if you want to use tokens that do expire or not. If you decide to go with Unlimited then you don't have to set anything in the Backoffice, it is the default behavior. On the other hand, if you want to use tokens that expire, you have to go to the Backoffice and set the useRefreshToken to true for the appmixer:typeform service.

Then you can use the One Week configuration.

Since version 4.2.1 you can configure the string that appears on the Trallo Oauth page.


If you don't do this, the Oauth page will show Appmixer by default.
appmixer.utils.ai
Appmixer AI utilities allows you to introduce AI functionality in your integrations, automations or simply extend your product with AI capabilities via Appmixer's No-Code Studio.


After installing the appmixer.utils.ai module, go to the Backoffice to configure the OpenAI apiKey for the module:


Additionally, you can also override the default OpenAI models for the SendPrompt (default is "gpt-4o") and GenerateImage (default is "dall-e-3") components:\

https://twilio.com
First, you'll need to create an account on the Twilio website.
After signing up, go to https://console.twilio.com/
Copy the Account SID and Auth Token from the "Account Info". Alternatively you can navigate to the "API Keys & Tokens" section, SID and Auth Token are available there. 
use the Auth Token and Account Token to authenticate the Twilio components in the Appmixer Designer. 
Overview
The HTML to CSV Converter component allows you to transform an HTML table file into a CSV format. This is useful for extracting structured data from HTML documents into a tabular format.
Input Parameters
fileId
string
✅
The ID of the HTML file to convert.
Output Parameters
fileId
string
The unique ID of the converted file.
fileName
string
The name of the generated CSV file.
Instructions
Select the HTML File:
Provide the fileId of the HTML document that contains a table.
Processing:
The component extracts the table data from the HTML file and converts it into a structured CSV format.
Retrieve Output:
The component returns a new file with fileId and fileName in CSV format.
You'll need a Snowflake account. If you don't have one, you can sign up for a free trial on the Snowflake website.
You will need the following details to connect to your Snowflake database:
Account Name: This is often part of your Snowflake URL. You can find it in the Snowflake web interface after logging into your account.
Username: The username of the Snowflake user account you wish to use.
Password: The password for that Snowflake user.
Database Name: The name of the database you want to connect to.
Warehouse: The name of the virtual warehouse to use for running queries.
Account:
Your account identifier is usually part of your Snowflake URL.
When you log into Snowflake, the URL looks like https: //abc12345.us-east-1.snowflakecomputing.com.
Here, abc12345.us-east-1 is your account identifier.
Username and Password:
The credentials you use to log into the Snowflake web interface.
Database and Warehouse:
After logging into Snowflake, navigate to the Databases and Warehouses tabs to see available options.
Choose the appropriate database and warehouse for your needs.
The Appmixer Azure DevOps connector uses Microsoft Entra ID (Azure AD) OAuth 2.0 for authentication. You need to register an application in the Azure portal.
Go to the Azure portal - App registrations and click + New registration.
Name: A name for your application (e.g. "Appmixer Azure DevOps").
Supported account types: Select Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant).
Redirect URI: Select Web and set it to your Appmixer callback URL, e.g. https://api.YOUR_SUBDOMAIN.appmixer.cloud/auth/azuredevops/callback.
Click Register.
After registration, you will be taken to the app's Overview page. Copy the Application (client) ID - this is your clientId.
In the left menu, go to Certificates & secrets.
Click + New client secret.
Add a description and select an expiration period (use the longest available).
Click Add.
Copy the Value of the newly created secret immediately - this is your clientSecret. It will not be shown again.
In the left menu, go to API permissions.
Click + Add a permission.
Select Azure DevOps.
Select Delegated permissions.
Check user_impersonation.
Click Add permissions.
The final set of permissions should include:
user_impersonation
Delegated
Azure DevOps - Full access
Go to the Connector Configuration section in the Appmixer Backoffice. Find or add the appmixer:azuredevops connector and set the following values:
clientId: The Application (client) ID from the Azure portal.
clientSecret: The Client Secret Value from the Azure portal.
The SetVariable Component assigns variables dynamically based on input type and value. It allows storing values in various formats such as text, numbers, dates, booleans, and files.
in
Accepts an object containing variables and their values.
out
Emits the assigned variables as an object.
Text (text) – Stores a string value.
Textarea (textarea) – Stores a longer text value.
Number (number) – Stores a numeric value.
Date-Time (date-time) – Stores a date and time.
Boolean (toggle) – Stores a true/false value.
File (filepicker) – Stores a selected file reference.
Provide Variables
Send an object containing variable names, types, and values to the in port.
Processing Variables
The component assigns the variables dynamically based on their types.
Retrieve Output
The processed variables are sent as an object through the out port.
Flexible Variable Storage: Supports multiple data types for dynamic variable assignments.
Useful for Workflow Automation: Allows temporary storage of values for later processing.
Outputs in Key-Value Format: The output is structured as an object containing assigned values.
Convert a CSV file to XLSX (Excel 2007+ XML Format).
fileId
string
✅
The ID of the file to convert.
fileId
string
The unique ID of the converted XLSX file.
fileName
string
The name of the converted file.
Provide File ID:
Select the CSV file to be converted using its fileId.
Processing:
The component processes the file and converts it into an XLSX format.
Retrieve Output:
The converted file is returned with a fileId and fileName for further use.
The OnStart Component is a trigger that fires once when the flow starts. It emits a timestamp indicating when the flow was initiated.
out
Fires when the flow starts, providing the start time.
out Portstarted
The timestamp (ISO 8601 format) indicating when the flow started.
Automatic Trigger
The component automatically fires when the flow begins execution.
Start Time Emission
Outputs a started timestamp that can be used for logging, tracking, or scheduling purposes.
One-Time Execution: Triggers only once per flow execution.
Useful for Logging: Can be used to capture flow start times for analytics or debugging purposes.
The DataUri2File component converts a Data URI into a file. It extracts the file content and metadata from the Data URI and generates a downloadable file.
dataUri
string
✅
A Data URI representation of a file.
fileName
string
❌
The desired name of the output file. If omitted, a default name (result.[EXT]) is assigned based on the file type.
fileId
string
The unique ID of the generated file.
fileName
string
The name of the resulting file.
Provide a Data URI
Input a valid Data URI string that represents a file.
Specify a File Name (Optional)
Enter a desired file name with or without an extension.
If omitted, the extension is inferred from the file type.
Processing
The component extracts the file content from the Data URI and saves it as a downloadable file.
Returns the fileId and fileName of the newly created file.
The Counter Component maintains an internal counter that increments with each received message. It can also be reset to a specified value.
count
number
The initial counter value (default: 0).
increment
number
The amount by which the counter increments (default: 1, can be negative for decrement).
item
Triggers the counter increment.
reset
Resets the counter to a specified value or its initial value if not provided.
count
Emits the updated counter value after each increment.
Set Initial Value and Increment
Configure the count parameter for the starting value.
Set increment to define how much the counter increases or decreases.
Increment Behavior
Each time a message arrives at the item port, the counter increases by the increment value.
Reset Counter
Sending a message to the reset port resets the counter to the specified value or its initial value if no value is provided.
Supports both increment and decrement operations.
State is maintained: The counter retains its value across executions until reset.
Useful for tracking counts in loops, event occurrences, or rate-limiting scenarios.
Click Create Key, give the key a name and select the workspace it belongs to.
Copy the key (it starts with sk-ant-). It is shown only once.
In the Appmixer Designer, connect an Anthropic Claude account and paste the key into the API Key field. Appmixer validates the key by listing the available models.
The API is billed per usage: the organization needs credits or a billing plan in Settings > Billing, otherwise the API calls fail.
No Backoffice configuration is required. The connector reads two optional keys that tune its behavior.
Configuration ID: appmixer:ai:claude. See Connector Configuration for how to set it.
listModelsCacheTTL – optional. How long, in milliseconds, the list of models (used by the model selector of the components) stays cached. Default: 3600000 (1 hour).
AI_AGENT_TOOL_MAX_ITEMS – optional. When a component connected to the tool port of the AI Agent outputs several messages, the next component in the tool chain runs for at most this many of them; the rest are dropped and the truncation is logged. Default: 50.
https://console.mistral.ai
The Mistral AI connector (AI > Mistral AI: Send Prompt, Describe Images, Generate Embeddings, Extract Document Text, Create Transcription, Create Speech, Moderate, List Models, List Voices, Make API Call) authenticates with a Mistral API key. Each user enters their own key when they connect an account in the Designer, so you do not need to register an app with Mistral.
Sign in to Mistral AI Studio at console.mistral.ai. Create an account if you do not have one.
In the left sidebar, open API Keys.
Click Create new key.
Enter a Name for the key and set an Expiration date. Choose any Connector access scope. The scope only controls access to Mistral's own Connectors, and the Appmixer connector does not use them.
Click Create new key and copy the key. Mistral shows the full key only once.
In the Appmixer Designer, connect a Mistral AI account and paste the key into the API Key field. Appmixer checks the key by listing the available models.
New accounts start in Free mode. Free mode gives API access without a credit card, but usage and rate limits apply. For production use, choose a paid plan in Studio. Requests over the workspace limits fail with rate-limit errors.
You do not need any Backoffice configuration. The connector reads one optional key that changes how it caches lists.
Configuration ID: appmixer:ai:mistral. See Connector Configuration for how to set it.
listCacheTTL – optional. How long, in milliseconds, the connector caches the model list and the voice list (used by List Models, List Voices and the model and voice selectors in the components). Each API key has its own cache. Default: 120000 (2 minutes).
appmixer service-config set appmixer:arcmira -u -d '{"outputFilePrefix": "arcmira-objects-export"}'appmixer service-config set appmixer:ai:claude -u -d '{
"listModelsCacheTTL": 3600000,
"AI_AGENT_TOOL_MAX_ITEMS": 50
}'appmixer service-config set appmixer:ai:mistral -u -d '{
"listCacheTTL": 120000
}'The first thing you need is an app created in the developer portal. Navigate to https://developer.blackboard.com and signup for an account. When you are logged in, you can see a dashboard with a list of your applications and a button to create a new one:

Note that listed applications have an Application ID. We will need it when we register our application in the blackboard instance. Click on the + button to create a new application. A simple form appears with your Application name and description inputs, and a domains input, for your domains. After you fill in the fields, create the new application.
Log in with admin privileges, and go to the System Admin tab in the top menu. After that, look under Integrations for REST API Integrations:

Next, you will see a list with all your API Integrations. Click on Create Integration to add a new one:

After that, you will show a small form. One of the inputs is the Application ID which as we showed in the first step, is available in the applications list at the developer portal. Next, browse and select a user. We recommend using the same user you are logged in with. On the End User Access and Authorized To Act As User, select Yes in both options. After that click on Submit to finish the registration.
Finally, we need to set the OAuth clientId and clientSecret in the to finish the integration. To obtain these values, go to the applications list in the developer portal. Find your application and click on the 3 dots at the end of the row. Then click on the Manage Keys option:
After you will see a list of your application keys. Click on the + sign to create a new key. Your key will be created and its information will be shown to you:
Be sure to store this information somewhere safe, as you won't be able to get it again.
Next, log into the Backoffice and go to Services. Next create a configuration for appmixer:blackboard. Finally, add your Application ID as clientId and Secret as clientSecret. Also set serverUrl to your instance URL:
And you are done! You are ready to use the Blackboard module.
Cloudflare List Integrations allow you to manage IP lists efficiently. You can add or remove IPs from Cloudflare IP Lists and specify the TTL (Time To Live), which automatically removes the IP after a set time period.
You can access custom lists in your Cloudflare account by navigating to Manage Account > Configurations > Lists. Cloudflare Lists connector only supports IP lists.

Cloudflare Lists connector support authentication via Account API Token, User API Token, or Global API Key (deprecated).
To create the Account API Token, go to the Manage Accounts > Account API Tokens, click on "Create Token". On the next screen, select the "Create Custom Token" option.
Name the token and select the permission:
Account | Account Filter Lists | Edit

To create the User API Token, go to the Profile > API Tokens, click on "Create Token". On the next screen, select the "Create Custom Token" option.
Name the token and select the permission:
Account | Account Filter Lists | Edit
My Profile > API Tokens. Click on "View" to get the token:
In the Cloudflare connector authentication window, use your Cloudflare account email and the Global API Key or your API Token to log in. Please note that when you use the API Token (User or Account), don't enter the email, just leave the email input empty.
Configure the Dropbox.
Open the Dropbox App Console.
Log in with your Dropbox account credentials.

Set the Redirect URI to https://[YOUR_API_BASE]/auth/dropbox/callback, for example https://api.appmixer.com/auth/dropbox/callback
To allow additional users, click on "Enable Additional Users.
Configure the App Key as clientId and the App Secret as clientSecret in the service settings within the Backoffice, under the configuration ID appmixer:dropbox.
To learn more about configuring connectors, please visit the Connector Configuration section.
Ensure that the following permissions are selected:
account_info.read
files.content.read
files.content.write
files.metadata.read
Visit https://developers.facebook.com/ and create a new OAuth application (or use your existing one).
Add Facebook Login for Business and Marketing API products.\

Copy the App ID and App Secret a and paste it to your Appmixer Backoffice -> Connector Configuration page under the appmixer:facebookbusiness configuration ID as clientId and clientSecret, respectively:\
Add your Appmixer tenant domains as your App domains:\
Note: replace YOUR_TENANT with the name of your hosted tenant. If you're a customer on an Appmixer Self-Managed plan, you can have a completely custom domains that Appmixer runs on. Use your own domains instead.
Set the OAuth redirect URI under Facebook Login for Business / Settings to https://api.YOUR_TENANT.appmixer.cloud/auth/facebookbusiness/callback:\
https://linkedin.com
You need to start by creating a new app on the LinkedIn Developer platform. Visit https://developer.linkedin.com/ and log into your account. Once logged in, navigate to "MyApps", then click on "Create App". Fill in all necessary information like app name, app logo, app description, app privacy policy URL etc. You also need to fill the "Associated LinkedIn page". This is the LinkedIn page that will be associated with the app. If you don't have a LinkedIn page, you can create one by clicking on the "Create a LinkedIn Page" link.
Navigate to the "Auth" section where you will find OAuth 2.0 settings. Here, you can set the "Authorized Redirect URLs". Take note of the application's client ID and the client secret (which should be protected as a password)
You will need to specify the Redirect URL in this step.
The Redirect URL should be the URL where LinkedIn will redirect the user after they authorize your app. This depends on your environment, usually in the following format: https://api.ACME.com/auth/linkedin/callback
Configure scopes: Navigate to the "Products" section, request access to "Share on LinkedIn" and "Sign In with LinkedIn using OpenID Connect", once approved (it's instant approval), you will be able to see them on the top of the screen:
Set clientId and clientSecret into Appmixer Backoffice for appmixer:linkedin
Verification will enable scopes to be used in the LinkedIn Appmixer connector: "Advertising API", "Lead Sync API", "Conversions API" and "LinkedIn Ad Library". These scopes are not used in the current version of the LinkedIn connector, therefore it's not required. You can still perform the verification by sending the verification link generated in the "Settings" tab to the Super Admin of the page associated with the App.
Process estimated time: instant approval.
Register an OAuth2 application in a similar way as usual Microsoft Azure App with few changes:
you don't need to configure OneDrive file picker
configure API permissions for Dynamics 365, see below
Go to the API permissions section:

Choose Dynamics CRM:

Delegated permissions:

The final set of permissions:
Creating CRM Dataverse environment
In order to use the Microsoft Dynamics 365 CRM connector, you'll need a Dataverse environment alongside your Microsoft account. You can review your environments in PowerPlatform administration. If you don't have any environment there, you can start with a trial. From the list of available apps, select Dynamics 365 Sales. Once you complete the sign-up process, the CRM environment will be created.
Once created you can view details of the environment and see Environment URL address which you will need when connecting a Microsoft Dynamics 365 CRM component to your account.
Note that in order to interact with Lead entities, you'll need to install Sales module into your Dataverse environment. Some entities like Contact or Account come with a Dataverse environment by default, but it is not the case for Lead entity.
Addition configuration
Microsoft Dynamics 365 CRM connector has additional settings when it comes to caching Dataverse environment schema and data. These settings can be configured in the Backoffice the same way as clientId or clientSecret:
listLookupOptionsCacheTTL - Cache TTL for inspector variables in milliseconds. Default value 1 minute. Determines how long the values of various Lookup fields are stored in Appmixer cache. This affects values fetched into select boxes in the inspector for fields like Currency, Contact, etc.
listOutportCacheTTL - Cache TTL for outports in milliseconds. Default 1 hour. Determines how long Appmixer caches the structure of the Dataverse instance (environment) for output ports. In case you add a new table or change an existing table (eg. by changing column type), this is the time you need to wait before the changes are propagated into components outPort schema.
listInspectorCacheTTL - Cache TTL for inspector in milliseconds. Default 1 hour. Similar to listOutportCacheTTL. Determines how long Appmixer caches the structure of the Dataverse instance (environment) for the inspector. In case you add a new table or change an existing table (eg. by changing column type), this is the time you need to wait before the changes are propagated into the component's inspector.
Configure the Twitter.
Navigate to the Twitter Developer Platform and sign up if you haven't already.
You might be required to apply for a developer account where you'll need to provide some information about your intended use of Twitter’s API.
After logging in to your Twitter Developer account, navigate to the Developer Dashboard.
Twitter should automatically create a default project and application for you. If it doesn't, click "Create Project" and follow the prompts to set up a new one. After creating the project, you'll be able to create an application. Navigate to your project and select "Add App."
Update application details, such as the name, description, and icon, by clicking the "Edit" button. Next, configure the authentication settings.
Set the "App permissions" to "Read and write" and "Type of App" to "Web App"
Set the Redirect URI to https://[YOUR_API_BASE]/auth/twitter/callback, for example https://api.appmixer.com/auth/titter/callback
Get the Client Id and Client Secret from the Keys and Tokens page
Configure the App Key as clientId and the App Secret as clientSecret in the service settings within the Backoffice, under the configuration ID appmixer:twitter.
To learn more about configuring connectors, please visit the Connector Configuration section.
Go to the Discord Developer Portal: https://discord.com/developers/applications and create a new Application.
Click “New Application”
Give it a name, accept their Terms of Service and click “Create”
Open your new application
To obtain your OAuth credentials, go to OAuth2 tab:
Client ID: shown on the “Client information” card as “Client ID”
Client Secret: click “Reset Secret” to generate a secret and copy it
You’ll paste these into the Appmixer Backoffice later.
You must add the redirect/callback URL so Discord can return users to Appmixer after authorization.
Go to OAuth2 tab
In “Redirects”, add your Appmixer URL. Example:
https://api.YOUR_SUBDOMAIN.appmixer.cloud/auth/discord/callback
Note: Replace YOUR_SUBDOMAIN with your actual Appmixer subdomain. The path “/auth/discord/callback” follows the same pattern as other Appmixer connectors.
To make the events (sending messages, reacting to events) be from a bot, add one:
Click “Reset Token” to reveal the Bot Token and copy it
Keep the token secure. You’ll paste it in the Backoffice as well.
Check the settings below in Authorization Flow, recommended set up is:
Public Bot: ON
Requires OAuth2 Code Grant: ON
Server Members Intent: ON
Rest can be turned off.
How you configure scopes:
Installation → Default Install Settings:
User Install: applications.commands
Guild Install: applications.commands, bot
Copy and paste the values into the Backoffice under the Discord connector configuration (appmixer:discord):
clientId → "Client ID" from Discord
clientSecret → “Client Secret” from Discord
botToken → “Bot Token”
After saving, return to your flow in Appmixer. Click “Connect account” for the Discord connector, complete the authorization, and you’re ready to use Discord components in your flows.
The Join Component is used to merge multiple input connections. It forwards every received message to the output port without modification.
in
Receives messages from multiple sources.
Connect Multiple Inputs
Attach multiple input sources to the in port.
Forward Messages
Every received message is immediately sent to the out
Does Not Modify Messages: Messages are forwarded exactly as received.
Useful for Routing: Can be used to merge multiple data streams into one processing path.
The CSV2JSON component converts a CSV file into a JSON file.
fileId
string
✅
The ID of the CSV file to convert.
Provide File ID:
Select or upload the CSV file to be converted.
Processing:
The component processes the CSV file and converts it into JSON format.
XLSX2HTML Component
The XLSX2HTML component converts an XLSX (Excel 2007+ XML) file into an HTML table format.
fileId
string
✅
The ID of the XLSX file to convert.
Select the XLSX File
Choose an existing XLSX file by providing its fileId.
Processing
The component will convert the XLSX file into an HTML table.
The CSV2HTML component converts a CSV file into an HTML table. This allows for easier visualization and sharing of structured data.
fileId
string
✅
The unique identifier of the CSV file.
Select the CSV File:
Provide the fileId of the CSV file to be converted.
Processing:
The component will transform the CSV file into an HTML table.
The HTML2XLSX component converts an HTML table file into an XLSX (Excel 2007+ XML Format) file.
fileId
string
✅
The ID of the HTML file containing the table to convert.
Provide the File ID:
Select or upload an HTML file containing a table.
Conversion Process:
The component extracts tabular data from the HTML file and converts it into an Excel spreadsheet.
XLSX2CSV Component
The XLSX2CSV component converts an XLSX Excel 2007+ XML format file into a CSV file.
fileId
string
✅
The ID of the XLSX file to convert.
Provide File ID:
Select an XLSX file using its fileId.
Conversion Process:
The component processes the XLSX file and converts it into CSV format.
This component is useful for extracting tabular data from Excel files into a widely used CSV format for further processing.
The JSON2HTML component converts a JSON file into an HTML table.
fileId
string
✅
The ID of the JSON file to be converted.
Provide the JSON File:
Select or upload a JSON file using its fileId.
Processing:
The component reads the JSON file and converts it into an HTML table.
JSON2XLSX Component
Overview
The JSON2XLSX component converts a JSON file into an XLSX (Excel 2007+ XML Format) file.
Input Parameters
fileId
Output Parameters
Instructions
Select the Input JSON File:
Upload or provide the fileId of the JSON file to be converted.
Processing:
The component converts the JSON file into an XLSX format.
Overview
The AddRows component allows adding multiple rows to an existing dataset.
Input Parameters
dataset
array
✅
Output Parameters
Instructions
Provide the Dataset:
Ensure the dataset is passed in the correct array format.
Add Rows Data:
Provide multiple rows in an array where each object represents a row.
Overview
The AddRow component allows adding a single row to a dataset.
Input Parameters
dataset
array
✅
Output Parameters
Instructions
Provide the Dataset:
Ensure the dataset is passed in the correct array format.
Add Row Data:
Provide the new row as an object where keys match column names.
Overview
The AddColumn component allows adding a new column to an existing dataset.
Input Parameters
dataset
array
✅
Output Parameters
Instructions
Provide the Dataset:
Ensure the dataset is passed in the correct array format.
Specify Column Details:
Enter the column name.
Create a Calendly Developer account:
Go to and sign up.
⚠️ Note: This is not your Calendly user account. It’s a separate developer account.
Create a new OAuth application:
You can find all the necessary information on how to register an OAuth app in Jira in their .
Access and create a new app. Click Create and select OAuth 2.0 integration.
Click on the "Register an app" button.
When you create an OAuth 2.0 (3LO) app, it's private by default. This means that only you can install and use it. If you want to distribute your app to other users, you must enable sharing.
Please follow the instructions in the to set up distribution.
You need to specify the scopes that your app will use. The Jira connector uses classic scopes for issue and instance operations, and granular scopes for project operations.
Note: The granular project scopes below apply to Jira connector version 4.0 and newer. Older connector versions use the classic
manage:jira-configurationscope for project operations instead.
Generate a Fathom API key and connect the Appmixer Fathom connector.
The Appmixer Fathom connector uses API key authentication. You do not need to register an OAuth app. Each user creates a personal API key in their Fathom account and enters it when they connect Fathom in Appmixer.
Log in to .
Open Settings (top right) and go to the API Access section of your user settings. The direct link is .
Click Add
First, you need to set a Quickbooks key and endpoint through the Backoffice in order to provide the Quickbooks components to your customers.
Go to the to create a new app.
Select the name and scope:
Then you receive your clientID and clientSecret.
Intuit issues two separate key pairs: Development keys work only with sandbox companies and Production keys work only with production companies. Configure the pair that matches the companies your users will connect.
Also add the redirect URL. Example: https://api.YOUR_SUBDOMAIN.appmixer.cloud/auth/quickbooks/callback.
Go the Appmixer BackOffice -> Configuration. Add new configuration: appmixer:quickbooks
The Condition Component evaluates expressions and directs data to either the true or false output port based on the result. It supports logical conditions using multiple operators and can process complex logical groupings.
The Switch component allows conditional branching of messages based on predefined expressions. It evaluates up to five conditions (out1 to out5) and routes messages accordingly. If none of the conditions match, the message is sent to the else output.
Go to GitHub → Settings → Developer settings → OAuth Apps → New OAuth App (for an organization-owned app: Organization settings → Developer settings → OAuth Apps).
Application name and Homepage URL: anything your users should recognise.
Authorization callback URL: https://<your-appmixer-api>/auth/github/callback — replace the host with your Appmixer API URL and keep the suffix /auth/github/callback.
Generate a client secret and create the appmixer:github
The Archive component allows you to create a ZIP or TAR archive from a set of files. You can also append files to an existing archive, provided it matches the specified format.
https://console.typesafe.ai
The Appmixer TypeSafe AI connector uses API key authentication. No OAuth app registration is required — you only need an API key from the TypeSafe console.
TypeSafe's Jev model does not generate text. You send it content together with typed questions (pick one of these options, rate on this scale, is this statement true) and it returns a decision limited to the options you supplied, with probabilities and a confidence score.
Open the and sign in with Google or with a code sent to your e-mail.
In the left sidebar, go to API Keys ().
Visit the tutorial for more information.
The On App Event Component triggers when an event is received from an external application, allowing automation workflows to respond dynamically to incoming app events.
This component listens for app events and processes incoming data, making it ideal for integrating external systems and event-driven workflows.
Retrieve the XLSX File:
The output provides the new file's fileId and fileName.
string
✅
The ID of the JSON file to convert.
fileId
string
The ID of the generated XLSX file.
fileName
string
The name of the XLSX file.
Process & Output:
The component adds the rows and outputs the updated dataset.
The dataset to which rows will be added.
rows
array
✅
An array of row objects to be added.
dataset
array
The updated dataset with the new rows.
Process & Output:
The component adds the row and outputs the updated dataset.
The dataset to which the row will be added.
row
object
✅
The row object containing column values.
dataset
array
The updated dataset with the new row.
Optionally, provide a default value for all rows.
Process & Output:
The component adds the column and outputs the updated dataset.
The dataset to which the column will be added.
columnName
string
✅
The name of the new column.
defaultValue
any
❌
Default value for the new column (optional).
dataset
array
The updated dataset with the new column.
out
Emits the received input messages as output.
Output:
The converted JSON file is available with its unique fileId and fileName.
fileId
string
The unique ID of the generated JSON file.
fileName
string
The name of the generated JSON file.
Output
The resulting file ID and name will be returned for further use.
fileId
string
The unique ID of the converted file.
fileName
string
The name of the generated HTML file.
Retrieve Output:
The converted HTML file’s fileId and fileName will be returned.
fileId
string
The ID of the generated HTML file.
fileName
string
The name of the generated file.
Retrieve the Output:
The resulting XLSX file is provided as output with a unique fileId and fileName.
fileId
string
The unique ID of the converted XLSX file.
fileName
string
The name of the generated XLSX file.
Retrieve Output:
The converted file is returned with its fileId and fileName.
fileId
string
The unique ID of the newly created CSV file.
fileName
string
The name of the converted CSV file.
Retrieve the Output:
The output file is provided as an HTML file with a fileId and fileName.
fileId
string
The unique ID of the converted HTML file.
fileName
string
The name of the output HTML file.





















string
✅
The name of the output archive file, including the extension.
files
object
❌
List of files to be added to the archive. Each file is represented by its fileId.
archiveFileID
string
❌
The ID of an existing archive file. If provided, new files will be appended to this archive.
fileId
string
The unique ID of the newly created or updated archive file.
fileName
string
The name of the archive file.
Select Output Format:
Choose between zip or tar as the output format.
Provide File Name:
Specify a name for the archive file, ensuring it includes the appropriate extension (.zip or .tar).
Add Files to Archive:
Upload or select files using their fileId.
If an archiveFileID is provided, new files will be appended to the existing archive.
Processing:
The component processes and creates the archive, returning the generated file’s fileId and fileName.
Batch File Compression: Combine multiple files into a single ZIP or TAR archive.
Incremental Archiving: Append files to an existing archive for ongoing data collection.
Data Backup & Export: Store or transfer multiple files efficiently as a single archive.
outputFormat
string
✅
The format of the archive file. Options: zip, tar.
fileName
Give the key a name (for example Appmixer) and create it.
Copy the key and store it somewhere safe.
The Fathom API reference is at developers.fathom.ai.
When you add a Fathom component to a flow, Appmixer asks you to connect an account. Paste the key into the API Key field.
Appmixer sends the key in the X-Api-Key header to https://api.fathom.ai/external/v1. To check the key, it calls GET /meetings?limit=1. Fathom has no profile endpoint, so the connection is named after the user who recorded the most recent meeting. If the account has no meetings yet, the connection is named Fathom account.
You do not need to set up a webhook in Fathom yourself. When a flow with the New Meeting Content Ready trigger starts, Appmixer uses your API key to register a webhook in Fathom (POST /webhooks) that points at the flow's webhook URL. When the flow stops, Appmixer deletes that webhook.
Turn on at least one of Include Summary, Include Transcript, Include Action Items or Include CRM Matches. Fathom rejects the webhook registration if none of them are on.
Triggered For controls which recordings fire the trigger. If you leave it empty, it defaults to My recordings.
Your Appmixer API must be reachable from the public internet so that Fathom can deliver webhook calls.
Fathom limits API usage per user, counted across all of that user's keys: 60 requests per 60 seconds overall, and 30 requests per 60 seconds for heavy endpoints such as meeting summaries and transcripts. Fathom can lower the heavy-endpoint limit when its platform is under load. The connector queues requests to stay under these limits. The List and Find components also stop paginating after a fixed maximum number of items and pages.
401 Unauthorized when connecting: check that you copied the whole key and that it has not been deleted in Settings → API Access.
A meeting is missing from the results: the key only sees meetings recorded by its owner or shared with them or their team. Ask the meeting owner to share the meeting, or connect the owner's account.
Configuration ID: appmixer:fathom. For how to set connector configuration values, see Connector Configuration.
You do not need any Backoffice configuration to authenticate, because every user enters their own API key. There is one optional key:
outputFilePrefix: optional. A prefix for the names of CSV files created when a List or Find component (List Meetings, Find Meetings, List Meeting Types, List Teams) runs with the Store to CSV file output type. Files are named <prefix>-<component label in the flow>.csv. The default is fathom-objects-export.
appmixer service-config set appmixer:fathom -u -d '{"outputFilePrefix": "fathom-objects-export"}'Provide a name for your application.
Select the kind of application:
Web
Select your environment:
Sandbox (recommended for development)
Production (use when going live with customer data)
Sandbox: HTTP with localhost domain allowed
Example:
http://localhost:1234Production: Must use HTTPS.
👉 You can add multiple redirect URIs, separated by commas. 👉 For Appmixer, set the redirect URI to:
Example:
Once the app is created, you’ll see:
Client ID
Client Secret
⚠️ Important: These values will only be shown once. Copy them immediately!
Go to the Appmixer BackOffice -> Configuration.
Add new configuration: acme:calendly .
Add your clientId and clientSecret keys with values.
To edit an existing OAuth app in Calendly:
Click the menu icon → Edit.
Editable attributes:
Application Name
Kind of App
Environment Type
Redirect URI
⚠️ Note: Client Secret and Webhook Signing Key cannot be retrieved again after creation.
https://[YOUR_API_BASE]/auth/docusign/callbackhttps://api.appmixer.com/auth/docusign/callbackmanage:jira-configuration — a broad administrative scope that grants access to all Jira configuration (workflows, schemes, screens, custom fields, …). To stay least‑privilege, the connector instead uses Jira's narrow granular project scopes (e.g. write:project:jira to create/update, delete:project:jira to delete), so no broad admin scope is required.Enable all of the following scopes:
User identity
read:me
Classic — issues & instance
read:jira-work
write:jira-work
read:jira-user
Granular — projects
read:project:jira
write:project:jira
delete:project:jira
write:project.avatar:jira
read:project.property:jira
read:project.component:jira
read:project-category:jira
read:project-version:jira
read:issue-type:jira
read:issue-type-hierarchy:jira
read:user:jira
read:avatar:jira
read:group:jira
read:application-role:jira
Important: Granular scopes are defined per endpoint and must all be enabled. Reading or updating a project, for example, requires the full set of
read:*project scopes above — not justread:project:jira. A missing scope causes a runtime401 Unauthorized; scope does not match. (offline_accessis requested automatically by the connector.)
This is how the permissions should look like:
After you have created the app, you will see the overview of the app. Here you can find the client ID and client secret.
The last step is to configure clientId and clientSecret in the Appmixer Backoffice for appmixer:jira connector.
When you use the Development (sandbox) keys, also add sandbox: true to the same configuration — it switches the connector to the sandbox API base URL (sandbox-quickbooks.api.intuit.com) and the sandbox OpenID endpoint. With Production keys, omit the flag (production is the default).
All trigger components (for example NewInvoice) use QuickBooks webhooks. In order to use this component(s) in Appmixer, you have to register Appmixer's QuickBooks URI in QuickBooks first and set the webhook key in the Appmixer BackOffice.
Go to https://developer.intuit.com/app/developer/dashboard then choose your Appmixer app. Navigate to the "Webhooks" section either for the sandbox or production environment and add a new webhook.
Fill the field Endpoint URL with https://api.acme.appmixer.cloud/plugins/appmixer/quickbooks/webhooks (replace acme with your subdomain).
In Subscribed events, select the entities and operations the trigger components consume:
Bill
Create, Update
NewBill, UpdatedBill
Customer
Create, Update
NewCustomer, UpdatedCustomer
Invoice
Create, Update
NewInvoice, UpdatedInvoice
Leave the Enable cloud event payload format toggle off — the connector processes the classic webhook payload format.
For detailed steps, see QuickBooks documentation.
Make sure to copy the Verifier Token and paste it to the Appmixer BackOffice -> Configuration -> appmixer:quickbooks -> webhookVerifierToken field.
Intuit issues a different verifier token for the Development (sandbox) and Production webhook sections, even when both point at the same endpoint. The connector accepts multiple tokens: set the production token in webhookVerifierToken and the sandbox token in webhookVerifierTokenSandbox (or put several tokens comma-separated into webhookVerifierToken). Incoming events are verified against every configured token; delivery is routed by the company (realmId), so sandbox and production events never mix.



=
Checks if two values are equal.
!=
Checks if two values are not equal.
>
Checks if a value is greater than another.
>=
Checks if a value is greater than or equal to another.
<
Checks if a value is less than another.
true
Fires if the condition evaluates to true.
false
Fires if the condition evaluates to false.
Define Conditions
Create conditions using logical grouping (AND, OR).
Choose an operator and provide a comparison value.
Evaluate Inputs
Inputs are compared using selected operators.
Logical groups (AND, OR) allow complex expressions.
Direct Output
If the condition evaluates to true, data is sent to the true port.
If the condition evaluates to false, data is sent to the false port.
Logical Groups: Conditions can be grouped using AND and OR for flexible logic handling.
Range Handling: Use rangeMin and rangeMax to check if a value is within a range.
Regex Support: Allows pattern matching for advanced validation.
expression
object
A structured condition with logical operators (AND, OR) and comparison rules.
Conditional expressions for respective outputs (out1 to out5).
else
default
Messages that do not match any condition are sent here.
Each expression supports AND/OR logic, allowing complex conditions.
=
Equal to
!=
Not equal to
>
Greater than
>=
Greater than or equal to
<
out1 - out5
Message is sent to the first matching output based on conditions.
else
If no conditions are met, the message is sent to this output.
Define Conditions
Configure up to 5 expressions (expression1 to expression5) for routing messages.
Set Operators
Use supported operators to define comparison logic.
Handle Default Cases
If none of the conditions match, the message is sent to else.
expression1 - expression5
expression
clientId and clientSecret.The On Project Item Changed trigger (projects_v2_item events — a card on a Projects (v2) board changes its Status or another field) does not register anything on GitHub itself. GitHub delivers these events only through an organization webhook, and only an organization owner can manage those, so the webhook is created once per organization by an owner and every flow with the trigger subscribes to it through the connector.
Add a webhookSecret key to the appmixer:github configuration in the Backoffice, or with the CLI:
Any long random string works — for example the output of openssl rand -hex 32. GitHub signs every delivery with it (X-Hub-Signature-256) and the connector drops deliveries whose signature does not match.
As an owner of the organization, open Organization settings → Webhooks → Add webhook and fill in:
Payload URL: https://<your-appmixer-api>/plugins/appmixer/github/events
Content type: application/json
Secret: the same value as webhookSecret
SSL verification: enabled
Which events would you like to trigger this webhook?: Let me select individual events → tick only Project v2 items
The screenshot shows https://acme.appmixer.ai/… as an example: put your own Appmixer API URL in front of /plugins/appmixer/github/events (the same host your Appmixer API answers on, for example https://api.acme.appmixer.cloud/plugins/appmixer/github/events).
Save it. GitHub immediately sends a ping, which the connector answers with 200; you can see it under Recent Deliveries of the webhook. One webhook serves every flow on the Appmixer instance.
In the flow, set the trigger's Organization (the login of the organization) and optionally Project Node ID (the GraphQL node id of one board, PVT_…; leave it empty to receive events of every board of the organization). The account bound to the trigger needs only the read:org and read:project scopes — they serve Flow Test Mode, which reads the newest card of the board.
If a flow receives nothing, check the webhook's Recent Deliveries: a 401 response means the secret in GitHub differs from the connector's webhookSecret; a 404 means the URL points at an instance (or a hub) where the connector is not installed.
Configuration ID: appmixer:github (Backoffice → Configuration; see Connector Configuration for how a configuration is created and how its keys reach the connector).
clientId — Client ID of the GitHub OAuth app registered above. Not needed when GitHub is authenticated through the Appmixer Auth Hub.
clientSecret — Client secret of the same OAuth app. Not needed with the Auth Hub.
webhookSecret — The secret of the organization webhook that feeds On Project Item Changed (any long random string, the same value as in GitHub). Only needed when that trigger is used. On an Auth Hub setup it belongs to the hub's appmixer:github configuration, not to the instance.
The same keys can be set with the CLI (-u updates the existing configuration instead of creating it):
appmixer service-config set appmixer:github -u -d '{"webhookSecret": "<secret>"}'appmixer service-config set appmixer:github -u -d '{
"clientId": "<client id>",
"clientSecret": "<client secret>",
"webhookSecret": "<webhook secret>"
}'Click Create key and give the key a descriptive name (e.g. Appmixer Integration).
Copy the key. It starts with apikey_.
The list shows every key with its status and a masked value, so you can always check which key a connection in Appmixer uses — Appmixer labels the connection with the same masked form.
When adding a TypeSafe AI component in Appmixer, you will be prompted to authenticate. Provide:
API Key — the key generated in Step 1.
Appmixer verifies the key by calling GET https://api.typesafe.ai/v1/models. TypeSafe has no profile endpoint, so the connection is labelled with the masked key (for example api...efd8).
The connector's components map one to one to what you can test in the TypeSafe console Playground:
Content is the Playground's State — the text (or JSON) the questions are about.
Classify Text is a Choice question, Score Text is a Score question and Verify Statement is a Noul question.
Ask Questions sends several questions about the same content in one request. You add one row per question (an ID, the type, the question and its options or levels) and every answer becomes its own output variable, named after the question ID.
The Model input offers the models available to your account. jev-latest is the default; a version such as jev-1.13.0 pins the model.
Make sure the key was copied completely, including the apikey_ prefix.
Check in the console under API Keys that the key has not been deleted, and create a new one if needed.
Unknown model — the Model input holds a name your account does not have. Pick one from the list or use jev-latest.
Too many score levels — Score Text accepts 2 to 10 levels.
These are temporary. Appmixer retries the request automatically; the connector already stays below TypeSafe's documented rate limit.
eventDataExample
string
An example JSON structure representing the event data.
out
Emits the received app event data.
Registers Webhook: Subscribes to the specified event using the Appmixer API.
Receives Event Data: Waits for an event from the external system.
Processes Data:
Parses the received JSON payload.
Extracts structured data based on eventDataExample.
Emits Structured Output: Sends the processed event data to the out port.
data
object
The JSON payload received from the app event.
Webhook-Based Execution: Efficiently listens for app events using webhooks.
Dynamic Event Handling: Supports various app events based on configurations.
Ideal for Integrations: Enables event-driven automation between external apps and workflows.
This component is essential for workflows requiring real-time event processing and seamless app integration.
event
string
The name of the event to listen for.
https://www.linkedin.com/developers
The LinkedIn Pages connector (appmixer:linkedinPages) publishes posts on behalf of LinkedIn company pages. It needs its own LinkedIn app with the Community Management API product.
Don't reuse the app you created for the LinkedIn connector (appmixer:linkedin). LinkedIn grants the Community Management API only to an app that has no other products, and the LinkedIn connector needs Sign In with LinkedIn using OpenID Connect.
A business email address. Personal addresses are rejected, and LinkedIn sends a verification email to the address you enter.
Your organization's legal name, registered address, website and privacy policy URL.
A LinkedIn Page of your organization, and a super admin of that page who will verify the app.
An app name and logo that don't contain "LinkedIn", "Linked" or "In", or the LinkedIn or Microsoft logos.
Go to and create a new app.
Fill in the app name.
For LinkedIn Page, choose your organization's page.
Add the privacy policy URL and the app logo, then accept the legal agreement.
Create the appmixer:linkedinPages configuration in the and set clientId and clientSecret.
The connector requests the following scopes:
r_basicprofile: the name of the connected member, which becomes the account name. This app gets no access to the member's email address.
w_organization_social: publishing posts as a company page (CreatePost).
rw_organization_admin: listing the pages the member manages, which fills the organization dropdown in CreatePost.
The connected member must be an administrator or content administrator of the page they post to.
Development tier is what the app gets after the first approval. It allows 500 API calls per app and 100 API calls per member per 24 hours; the limits reset at midnight UTC. This is enough to build and test, not for production traffic.
Standard tier removes these limits. Request it in the Products tab within 12 months of getting Development tier access, otherwise LinkedIn removes the access.
Be ready to describe your company, product and use case, and to give LinkedIn's reviewers test credentials.
The authorization fails with an invalid or unauthorized scope error. The Community Management API isn't approved for the app yet, or one of the scopes above is missing on the Auth tab.
Posting fails with 403 Forbidden. The connected member isn't an administrator or content administrator of the page. The error message includes LinkedIn's reason.
More in LinkedIn's documentation: , .
The AWS SNS Connector allows you to send SMS messages using Amazon Simple Notification Service (SNS). However, there are certain limitations and prerequisites that must be met for successful message delivery.
Before using the AWS SNS Connector to send SMS messages, ensure the following:
SNS Sandbox Registration:
If your AWS account is in SNS SMS Sandbox Mode, SMS messages can only be sent to verified phone numbers added in the AWS Console.
To register a phone number, follow .
Region Compatibility:
The SNS SMS service may be region-dependent. Ensure the selected region supports SNS SMS services.
Messages might only be delivered if the selected region matches your AWS account’s region.
Spending Limit:
AWS imposes a default spending limit of $1 USD for SMS.
If the limit is reached, no SMS will be sent.
Check and increase the limit in the AWS SNS console under SMS settings.
IAM Permissions:
To enable SMS delivery logs, you must have the necessary IAM permissions.
Without proper permissions, viewing SMS failures or debugging will not be possible.
Check IAM policies and request permissions if needed.
When an SMS is published via SNS, a 200 OK response is returned.
However, this only confirms that SNS received the request. It does not confirm message delivery.
To track the status of an SMS:
Enable CloudWatch Logs for SNS SMS (requires permissions).
Verify Phone Number:
Check if the recipient's number is added in the AWS SNS SMS sandbox.
Check Spend Limit:
Go to AWS SNS Console → Text Messaging (SMS) → Spend Limit
The AWS SNS Connector itself functions correctly. However, message delivery depends on AWS account settings, sandbox verification, spending limits, region settings, and logging permissions. By following the prerequisites and debugging steps above, users can ensure successful SMS delivery through AWS SNS.
For further assistance, consult AWS support or refer to the official SNS documentation.
Register a Spotify app for the Appmixer Spotify connector (OAuth 2).
Sign in to the Spotify for Developers Dashboard with the Spotify account that will own the app.
Click Create app and fill in:
App name and App description: anything your users should recognise — both are shown to the user on the Spotify consent screen.
Website: optional, for example your product page.
Redirect URIs: https://<your-appmixer-api>/auth/spotify/callback — replace the host with your Appmixer API URL and keep the suffix /auth/spotify/callback (for example https://api.acme.appmixer.cloud/auth/spotify/callback). Click Add next to the field. Spotify only accepts https:// redirect URIs (plain http:// is allowed only for loopback addresses), and the URI must match exactly, including the absence of a trailing slash.
Which API/SDKs are you planning to use?: tick Web API.
Accept the Spotify Developer Terms of Service and click Save.
On the app's page open Settings → Basic Information. Copy the Client ID, click View client secret and copy the Client secret.
Scopes are not configured in the dashboard — the connector requests them when a user connects an account. The Spotify connector requests:
playlist-read-private — list the user's private playlists (List Playlists and the Playlist dropdown of the other components).
playlist-modify-public and playlist-modify-private — Create Playlist, Add Items To Playlist, Replace Playlist Items on public and private playlists.
user-library-modify
Find Tracks and List Playlist Items need no extra scope. Make API Call runs with the same four scopes, so calls to endpoints that need other scopes (playback, listening history, …) fail with 403.
Spotify does not publish a fixed rate limit; it is computed over a rolling 30-second window and is lower for Development Mode apps. The connector throttles itself to 60 requests per 30 seconds per Appmixer user and retries 429 responses after the Retry-After interval.
Configuration ID: appmixer:spotify (Backoffice → Configuration; see for how a configuration is created and how its keys reach the connector).
clientId — Client ID of the Spotify app registered above. Not needed when Spotify is authenticated through the Appmixer Auth Hub.
clientSecret — Client secret of the same app. Not needed with the Auth Hub.
listCacheTTL — Optional. How long, in milliseconds, the list of the user's playlists shown in the Playlist dropdown is cached. Default 120000 (2 minutes).
The same keys can be set with the CLI (-u updates the existing configuration instead of creating it):
The Digest Component collects incoming data entries and releases them as a batch based on a threshold, a schedule, or a manual trigger via a webhook. This component is useful for aggregating data over time and sending it at controlled intervals.
threshold
number
Number of entries required to trigger output. If set, output is triggered when this count is reached.
webhookUrl
Set a Threshold (Optional)
Define the threshold parameter to release data when a certain number of entries are reached.
Schedule Batch Processing (Optional)
Configure minute
Supports multiple trigger methods: Data is released either via count (threshold), time (schedule), or manually (webhook).
Flexible scheduling: Uses cron-like syntax for precise control over execution times.
Different output formats: Users can choose between receiving data as an array, a single entry, or a downloadable CSV file.
The JoinEach Component is designed to work with the Each Component. It collects multiple incoming messages based on a specified count and outputs them as a single batch when all expected messages have arrived. If some messages do not arrive within a timeout period, it outputs the partial batch along with count information.
in
Receives individual messages to be aggregated. Each message must contain a correlationId.
count
Specifies the total number of messages expected. Must be provided before aggregation begins.
Set Up with Each Component
Ensure messages sent to in contain a correlationId matching the one from the Each component.
Define Expected Count
Works with Correlation IDs: Ensures messages from the same batch are correctly joined.
Timeout Handling: Prevents indefinite waiting if some messages fail to arrive.
Batch Processing: Useful for grouping messages into structured outputs for further processing.



Before using GoHighLevel components in Appmixer, you need:
A GoHighLevel account with at least one Sub-Account (location)
A Private Integration Token created from within that Sub-Account
A Pipeline (required for Opportunity components)
Sign in to your Strava account at
Navigate to
You need an existing Strava athlete account to create API applications
⚠️ Note: API applications are tied to your Strava athlete account.
To integrate Appmixer with Salesforce, you are going to need an app in your Salesforce org. You can either create a new one or use one that already exists.
Salesforce has two kinds of apps:
External Client App – the current app type. Since Spring '26 the New Connected App button is disabled in all orgs, so every new app is an External Client App. External Client Apps always require PKCE (the Require Proof Key for Code Exchange (PKCE) setting is checked and cannot be changed).
Connected App (legacy) – older apps you may already have. They keep working. Salesforce is progressively enforcing PKCE for them too.
Log in to Salesforce, open Setup and in the left menu look up Platform Tools -> Apps -> External Client App Manager. Click New External Client App
<=
Checks if a value is less than or equal to another.
%
Checks if a number is divisible by another (modulo).
empty
Checks if a value is empty.
notEmpty
Checks if a value is not empty.
contains
Checks if a value contains another value.
range
Checks if a value falls within a specified range.
regex
Validates if a value matches a given regular expression.
Less than
<=
Less than or equal to
%
Modulo operation (divisibility check)
empty
Checks if the value is empty
notEmpty
Checks if the value is not empty
contains
Checks if a value contains a substring
range
Checks if a value falls within a specified range
regex
Matches a value against a regular expression
hourdayMonthdayWeekManual Trigger via Webhook (Optional)
Use the webhookUrl to release entries manually at any time.
Select Output Type
Choose how the collected data should be sent (first, array, object, or file).
string
A generated webhook URL that allows manual triggering of output.
minute
string
Specifies at which minutes of the hour the digest should run. Supports cron-like syntax.
hour
string
Specifies at which hours of the day the digest should run. Supports cron-like syntax.
dayMonth
string
Specifies on which days of the month the digest should run. Supports cron-like syntax.
dayWeek
string
Specifies on which days of the week the digest should run. Supports cron-like syntax.
timezone
string
Timezone for scheduling, defaults to GMT.
outputType
string
Format of the output data. Options: first (first entry), array (all entries as an array), object (one entry at a time), file (CSV file).
in
Receives data entries for aggregation.
out
Emits the aggregated data based on the configured condition (threshold, schedule, or webhook trigger).
Send a message to the count port specifying how many messages the component should wait for.
Processing Messages
The component collects messages based on the correlationId.
When all expected messages arrive, they are sent as an array to the out port.
If not all messages arrive before the timeout, the timeout port emits the partial batch.
out
Fires when all expected messages arrive, emitting an array of collected messages.
timeout
Fires when the timeout is reached before all expected messages arrive, providing the partial batch and counts.
items
The array of collected messages.
items
The array of messages that arrived before the timeout.
count
The number of expected messages.
arrived
The number of messages that actually arrived.













Use AWS SNS Delivery Status Logs to check failures.
Insufficient IAM permissions
Request permissions to enable CloudWatch logs
Enable Logs for Debugging:
Navigate to AWS CloudWatch Logs and enable SNS delivery status logs.
Ensure IAM permissions allow access to logs.
Confirm Region Settings:
Use a region that supports SNS SMS delivery.
SMS not received
Phone number not verified in sandbox
Add number to SNS sandbox
200 OK but no SMS
No balance in the AWS SNS SMS spend limit
Increase spending limit in AWS console
SMS delivery failure
Region mismatch
Use the correct region for SMS service
Unable to view logs
DELETE /me/libraryoutputFilePrefix — Optional. File name prefix of the CSV file that Find Tracks, List Playlists and List Playlist Items create when their output is set to File; the file is named <prefix>-<component name>.csv. Default spotify-objects-export.
appmixer service-config set appmixer:spotify -u -d '{
"clientId": "<client id>",
"clientSecret": "<client secret>"
}'Open the Settings tab and click Verify next to the LinkedIn Page. Send the generated link to a super admin of the page. The app is verified once they open the link and approve it.
Open the Products tab and request access to the Community Management API.
Fill in the access request form.
Choose page management as the use case, for example publishing posts to the company pages your users manage.
Confirm your business email address from the verification email.
LinkedIn doesn't publish a review time. Once approved, the app gets the Development tier (see ).
Open the Auth tab and add the redirect URL under OAuth 2.0 settings > Authorized redirect URLs. Replace acme.com with your domain and keep the suffix /auth/linkedinPages/callback, e.g. https://api.acme.com/auth/linkedinPages/callback.
On the same tab, check that OAuth 2.0 scopes include r_basicprofile, w_organization_social and rw_organization_admin. They appear after the Community Management API is approved.
Copy the Client ID and the Primary Client Secret.
r_basicprofile
w_organization_social
rw_organization_adminSign up at https://www.gohighlevel.com or https://app.gohighlevel.com.
After signing up, you will land in the Agency View. This is the top-level account — it does not hold contacts, opportunities, or calendars directly. All data lives inside Sub-Accounts (formerly called Locations).
From the Agency View, go to Sub-Accounts in the left menu and click + New Sub-Account. Fill in the basic info (name, etc.) and save.
Once created, click into the Sub-Account. The URL will look like:
Copy the <LOCATION_ID> — you will need it when connecting GoHighLevel in Appmixer.
Important: The Location ID is the Sub-Account identifier. All API calls require it to know which Sub-Account to operate on.
Navigate to your Sub-Account (not Agency) settings:
Settings → Private Integrations → + Create New
Give it a name (e.g. "Appmixer Integration")
Enable all required scopes — at minimum:
Contacts (read/write)
Opportunities (read/write)
Calendars (read/write)
Locations (read)
Click Create and copy the generated token (starts with pit-...)
Important: The token must be created from within the Sub-Account, not from the Agency level. Agency-level tokens will not work for Sub-Account data.
When adding a GoHighLevel component in Appmixer, you will be prompted to authenticate. Provide:
Private Integration Token
The pit-... token from Step 3
Location ID
The Sub-Account ID from Step 2
GoHighLevel Opportunity components (CreateOpportunity, FindOpportunities, UpdateOpportunity) require at least one Pipeline to exist in your Sub-Account.
To create a Pipeline:
Go to your Sub-Account in GoHighLevel
Navigate to CRM → Pipelines (or Opportunities → Pipelines)
Click + Add Pipeline
Add at least one stage (e.g. "New Lead", "Contacted", "Closed")
Save
Once created, the Pipeline will appear in the Pipeline dropdown when configuring Opportunity components in Appmixer.
The CreateAppointment component requires a Calendar. To create one:
Go to your Sub-Account in GoHighLevel
Navigate to Calendars
Click + New Calendar and select the calendar type (e.g. "Event")
Configure basic settings and save
The Calendar will appear in the Calendar dropdown when configuring Appointment components in Appmixer.
CreateContact
Create a new contact in GoHighLevel
GetContact
Retrieve a contact by ID
FindContacts
Search contacts by query, email, phone, etc.
UpdateContact
Update an existing contact
DeleteContact
The Private Integration Token does not have the required permissions. Go to Settings → Private Integrations, edit your integration, and enable the necessary scopes.
You are using an Agency-level token instead of a Sub-Account token. Delete the token and create a new one from within the Sub-Account settings.
You need to create at least one Pipeline or Calendar in GoHighLevel before they appear in the Appmixer component dropdowns. See Steps 5 and 6 above.
The Location ID is missing or incorrect. Make sure you copied it from the Sub-Account URL and provided it during authentication.
https://app.gohighlevel.com/location/<LOCATION_ID>/dashboardCreate a new application:
Click "Create & Manage Your App"
Fill in the application details:
Application Name (e.g., "My Fitness Integration")
Category - Select the most appropriate category for your app
Club - Optional, select a club if applicable
Website - Your application's website URL
Application Description - Describe what your integration does
Application Icon:
Upload an icon for your application (optional but recommended)
Supported formats: PNG, JPG (recommended size: 124x124 pixels)
Authorization Callback Domain:
Enter your callback domain in the "Authorization Callback Domain" field
For Appmixer, use your API domain without the full path:
Example:
OAuth Redirect URI:
Strava will construct the full callback URL
The complete redirect URI will be:
Example:
After creating your application, you'll see your API credentials:
Client ID - Your application's unique identifier
Client Secret - Your application's secret key
⚠️ Important: Keep your Client Secret secure and never expose it in client-side code!
Strava uses the following OAuth scopes:
read - Read public profile information
read_all - Read all profile information (including private activities)
profile:read_all - Read all profile information
profile:write - Update profile information
activity:read - Read public activities
activity:read_all - Read all activities (including private)
activity:write - Create and update activities
⚠️ Note: Strava has strict guidelines about data usage. Ensure you comply with their API Agreement.
Go to the Appmixer BackOffice -> Configuration.
Add new configuration: acme:strava.
Add your clientId and clientSecret keys with values.
Rate Limits:
Default: 100 requests per 15 minutes, 1000 requests per day
Higher limits: Available upon request for approved applications
Rate limit headers are included in API responses
For Public Applications:
Submit for Review:
Applications requesting higher rate limits need approval
Provide detailed information about your use case
Include screenshots and documentation
Compliance Requirements:
Follow Strava's
Implement proper data handling and privacy measures
Display Strava attribution where required
[YOUR_API_DOMAIN]api.appmixer.comhttps://[YOUR_API_DOMAIN]/auth/strava/callbackhttps://api.appmixer.com/auth/strava/callbackFill out the basic information:
External Client App Name and API Name – for example Appmixer.
Contact Email – your email.
Distribution State – Local.
Expand the API (Enable OAuth Settings) section and tick Enable OAuth. Then fill out:
Callback URL – https://api.acme.com/auth/salesforce/callback, replace api.acme.com with the domain of your Appmixer API and keep the suffix /auth/salesforce/callback.
Selected OAuth Scopes – add at least:
Manage user data via APIs (api)
Access the identity URL service (id, profile, email, address, phone)
Perform requests at any time (refresh_token, offline_access)
In Flow Enablement, tick Enable Authorization Code and Credentials Flow.
In Security, tick Require secret for Web Server Flow and Require secret for Refresh Token Flow. Leave Require Proof Key for Code Exchange (PKCE) checked – the connector sends the PKCE parameters. Refresh Token Rotation may stay enabled as well; the connector stores the rotated token.
Click Create.
Next, open the Policies tab of the new app, click Edit and in the OAuth Policies section:
tick Enable OAuth Policies,
set Permitted Users to All users may self-authorize (or restrict it to a profile or permission set),
set Refresh Token Policy to Refresh token is valid until revoked.
Save the policies.
Open the Settings tab of your External Client App, expand OAuth Settings and click Consumer Key and Secret. Salesforce may ask you for a verification code sent to your email. You should now see your client id (shown as Consumer Key) and secret (shown as Consumer Secret).
If your org still allows creating Connected Apps (Setup -> External Client App Manager -> Settings -> Allow creation of connected apps), or you already have one, the steps are similar. Look up Platform Tools -> Apps -> App Manager and click New Connected App on the top right side:
Look out for the API (Enable OAuth Settings) section. Tick the Enable OAuth Settings checkbox, and fill out the callback URL and scopes as shown in this screenshot:
Check the Require Secret for Web Server Flow, Require Secret for Refresh Token Flow and Enable Authorization Code and Credentials Flow checkboxes. Require Proof Key for Code Exchange (PKCE) can be either checked or unchecked with connector 1.7.4 or newer.
To get the client id and secret, go to the App Manager, search for your app in the list and on the dropdown in the right side click the View option.
In the next screen, look out for API (Enable OAuth Settings) section and click on the Manage Consumer Details button. You should see now your client id (shown as Consumer Key) and secret (shown as Consumer Secret):
Now we can provide these values to Appmixer. Log into the Backoffice and go to the Configuration section. Create a configuration service for Salesforce as follows:
Finally, set the clientId (Consumer Key in Salesforce) and the clientSecret (Consumer Secret in Salesforce) like this:
The Salesforce OAuth authentication offers several behaviors when users try to authenticate. This is the summary of the available options (taken from Salesforce Oauth docs):
login—The authorization server must prompt the user for reauthentication, forcing the user to log in again.
consent—The authorization server must prompt the user for reapproval before returning information to the client.
select_account—If present, take one of the following actions.
If zero or one hint is available and the user is logged in, show the approval page without prompting for login.
If zero or one hint is available and the user isn’t logged in, prompt for login.
If more than one hint is available, show the account chooser.
By default, we use the login option, but you can configure it through the Backoffice.
Login into the Backoffice, and go to the Services module. Then add a new service like this:
2. Add a promptType key, and set it to one of the supported values by Salesforce:
The default login URL is https://login.salesforce.com, this can be changed with a baseUrl.
missing required code challenge when connecting an account – the app requires PKCE but the connector is older than 1.7.4. Upgrade the connector.
invalid_client_id or redirect_uri_mismatch – the Consumer Key or the callback URL in the app does not match the Appmixer configuration. The callback URL must end with /auth/salesforce/callback.
The account stops working after some time – check the Refresh Token Policy of the app; Refresh token is valid until revoked is the recommended setting.
Sign in to your Intercom account at Intercom
Navigate to the Intercom Developer Hub
Go to Your Apps section in the Developer Hub
⚠️ Note: You need an existing Intercom workspace to create developer apps.
Create a new app:
Click "New app" or "Create app"
Provide an App name (e.g., "My Integration")
Add an App description explaining what your integration does
App Configuration:
Choose "Internal integration" for private use within your workspace
Or choose "Public app" if you plan to distribute it publicly
Navigate to Authentication:
In your app dashboard, go to the "Authentication" section
Select "OAuth" as the authentication method
Set up OAuth Configuration:
👉 For Appmixer, set the redirect URI to:
Example:
After configuring OAuth, you'll find your credentials in the Authentication section:
Client ID - Found in the OAuth section
Client Secret - Found in the OAuth section
⚠️ Important: Keep your Client Secret secure and never expose it in client-side code!
If your integration needs real-time updates:
Go to Webhooks section:
Navigate to "Webhooks" in your app dashboard
Click "Create webhook"
Webhook Configuration:
Go to the Appmixer BackOffice -> Configuration.
Add new configuration: acme:intercom.
Add your clientId and clientSecret keys with values.
Install your app:
In the app dashboard, click "Install app"
This will install the app to your selected workspace
Generate Access Token (for testing):
When ready for production:
App Review (for public apps):
Submit your app for Intercom's review process
Provide detailed information about your app's functionality
Include privacy policy and terms of service links
⚠️ Rate Limits:
Intercom has rate limits based on your plan
Standard: 1,000 requests per minute
See for details
⚠️ API Versions:
Intercom uses API versioning via headers
Always specify the API version: Intercom-Version: 2.10
⚠️ Scopes:
Request only the minimum scopes needed for your integration
Users will see all requested permissions during OAuth flow
Sign in to your Figma account at Figma
Navigate to the Figma Developer Platform
You need a Figma account to create applications (free account works)
⚠️ Note: Some API features require a Figma Professional or Organization plan.
Access Developer Settings:
Go to Account Settings → Connected apps
Or visit: https://www.figma.com/developers/apps
Create New App:
Click "Create new app"
Fill in the application details:
App name (e.g., "Appmixer Design Integration")
OAuth Configuration:
In your app settings, configure OAuth details
Set your callback URL for OAuth flow
Set Callback URL:
Example:
OAuth Scopes:
Figma OAuth provides access to:
File access - Read and write files
Team access - Access team information
After creating your application, you'll find:
Client ID - Your OAuth application identifier
Client Secret - Your OAuth application secret
⚠️ Important: Keep your Client Secret secure and never expose it in client-side code!
For server-to-server integrations, you can use personal access tokens:
Generate Personal Access Token:
Go to Account Settings → Personal access tokens
Click "Create new token"
Give it a descriptive name
Figma supports webhooks for real-time file updates:
Create Webhook:
Use the
POST to https://api.figma.com/v2/webhooks
Webhook Events:
Go to the Appmixer BackOffice -> Configuration.
Add new configuration: acme:figma.
Add your clientId and clientSecret keys with values from Figma.
Rate Limits:
Personal tokens: 1000 requests per hour
OAuth apps: 1000 requests per hour per user
Burst limit: 120 requests per minute
File access: Additional limits on large files
⚠️ File Access:
OAuth apps can only access files the user has permission to view
Team files require appropriate team membership
Private files require explicit sharing
⚠️ API Limitations:
Read-only API (cannot modify file content via API)
Comments and dev resources can be modified
File exports have size and complexity limits
⚠️ Webhook Delivery:
Webhooks may be delayed during high traffic
Implement proper retry logic for failed deliveries
Validate webhook signatures for security
Follow the next link:
The Redirect URL should be the URL where Microsoft will redirect the user after they authorize your app. This depends on your environment, usually in the following format: https://api.ACME.com/auth/microsoft/callback
The OneDrive file picker needs a specific redirect URI, which is used exclusively for configuring the OneDrive connector. This picker enables users to browse and choose files directly from their OneDrive storage. Use this format for the OneDrive picker redirect URI: `https://api.ACME.com/plugins/appmixer/microsoft/onedrive/picker
And select both of these options:
And save the changes:
The next step is creating clientId and clientSecret:
Unfortunately, the secret has an expiration, you're going to have to create a new one in 2 years:
Use the furthest date possible:
You will get a new secret, copy the Value into the clipboard:
This is the clientSecret, the Microsoft Secret ID is the Appmixer clientId. These secrets need to be added into the Backoffice:
And add new keys:
The clientId is the _Application (client) ID f_rom the main page:
Then go to the API permissions section:
Choose Microsoft Graph:
Delegated permissions:
Type-in Files:
And select these two:
Then type-in offline and select this permission:
The final set of permissions:
To enable custom tenant functionality for Microsoft connections, follow these steps:
Navigate to your Appmixer admin panel (back office) and go to Connector Configuration.
Find the "appmixer:microsoft" connector in the list
If it doesn't exist, add it by clicking the Add Configuration button
Click on "Show Configuration Values"
Click "Add Item" to create a new configuration entry
Set the following values:
Key: microsoftTenant
Value: true
Click Confirm to save the configuration
Note: This configuration enables the tenant field in the Microsoft connection interface.
Return to your flow and locate a Microsoft connector
Click "Connect account"
You should now see a "Tenant" field in the connection form
Enter your Tenant ID in the field
Custom Tenant ID: Enter your organization's specific tenant identifier
Default Behavior: Enter common to use Microsoft's default multi-tenant behavior
💡 Tip: If you're unsure about your Tenant ID, you can find it in the Azure Active Directory overview page in the Azure portal.
Simply remove the "microsoftTenant" from the Configuration Values or set its value to false
In 2020 Google introduced Application verification If an app uses Google APIs to access Google users’ data. This makes it impossible to use the Appmixer Google modules in production without the verification process. Such a verification process has to be done by you.
Most of the Google modules need what Google marks as Sensitive or Restricted Scope in order to work. For example, the Gmail module needs https://www.googleapis.com/auth/gmail.compose scope to create a new email and https://www.googleapis.com/auth/gmail.readonly to get new emails.
Originally, the Gmail module was the only one affected by this new Google policy. But new scopes are being marked as restricted. Later, they shut down the older Spreadsheets API, and with the new API, the only way to get a list of users Spreadsheets is to use the Drive API and restricted scope https://www.googleapis.com/auth/drive.metadata.readonly.
The last (up to now) module affected by this policy is the Drive module.
Go to the Google developer console at https://console.developers.google.com/ and create a new project.
When the project is created, add some APIs.
Add the Gmail API.
The Google Sheets API.
The Google Drive API.
The Google Calendar API.
The Analytics API.
The YouTube API.
The next step is the OAuth consent screen.
User Type - Internal vs External. The Internal user type allows you to use the Google modules without the app verification process mentioned at the beginning of this page. However, the modules will work only for accounts within your organization.
We are going to choose External for the purpose of this tutorial.
On the next page, leave the scopes empty.
You can add test users, but you can do this later. Only users added as test users will be able to authenticate!
Here is the Oauth consent screen configured. The app is in the testing mode, it is external (for users outside your organization). No more than 100 accounts (user cap) can be used with this application.
We need a client ID and a client secret.
Choose the Web application type and give it a name and authorize redirect URI.
For the purpose of this tutorial, we are going to use localhost:2200 which is the default port for the Appmixer API when running on localhost. If you are creating an Oauth application for your production/QA, the URI of your server will be here. The suffix /auth/google/callback will remain there.
You will get your Client ID and Client Secret.
They have to be inserted into the Appmixer. You can use the to do that.
By default the callback URL passed to Google is in the form of <your-api-url>/auth/appmixer:google/callback. However in some cases, you could need to pass a different callback URL. You can do this by inserting a callbackUrl value in the service configuration:
In order to use Google API Webhooks, you have to verify your domain ownership. More about domain verification can be found . If you use the Appmixer Self-Managed package and you run Appmixer on your own servers using your custom domain, you can use records to verify your domain ownership. Otherwise, if you are an Appmixer Hosted customer, you can use the to verify your Appmixer tenant domain (api.YOUR_TENANT.appmixer.cloud) at Google.
First, open the Google developers console and your Appmixer project and follow the instructions in the next picture.
Add your Appmixer tenant API URL (api.YOUR_TENANT.appmixer.cloud) and continue to verify the domain ownership. Click 'Take me there' and then 'Add a property'.
Again, use api.YOUR_TENANT.appmixer.cloud. Then download the HTML verification file.
After you download your HTML verification file, upload it via the Appmixer Backoffice interface to the Public Files section on the left. When you are done you should see your file listed:
Click the 'Verify' button to finish the verification process.
Now, you can go back to the developer console and add the api.YOUR_TENANT.appmixer.cloud domain once more. But this time, because it's already verified, it will appear in the list of your domains.
The new domain has to be added to the OAuth consent screen as well.
Create or upgrade to a Pinterest Business account at Pinterest Business
Navigate to the Pinterest Developers Portal
Sign in with your Pinterest Business account credentials
⚠️ Note: You need a Pinterest Business account to access the Pinterest API. Personal accounts cannot create apps.
Create a new app:
Go to in the developer portal
Click "Create app"
Fill in the application details:
App name (e.g., "My Pinterest Integration")
App Configuration:
App type: Choose between "Public" or "Internal"
Linked Business Account: Link to your Pinterest Business account
App Purpose: Specify how you'll use Pinterest data
Navigate to App Settings:
In your app dashboard, go to "OAuth" or "Settings" section
Configure OAuth redirect URIs
Set Redirect URIs:
Example:
Configure Scopes:
Select the permissions your app needs:
read_public - Read public boards and pins
write_public
After configuring your app, you'll find your API credentials:
App ID (Client ID) - Your application's unique identifier
App secret (Client Secret) - Your application's secret key
⚠️ Important: Keep your App Secret secure and never expose it in client-side code!
For Public Apps:
Submit for Review:
Public apps require Pinterest review before going live
Provide detailed use case description
Include screenshots and flow documentation
Go to the Appmixer BackOffice -> Configuration.
Add new configuration: acme:pinterest.
Add your clientId (App ID) and clientSecret (App Secret) keys with values.
Rate Limits:
Pinterest implements rate limiting per user and per app
Specific limits depend on your app's approval status and usage
Rate limit information is included in API response headers
⚠️ Business Account Required:
Only Pinterest Business accounts can create and manage apps
Personal accounts cannot access the Pinterest API
Convert your personal account to business if needed
⚠️ Content Policy:
Pinterest has strict content policies and community guidelines
All programmatically created content must comply with these rules
Violations can result in API access suspension
⚠️ Token Management:
Access tokens have expiration times
Implement proper token refresh logic
Store tokens securely and never expose them
⚠️ Attribution:
Display appropriate Pinterest branding when required
Follow Pinterest's brand guidelines
Include proper attribution for Pinterest content
The Appmixer PostHog connector uses Personal API Key authentication. No OAuth app registration is required — you only need to generate a Personal API key in your PostHog account and know your PostHog instance URL.
PostHog can be used in the cloud or self-hosted. Use the appropriate base URL:
US Cloud
https://us.posthog.com
EU Cloud
https://eu.posthog.com
Log in to your PostHog instance.
Click your avatar or name in the top-right corner and go to Settings.
In the left sidebar, navigate to User → Personal API Keys.
Click + Create personal API key.
PostHog Personal API keys are scoped — a request outside the key's scopes is rejected with 403. Grant the scopes for the components you plan to use:
The Make API Call component needs whichever scope the called endpoint requires. The New Action Event trigger needs no scope — PostHog pushes the events to its webhook URL.
When adding a PostHog component in Appmixer, you will be prompted to authenticate. Provide:
Appmixer will verify the credentials by calling GET /api/users/@me/ on your PostHog instance. Your account email will be used as the display name for the connection.
Make sure the Personal API Key is correct and has not been revoked.
Regenerate the key under Settings → User → Personal API Keys if needed.
Double-check the PostHog Host URL. It should include the protocol (https://) and no trailing slash.
For self-hosted instances, confirm the URL is publicly reachable from the Appmixer server.
API key missing required scope '…' — add the named scope to the key. Connecting the account fails this way when user:read is missing.
Compare the key's scopes with . Scopes of an existing key can be edited under Settings → User → Personal API Keys.
The key may not have access to the project — check its Organization & project access.
The Continue Each Component ends one pass of a sequential Each loop. Each (Sequential) → the steps for one item → Continue Each is the recommended way to build a loop in Appmixer; see Building a Loop.
It tells the Each component that the current item is done, so Each sends the next one. This keeps the items in order even when the steps in the loop take a varying amount of time. It can also add named values from the loop to the Result that Each emits on its done port once the loop is over, so you don't need Storage or Join Each to collect them.
Every row has two fields:
For example, with the rows id → ID of the created record and status → Status of the created record, the done port of Each emits:
A value that is empty for an item is added as null, so every entry has the same fields.
An item that timed out in Each has null as its whole entry, so the entries always line up with the items.
A row left completely empty is ignored. A row with a value but no name stops the component with an error.
Turn On Sequential in Each
Open the Each component and turn on Sequential.
Place Continue Each at the End of the Loop
Connect it after the last step that has to finish before the next item starts.
No Loop Waiting: If no sequential Each loop is waiting for the Correlation ID (the Each is not in sequential mode, or the loop already finished), the component just continues the flow.
Duplicates Are Ignored: If the loop body branches into two Continue Each components, or a confirmation arrives late for an item that already timed out, only the first confirmation of the current item counts.
Filtered Items: An item that never reaches Continue Each (for example filtered out by a Condition) holds the loop until Item Timeout of Each runs out. Route such items to Continue Each as well if you do not want to wait.
Before using beehiiv components in Appmixer, you need:
A beehiiv account on the Scale plan ($49/mo) or higher — the free Launch plan does not include API access
An API key generated from the beehiiv dashboard
Owner or Admin role in your beehiiv workspace
Sign up at https://app.beehiiv.com/signup.
Log into your beehiiv account at
Scroll down to Workspace Settings in the left sidebar
Click API
Click Create New Key
Enter a name for the key (e.g., "Appmixer Integration")
Click Create New Key
Copy the generated API key immediately
When adding a beehiiv component in Appmixer, you will be prompted to authenticate. Provide:
The API key is used as a Bearer token for all requests to the beehiiv API (https://api.beehiiv.com/v2).
The API key is incorrect or has been revoked. Generate a new API key from Workspace Settings > API in the beehiiv dashboard.
Make sure your API key has access to at least one publication. The beehiiv API scopes all operations under a publication — most components require a Publication ID.
Your beehiiv plan may not include API access. Verify you are on the Scale plan ($49/mo) or higher.
Sign in to your Linear workspace at
You need admin permissions in your Linear workspace to create applications
Navigate to your workspace settings
⚠️ Note: Only workspace administrators can create OAuth applications in Linear.
Go to and create a new app.
Name your application and select a workspace.
Then you receive your clientID, clientSecret and signingSecret.
After that create an App-Level Token with the following scopes: authorizations:read. This token is used to verify authorization of the user for incoming Events API requests from Slack: an event is delivered only to the triggers of the workspace it came from. The New Channel Message trigger requires it. Without it, the New User trigger receives a new user only when the trigger's owner is the installation named in the event, so other New User triggers of the same workspace miss it.
Sign in to your Square account at
Navigate to the
Create a developer account if you don't have one already
⚠️ Note: You need a Square business account to access production features. Sandbox is available for development.
Delete a contact by ID
CreateOpportunity
Create a new opportunity in a pipeline
FindOpportunities
Search opportunities by pipeline, status, etc.
UpdateOpportunity
Update an existing opportunity
CreateAppointment
Create a new appointment/event
ListPipelines
List all pipelines (used as dropdown source)
ListCalendars
List all calendars (used as dropdown source)
JSON2CSV Component
Overview
The JSON2CSV component converts a JSON file into a CSV format. This enables easier data handling for spreadsheet applications and data processing tools that require CSV input.
Input Parameters
fileId (string, required): The ID of the JSON file to be converted.
Output Parameters
fileId (string): The ID of the newly generated CSV file.
fileName (string): The name of the generated CSV file.
Instructions
Upload JSON File: Provide the fileId of the JSON file you wish to convert.
Processing: The component processes the input JSON and converts it into a structured CSV format.
Retrieve Output: The resulting CSV file's fileId and fileName are returned as output.












Enter a descriptive Label (e.g. Appmixer Integration).
Under Organization & project access, choose All access, or limit the key to the Organizations or Projects you want to use in Appmixer. The List Projects component and the project pickers only show projects the key can access.
Under Scopes, either pick the All access preset or grant the scopes listed in Required scopes below.
Click Create key.
Copy the generated key immediately — it will not be shown again.
annotation:write
Create Annotation
cohort:read
List Cohorts
feature_flag:read
List Feature Flags
query:read
Run Query
Your PostHog user may lack permissions for the requested project or resource.
Self-hosted
Your own instance URL (e.g. https://posthog.yourcompany.com)
user:read
Connecting the account (Appmixer verifies the key with GET /api/users/@me/) — always required
project:read
List Projects, the project pickers, Capture Event and Identify User (they read the project's API key)
person:read
Get Person, Find Persons
person:write
Delete Person
annotation:read
PostHog Host
Your PostHog base URL (from Step 1, no trailing slash)
Personal API Key
The key generated in Step 2
New Annotation trigger
DeleteSubscriber
Remove a subscriber (unsubscribe)
CreatePost
Create a new newsletter post
GetPost
Retrieve a post by ID
ListPosts
List all posts of a publication
ListPublications
List all publications in the workspace
ListAutomations
List automations for a publication
ListCustomFields
List custom fields of a publication
ListSegments
List segments of a publication
PostSent
Triggers when a post is published/sent
PostUpdated
Triggers when a post is updated
SurveyResponseSubmitted
Triggers when a survey response is submitted
API Key
The API key generated in Step 2
CreateSubscriber
Create a new subscriber for a publication
GetSubscriber
Retrieve a subscriber by ID
FindSubscriber
Find a subscriber by email address
ListSubscribers
List all subscribers of a publication
UpdateSubscriber
NewSubscriber
Triggers when a new subscriber signs up
SubscriberConfirmed
Triggers when a subscriber confirms via double opt-in
SubscriberDeleted
Triggers when a subscriber unsubscribes
SubscriberUpgraded
Triggers when a subscriber upgrades to premium
SubscriberDowngraded
Update an existing subscriber
Triggers when a subscriber downgrades from premium
Redirect URLs: Add your callback URL
Scopes: Select the permissions your app needs:
read_conversations - Read conversations and messages
write_conversations - Create and update conversations
read_contacts - Read contact information
write_contacts - Create and update contacts
read_teams - Read team information
And other scopes as needed for your integration
Webhook URL: Your endpoint to receive webhook notifications
Topics: Select events you want to subscribe to:
conversation.created
conversation.updated
contact.created
contact.updated
And others as needed
Webhook Security:
Note the Webhook Secret for verifying webhook signatures
Use this to validate that webhooks are coming from Intercom
Go to "Configure" -> "Authentication"
Generate a test access token if needed for development
API Testing:
Use the generated credentials to test API calls
Intercom API base URL: https://api.intercom.io/
Include Authorization: Bearer <access_token> header in requests
App Store Listing (optional):
If approved, your app can be listed in the Intercom App Store
Configure app store listing with screenshots and descriptions


App description - Describe your integration's purpose
App website - Your organization's website (optional)
Add your OAuth redirect URI in the "Callback URL" field
For Appmixer, set the redirect URI to:
Webhook access - Register and manage webhooks
Select appropriate scopes:
File content - Read file structure and content
File comments - Read and write comments
File dev resources - Access dev mode resources
Token Security:
Copy the token immediately (it won't be shown again)
Store securely and treat like a password
Tokens inherit your account permissions
FILE_UPDATE - File content changes
FILE_DELETE - File deletion
FILE_VERSION_UPDATE - New version created
LIBRARY_PUBLISH - Library component published
Webhook Payload Example:


App description - Describe what your integration does
Website URL - Your application's website
Platform - Select "Web" for most integrations
Add your callback URL in the "Redirect URIs" field
For Appmixer, set the redirect URI to:
read_secret - Read secret boards and pins (if authorized)
write_secret - Create secret boards and pins (if authorized)
read_users - Read user profile information
write_users - Update user profile information
Review Requirements:
Your app must comply with Pinterest's API policies
Demonstrate legitimate use of requested permissions
Show how user data will be handled responsibly


Map the Loop Variables
Set Correlation ID and Index to the correlationId and index variables of the Each item port.
Collect Results (Optional)
Add a row to Add to Result for every value you want to keep, and give it a name.
Use result on the done port of Each to work with all the collected values after the loop, for example to send a summary.
correlationId
string
Required. The correlationId of the Each component whose loop this component ends. It identifies the loop, so nested Each loops each need their own Continue Each.
index
number
Required. The index of the same Each component. It identifies the item that is done, so a repeated or late confirmation of another item is ignored.
result
expression
Optional. Add to Result: rows of Name and Value. Each item adds one entry to the result of Each: an object with one field per row.
Name
The name of the field in the result entry, for example id.
Value
The value of the field, usually a variable of a step inside the loop.
in
Receives the message of the last step of one loop pass.
out
Fires after the item has been confirmed, so the flow can continue after the loop body if needed.
correlationId
The correlation ID of the loop.
index
The index of the confirmed item.
https://[YOUR_API_BASE]/auth/intercom/callbackhttps://api.appmixer.com/auth/intercom/callbackhttps://[YOUR_API_BASE]/auth/figma/callbackhttps://api.appmixer.com/auth/figma/callback{
"event_type": "FILE_UPDATE",
"file_key": "ABC123",
"timestamp": "2023-01-01T12:00:00Z"
}https://[YOUR_API_BASE]/auth/pinterest/callbackhttps://api.appmixer.com/auth/pinterest/callback{
"count": 3,
"correlationId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"result": [
{ "id": "1001", "status": "created" },
{ "id": "1002", "status": "created" },
{ "id": "1003", "status": "created" }
]
}Navigate to API Settings:
Go to Settings → Account → API
Or visit: https://linear.app/[your-workspace]/settings/api
Create New Application:
Click "Create new" under OAuth applications
Fill in the application details:
Application name (e.g., "Appmixer Integration")
Description - Brief description of your integration
Website URL - Your organization's website
Callback URLs - OAuth redirect endpoints
Set Callback URLs:
Add your OAuth callback URL in the "Callback URLs" field
For Appmixer, set the redirect URI to:
Example:
Configure Scopes:
Linear uses specific scopes to control access:
read - Read access to issues, projects, teams, and users
write - Write access to create and update issues and comments
admin - Administrative access (use with caution)
Application Details:
Application name: Your integration name
Description: Purpose of your integration
Website: Your application or company website
After creating your application, you'll receive:
Client ID - Your OAuth application identifier
Client Secret - Your OAuth application secret (keep this secure!)
⚠️ Important: Store your Client Secret securely and never expose it in client-side code!
Linear supports webhooks for real-time updates:
Create Webhook:
In API settings, go to "Webhooks" section
Click "Create webhook"
Configure Webhook Settings:
URL: Your endpoint to receive webhook notifications
Label: Descriptive name for the webhook
Secret: Optional signing secret for verification
Select Resources:
Choose which resources trigger webhooks:
Issue - Issue creation, updates, deletion
Comment - Comment creation and updates
For server-to-server integrations, you can use personal API keys:
Generate Personal API Key:
Go to Settings → Account → API
Click "Create key" under Personal API keys
Add a descriptive label
Copy the generated key immediately (it won't be shown again)
⚠️ Note: Personal API keys have the same permissions as your user account.
Go to the Appmixer BackOffice -> Configuration.
Add new configuration: acme:linear.
Add your clientId and clientSecret keys with values from Linear.
Test OAuth Flow:
Linear authorization URL: https://linear.app/oauth/authorize
Required parameters: client_id, redirect_uri, response_type=code, scope
API Testing:
Linear GraphQL API endpoint: https://api.linear.app/graphql
Include Authorization: Bearer <access_token> header
Test with a simple query like fetching the viewer:
Linear uses GraphQL exclusively:
Common Queries:
Issues: issues, issue
Teams: teams, team
Projects: projects, project
Users: users, user
Common Mutations:
Create Issue: issueCreate
Update Issue: issueUpdate
Create Comment: commentCreate
Example Issue Query:
Rate Limits:
Complexity-based limiting: Each query has a complexity score
Maximum complexity: 1000 points per query
Rate limit: 2000 requests per hour per access token
Burst limit: 120 requests per minute
https://[YOUR_API_BASE]/auth/linear/callbackhttps://api.appmixer.com/auth/linear/callback{
viewer {
id
name
email
}
}{
issues(first: 10) {
nodes {
id
title
description
state {
name
}
assignee {
name
}
}
}
}Copy and paste those values into the Backoffice.
clientId is the Client ID from the Slack app.
clientSecret is the Client Secret from the Slack app.
authToken is the App-Level Token from the Slack app.
signingSecret is the Signing Secret from the Slack app (just under Client Secret).
The next thing is adding the redirect URL and scopes.
Example redirect URL: https://api.YOUR_SUBDOMAIN.appmixer.cloud/auth/slack/callback
In order to be able to send messages as bot to channels, you have to add these scopes in the OAuth & Permissions section, specifically in the Bot Token Scopes section.
chat:write
Send messages as @BOT
chat:write.customize
Send messages as @BOT with a customized username and avatar
chat:write.public
Send messages to channels @BOT isn't a member of
In order to be able to work with channels and groups as user, you have to add these scopes in the OAuth & Permissions section, specifically in the User Token Scopes section.
In order to use the application accross workspaces you have to distribute it.
Some components (New Channel Message or New User) use Slack Events API (https://api.slack.com/events-api). In order to use this components in Appmixer, you have to register Appmixer's Slack URI in Slack first.
Go to https://api.slack.com/apps then choose your Appmixer app.
Go to your app settings (https://api.slack.com/apps/{your-app-id}/event-subscriptions)
The Request URL has to point to your Appmixer backend server. The rest of the URL /plugins/appmixer/slack/events has to remain like this. Your Appmixer backend server has to be running before you enter the URL. Slack will immediately try to connect to that URL.
Then you need to subscribe to these events:
message.channels, message.groups for the New Channel Message component
team_join for the New User component
Don't forget to hit Save Changes:
You can now use the appmixer.slack.list.NewChannelMessageRT component in a flow.
In Appmixer 4.2 the Slack module was upgraded. We did remove all the legacy API and switched to their newest API. For some time, it was possible to use the Appmixer Slack module with both legacy Slack apps and the new Slack apps. But the legacy apps are deprecated and will retire in August 2021 (https://api.slack.com/legacy/workspace-apps). If you use the legacy Slack app, you either have to create a new Slack app or migrate the existing one.
In order to migrate your Slack legacy app, go to Oauth & Permission section.
Then scroll down to Scopes and hit the Update Scopes button.
Ignore the first page, because that's all about scopes for bots.
Scroll all the way down and hit continue. You get to a second page with user scopes.
Select channels:read, channels:history, channels:write, groups:read, groups:write, groups:history, chat:write and users:read.
Verify the scopes and migrate the app.
And confirm. The Appmixer Slack module since version 4.2.1 is already updated and ready for the new Slack apps.
Flows that use the SendPrivateChannelMessage component won't work. The component will appear unauthenticated. The reason is a different Oauth scope in the new Slack app version. In this case, the user has to authenticate the component again.
Configuration ID: appmixer:slack. See Connector Configuration for how to set it in the Backoffice.
clientId - the Client ID from Basic Information of the Slack app. Not needed with the Auth Hub.
clientSecret - the Client Secret from Basic Information of the Slack app. Not needed with the Auth Hub.
signingSecret - the Signing Secret from Basic Information. Verifies that Events API requests come from Slack; required for the New Channel Message and New User triggers. Not needed with the Auth Hub.
authToken - the App-Level Token with the authorizations:read scope. Scopes incoming events to the workspace they came from; required for New Channel Message and needed by New User to reach every trigger of the workspace. Not needed with the Auth Hub.
botToken - optional, legacy. A bot token (xoxb-...) used for messages sent as the bot when the account carries none; accounts connected with the Slack connector 4.1.4 or newer carry their own.



appmixer service-config set appmixer:slack -u -d '{
"clientId": "<Client ID>",
"clientSecret": "<Client Secret>",
"signingSecret": "<Signing Secret>",
"authToken": "<App-Level Token>"
}'Create a new application:
Go to Developer Dashboard
Click "Create your first application" or "+" to add a new app
Fill in the application details:
Application Name (e.g., "My Payment Integration")
Application Description - Describe your integration's purpose
Choose Environment:
Sandbox - For development and testing
Production - For live transactions with real money
Navigate to OAuth Tab:
In your application dashboard, click on "OAuth"
Configure OAuth settings for secure authentication
Set Redirect URIs:
Add your callback URL in the "Redirect URL" field
For Appmixer, set the redirect URI to:
Example:
Configure Permissions:
Select the Square API permissions your app needs:
PAYMENTS_READ - Read payment information
PAYMENTS_WRITE - Process payments
ORDERS_READ - Read order information
ORDERS_WRITE - Create and update orders
CUSTOMERS_READ - Read customer profiles
CUSTOMERS_WRITE - Create and update customers
INVENTORY_READ - Read inventory information
ITEMS_READ - Read catalog items
After configuring your application, you'll find your API credentials:
Application ID - Your OAuth application identifier
Application Secret - Your OAuth application secret
Access Token - For server-to-server API calls (if using personal access token)
⚠️ Important: Keep your Application Secret secure and never expose it in client-side code!
If your integration needs real-time updates:
Navigate to Webhooks:
In your application dashboard, click on "Webhooks"
Click "Add Endpoint"
Configure Webhook Settings:
Notification URL: Your endpoint to receive webhook notifications
Events: Select events you want to subscribe to:
payment.created
payment.updated
order.created
Webhook Security:
Square signs webhook requests with a signature
Use the provided webhook signature key to verify authenticity
Go to the Appmixer BackOffice -> Configuration.
Add new configuration: acme:square.
Add your clientId (Application ID) and clientSecret (Application Secret) keys with values.
Test OAuth Flow:
Use your Application ID to initiate OAuth authorization
Square authorization URL: https://connect.squareup.com/oauth2/authorize
Required parameters: client_id, redirect_uri, response_type=code, scope
API Testing:
Square API base URLs:
Sandbox: https://connect.squareupsandbox.com/
Production: https://connect.squareup.com/
Rate Limits:
API calls: 10 requests per second per access token
Webhooks: No specific rate limits, but implement proper handling
Payment processing: Additional limits may apply based on your Square account
https://[YOUR_API_BASE]/auth/square/callbackhttps://api.appmixer.com/auth/square/callback























































The Apigee connector allows you block requests from specific IP addresses. To make the integration work, you need to
register Google OAuth2 application
perform setup in Apigee instance
In 2020 Google introduced Application verification If an app uses Google APIs to access Google users’ data. This makes it impossible to use the Appmixer Google modules in production without the verification process. Such a verification process has to be done by you.
Most of the Google modules need what Google marks as Sensitive or Restricted Scope in order to work. For example, the Gmail module needs https://www.googleapis.com/auth/gmail.compose scope to create a new email and https://www.googleapis.com/auth/gmail.readonly to get new emails.
www.googleapis.com/auth/cloud-platform (sensitive scope)
The connector requires the following IAM permission. This is the end-user permission needed to use the connector:
apigee.keyvaluemapentries.get
apigee.keyvaluemapentries.create
apigee.keyvaluemapentries.update
apigee.environments.list (Optional. Used to display a list of Apigee environments, allowing the user to easily select the desired environment in the Designer.)
Go to the Google developer console at and create a new project.
Next, enable the required APIs for your project. Go to you project APIs & Services > Enable APIs & service and click on the Enable APIs and Services button. Enable the following APIs:
Apigee API: apigee.googleapis.com
Api HUB API: apihub.googleapis.com
Service Networking: servicenetworking.googleapis.com
Compute Engine: compute.googleapis.com
Cloud Key Management Service (KMS): cloudkms.googleapis.com
source:
The next step is the OAuth consent screen.
User Type - Internal vs External. The Internal user type allows you to use the Google modules without the app verification process mentioned at the beginning of this page. However, the modules will work only for accounts within your organization.
We are going to choose External for the purpose of this tutorial.
On the next page, leave the scopes empty.
You can add test users, but you can do this later. Only users added as test users will be able to authenticate!
Here is the Oauth consent screen configured. The app is in the testing mode, it is external (for users outside your organization). No more than 100 accounts (user cap) can be used with this application.
We need a client ID and a client secret.
Choose the Web application type and give it a name and authorize redirect URI.
For the purpose of this tutorial, we are going to use localhost:2200 which is the default port for the Appmixer API when running on localhost. If you are creating an Oauth application for your production/QA, the URI of your server will be here. The suffix /auth/google/callback will remain there.
You will get your Client ID and Client Secret.
They have to be inserted into the Appmixer. You can use the to do that.
By default the callback URL passed to Google is in the form of <your-api-url>/auth/apigee/callback. However in some cases, you could need to pass a different callback URL. You can do this by inserting a callbackUrl value in the service configuration:
In order to use Google API Webhooks, you have to verify your domain ownership. More about domain verification can be found . If you use the Appmixer Self-Managed package and you run Appmixer on your own servers using your custom domain, you can use records to verify your domain ownership. Otherwise, if you are an Appmixer Hosted customer, you can use the to verify your Appmixer tenant domain (api.YOUR_TENANT.appmixer.cloud) at Google.
First, open the Google developers console and your Appmixer project and follow the instructions in the next picture.
Add your Appmixer tenant API URL (api.YOUR_TENANT.appmixer.cloud) and continue to verify the domain ownership. Click 'Take me there' and then 'Add a property'.
Again, use api.YOUR_TENANT.appmixer.cloud. Then download the HTML verification file.
After you download your HTML verification file, upload it via the Appmixer Backoffice interface to the Public Files section on the left. When you are done you should see your file listed:
Click the 'Verify' button to finish the verification process.
Now, you can go back to the developer console and add the api.YOUR_TENANT.appmixer.cloud domain once more. But this time, because it's already verified, it will appear in the list of your domains.
The new domain has to be added to the OAuth consent screen as well.
Shared flows in Apigee allow you to create reusable policies that can be applied across multiple API proxies. Blocking IP Shared Flow is a shared flow that blocks requests from specific IP addresses.
To install the Blocking IP Shared Flow and apply the Shared flow in any Proxy API, follow these steps:
Get the bundle:
Upload bundle Go to Apigee and navigate to the Shared Flows section, then click on the Upload Bundle icon to upload a new shared flow bundle.
Deploy the shared flow
Once deployed, go to you API proxy and add the shared flow to the preflow of the proxy endpoint.
API Proxy > Open your proxy > DEVELOP
Navigate to Policies and click on the plus icon to add a policy.
Select the Flow Callout
Enter any name and display name, for example FC-blocking-ip-shared-flow
To apply the policy, go to Proxy Endpoints and select the PreFlow tab.
Click on the plus icon to add the policy step.
Select the policy you just created: FC-blocking-ip-shared-flow
Save the changes, deploy the API proxy and you are done.
The Blocking IP Shared Flow uses the Apigee Key Value Map (KVM) to store the blocked IP addresses.
to create a KVM, follow these steps:
Go to Management > Environments > {env} > Key Value Maps
click on the Create Key Value Map button
name the KVM as apigee-blocked-ips
appmixer.ai.mcptools
The MCP Gateway component (appmixer.ai.mcptools.MCPGateway, category AI > MCP Tools) turns an Appmixer flow into a set of tools for MCP clients such as Claude Code, Claude Desktop, Cursor, VS Code or Windsurf. Every action component you connect to its tool output port becomes a tool that the model can call.
The MCP client doesn't connect to the gateway directly. It runs the Appmixer MCP Server (appmixer-mcp) on your computer, and that server finds the gateways in your running flows and forwards tool calls to them. You don't need to register an OAuth app. The MCP server signs in as an Appmixer user.
When a flow with the MCP Gateway starts, the gateway builds tool definitions from the components on its tool port. It then registers them with its webhook URL for the owner of the flow.
appmixer-mcp reads the gateways registered for the user it signs in as (GET /plugins/appmixer/ai/mcptools/gateways) and offers their tools to the MCP client. It also listens for gateways being added or removed (/plugins/appmixer/ai/mcptools/events).
When the model calls a tool, appmixer-mcp sends the call to the gateway webhook. The gateway runs the component and returns its output as the tool result.
The MCP Tools module (appmixer.ai.mcptools) installed on your Appmixer tenant. Its plugin provides the endpoints above.
Node.js 20 or newer on the computer where the MCP client runs.
The API URL of your tenant, e.g. https://api.YOUR_TENANT.appmixer.cloud. This is not the URL of the Studio.
An Appmixer user.
Create a flow and add MCP Gateway from AI > MCP Tools.
Connect the action components you want to expose to the gateway's tool output port. You can also connect Appmixer MCP servers (appmixer.mcpservers.*). Each tool of an MCP server becomes a separate tool.
Configure each connected component:
What the model sees:
Tool name: <short component ID>_<component name>, e.g. 2oRMgurHVxbLEUavJPTjmE_Create_support_ticket. Characters other than letters, digits and _ are replaced with _, and the name is limited to 64 characters.
Tool description: the description of the component type.
Parameter description:
The out port of the gateway sends one message when the flow starts: the webhook URL, the component ID, the flow ID and the list of tools. MCP clients don't need it. Use it when the rest of the flow needs to know the gateway, for example to send its webhook URL somewhere.
appmixer-mcp signs in with an access token, or with a username and password.
Access token: get one by signing in through the API. The response contains token.
The token expires after the period set in GRIDD_JWT_TOKEN_EXP (30 days by default). After that you have to replace it in the client configuration.
Username and password: appmixer-mcp gets the token by itself and gets a new one when it expires. This is the better choice for a setup that runs for a long time.
appmixer-mcp reads these environment variables:
APPMIXER_BASE_URL (required): the API URL of your tenant.
APPMIXER_ACCESS_TOKEN: the access token. Required unless you set the username and password.
APPMIXER_USERNAME, APPMIXER_PASSWORD: the credentials used to get and renew the token.
Put the options after the server name and the command after --.
-s user adds the server to all your projects. Leave it out to add it to the current project only.
Run /mcp in Claude Code to see the status of the server and its tools.
More in the Claude Code documentation: .
Open Settings > Developer and click Edit Config. This opens claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Cursor, VS Code, Windsurf and other MCP clients run the same command (npx -y appmixer-mcp) with the same environment variables. The shows the configuration for each of them.
In Claude Code, /mcp lists the appmixer server with the tools of your running gateways.
Without an MCP client, list the gateways registered for your user:
Each running gateway is one entry with flowId, componentId, webhook and tools.
A tool call runs the component with the connected accounts of the flow owner. Anyone who has the token or the credentials used by appmixer-mcp can call the tools.
Expose only the actions you are fine with the model running. Set the fields that must not change (e.g. a recipient or a project) as fixed values instead of leaving them to the model.
The server doesn't start with "Base URL is required" or "Either access token or username and password are required". The client configuration is missing APPMIXER_BASE_URL, or both the token and the username and password.
The server runs but offers no gateway tools.
The flow with the gateway isn't running.
More about local MCP servers: .
You need to create a developer account first (more about different Hubspot accounts can be found herehttps://developers.hubspot.com/docs/api/account-types)
Create a new application.
In order to get rid of a warning that your users will see before installing Hubspot module, you have to verify your identity as an app provider.
You can manage the Contact & Support settings.
Or skip for now.
Set the application name, logo, and description.
Go to the Auth tab and copy&paste these values into the .
Create Hubspot configuration in the .
Go back to Hubspot and set the redirect URL, replace acme.com with your domain and keep the suffix /auth/hubspot/callback
Adding scopes.
The HubSpot connector (bundle 4.8.0+) requests the following scopes in the authorization URL:
All of them must be added to the app, otherwise the authorization fails on an unconfigured scope.
Hit Save.
One more thing you will need is the HubSpot developer API key: go back to the Apps page and hit the Get HubSpot API key button (in the newer developer account UI the key is in the developer overview).
Then copy&paste the generated key and put it into the .
The Hubspot configuration in the Backoffice holds these values:
clientId and clientSecret — from the app's Auth tab. The clientSecret also verifies the signature of the webhook requests (see ).
appId — the app ID, shown on the app's Auth tab (it is also the number in the app's URL).
apiKey
The triggers New Contact, Updated Contact, Contact Property Changed, Deleted Contact, New Deal and Updated Deal receive events through the app's webhooks. New Contact In List and Form Submission poll the API and need no webhook.
Set the app's webhook target URL (the app's Webhooks settings) to your Appmixer API URL followed by /plugins/appmixer/hubspot/events, for example https://api.acme.com/plugins/appmixer/hubspot/events.
If the app has no target URL yet, the connector sets it when a trigger starts for the first time — that first start still fails, start the flow again. A target URL that points elsewhere is never overwritten: the triggers then fail to start with HubSpot webhook not configured properly, wrong target URL.
Leave Use expanded object support turned off. The connector works with the classic contact.* and deal.* subscription types.
Since bundle 4.9.1 the /plugins/appmixer/hubspot/events route accepts only requests signed by HubSpot. It checks the X-HubSpot-Signature-v3 header against the clientSecret from the Hubspot configuration in the Backoffice and rejects requests older than 5 minutes. Requests without a valid signature are answered with 401 and trigger no flow.
The clientSecret in the Backoffice must be the secret of the app that sends the webhooks. If you rotate the secret in HubSpot, update the Backoffice configuration too. Otherwise the triggers stop receiving events.
HubSpot signs the full target URL it calls. Use your public Appmixer API URL as the target URL, exactly as described above, with the same scheme and host and no extra path or trailing slash. If a proxy sits in front of the Appmixer API, it must pass the original Host (or X-Forwarded-Host and X-Forwarded-Proto) headers through.
HubSpot sends an event only for a subscribed event type, and a property change only for a subscribed property — there is no "any property" subscription. Subscriptions belong to the app and apply to every portal that installed it; one app can have at most 1000 of them.
When a trigger starts, the connector creates the subscriptions it needs and turns back on the ones that were switched off (bundle 4.9.0+):
New Contact — contact.creation
Deleted Contact — contact.deletion
Updated Contact — contact.propertyChange for email, firstname
Updated Contact and Updated Deal fire on a change of any subscribed property. To make them react to another property — a custom property, or a standard property outside the lists above — add a Property changed subscription for it in the app's webhook settings. Use the property's internal name (not its label) and make sure the subscription is active. Because subscriptions are shared by all portals, a subscription for a standard HubSpot property makes Updated Contact / Updated Deal fire on that property for every user of the app. To react to a single property only, use Contact Property Changed.
With AuthHub, the Appmixer instances share the AuthHub's HubSpot app and the connector does not manage that app's subscriptions — the instance's HubSpot configuration needs no appId or apiKey. Whoever administers the app adds and activates the subscriptions — including Property changed subscriptions for custom properties — in its webhook settings. The app's target URL points at the AuthHub's /plugins/appmixer/hubspot/events route, so the AuthHub verifies the : its Hubspot configuration must hold the app's clientSecret. Contact Property Changed then only filters the events; it cannot add a subscription for its property.
Your domain is unverified Until your domain is set and verified, users will see a warning when installing your app.
Users will encounter this warning during the installation or management of the app. To eliminate this warning, the verification process must be completed. HubSpot mandates the configuration of a DNS TXT record as the sole method for verification.
To configure and verify a custom HubSpot app for a hosted instance of Appmixer, such as ACME.appmixer.cloud, you will need to establish a custom domain for the Appmixer instance (for example, ACME.com). Without this custom domain, domain verification will not be possible.
The Each Component iterates over a list and outputs a new message for each item.
The recommended way to build a loop in Appmixer is Each with Sequential turned on, the steps you want to run for every item, and the Continue Each component at the end:
Each (Sequential) ──item──▶ step ▶ step ▶ Continue Each
│
└──done──▶ steps after the loop (use the collected result)Each sends one item, waits until Continue Each confirms it, and only then sends the next one. The items are processed one at a time and in order, and every item can add values to the loop's Result. Once all items are done, the done port emits the result, one entry per item. You don't need Storage or Join Each to collect it.
Running items in parallel (without Sequential) is still possible, see Other Options (Advanced).
Provide a List
Set Field (list) to an array, or to a string with a valid JSON array.
Turn On Sequential
Leave Item Timeout at its default (300 seconds) unless one item can take longer.
Add the Steps for One Item
Connect them to the item port. Use the value variable of the item port for the current item.
End the Loop with Continue Each
Connect after the last step that has to finish before the next item starts.
Map its Correlation ID and Index to the correlationId and index variables of the item port.
Collect Results (Optional)
In Continue Each, add a row to Add to Result for every value you want to keep, for example id → ID of the created record.
Continue After the Loop
Connect the steps that should run once all items are done to the done port. The collected values are in result.
If an item is not confirmed within Item Timeout (a step failed, or a Condition filtered the item out before Continue Each), the loop moves on to the next item instead of stopping. That item's entry in result is null.
Example of result for a loop that created a record for every item, where the second item timed out:
Parallel processing (Sequential off): all items are sent right away. This is faster, but when the steps after Each take a varying amount of time, faster items overtake slower ones, so the items leave the loop in a different order. result on the done port is empty, and done fires as soon as all items have been sent, not processed. To collect the processed items, use with the correlationId and count of Each.
Delay without Sequential
Supports JSON Parsing: If list is a string, it will attempt to parse it as JSON.
State Persistence: Keeps track of progress and resumes processing if interrupted.
Nested Loops: Every sequential Each needs its own Continue Each, mapped to its own correlationId and index.
https://core.telegram.org/bots
The Appmixer Telegram connector talks to the Telegram Bot API and authenticates with a Bot Token. There is no OAuth app to register — you create a bot with @BotFather inside Telegram, copy its token and paste it into Appmixer.
A bot only sees chats it is a member of. To read public channels you do not own, use the Telegram User connector, which signs in as a user account.
Open Telegram (mobile or desktop) and search for @BotFather — the account with the blue verified checkmark.
Start the chat and send /newbot.
Enter a display name for the bot (e.g. Appmixer Notifier). This is what users see in the chat header.
Enter a username for the bot. It must be unique and end with bot (e.g. appmixer_notifier_bot).
BotFather replies with the token, in the form:
Copy the token — you will paste it into Appmixer in Step 3.
If the bot already exists, send /mybots to @BotFather, pick the bot and choose API Token. If the token has leaked, use Revoke current token — the old token stops working immediately and every Appmixer connection using it must be updated.
Telegram restricts what a bot can see and do. Set this up before building flows, otherwise triggers stay silent and sends fail with 403.
A bot cannot start a conversation. The user must open the chat with the bot and press Start (/start) at least once. Only after that can the bot send messages to that user.
Add the bot to the group like any other member.
By default Group Privacy is on, which means the bot only receives messages that are commands (/command), replies to its own messages, or that mention @yourbot.
To receive all group messages, send /mybots to @BotFather → select the bot → Bot Settings → Group Privacy → Turn off.
Add the bot to the channel as an administrator. Posting to a channel requires the Post Messages right; the New Message trigger only receives channel posts when Include Channel Posts is enabled and the bot administers the channel.
When you add a Telegram component to a flow, Appmixer asks you to authenticate:
Appmixer verifies the token with a getMe call and names the connection after the bot's username (e.g. @appmixer_notifier_bot), so it is easy to tell several bots apart.
Every Telegram component takes a Chat ID. There are two accepted forms:
The simplest way to obtain it: build a flow with the New Message trigger, leave Chat ID empty, send a message to the bot (or in the group) and read chat.id from the trigger output.
The New Message and New Callback Query triggers are webhook-based. When a flow starts, Appmixer calls setWebhook and points the bot at your Appmixer instance.
Things worth knowing:
Telegram allows exactly one webhook per bot. Every Appmixer Telegram trigger of the same bot shares that single registration. Do not use the same bot in another platform (Make, n8n, a custom script) or with getUpdates polling — whoever registers last wins, and the other side stops receiving updates and may see 409 Conflict.
Stopping a flow does not remove the webhook, because sibling flows using the same bot may still need it. An unused registration is harmless — updates arrive, match no listener and are dropped.
Your Appmixer instance must be reachable from the internet over HTTPS with a certificate Telegram accepts. This matters for self-managed installations: Telegram will not deliver updates to
The bot token is invalid or was revoked. Get the current token from @BotFather (/mybots → API Token) and update the Appmixer connection.
The bot is not a member of the chat, or was removed from it.
The user blocked the bot, or never pressed Start in a private chat (a bot cannot message a user first).
The bot lacks the required admin right — e.g. posting to a channel without Post Messages.
The Chat ID is wrong. Use @channelusername for public chats, or the numeric ID (negative for groups, prefixed with -100 for supergroups and channels). Note that a private group's ID is not visible in the Telegram UI — read it from the New Message trigger output.
Another process is polling this bot with getUpdates, or a different webhook is registered for it. Use a dedicated bot for Appmixer.
Telegram's flood control kicked in. The error carries a retry_after value in seconds. Reduce the send rate, or split the traffic across several bots and chats.
In a group, Group Privacy is still on, so the bot only sees commands, replies and mentions — turn it off in @BotFather and re-add the bot to the group.
For channel posts, the bot is not an administrator, or Include Channel Posts is off on the trigger.
Another system took over the bot's webhook — see the 409 note above.
The Appmixer instance is not publicly reachable over HTTPS, so Telegram cannot deliver the update.
Sign up at and log in to the developer portal.
Go to Build Apps → Create and fill in:
Application Name: anything you want.
Application Audience: Clinicians or Administrative Users (the connector uses user/*.read SMART scopes).
App admin url:
Once the app admin account is created and verified you need to create an instance.
It will take a minute or two or three or five to complete.
Now your developer instance is ready and accessible: . Note that when creating a new account, your instance ID (dev180380 in this case) will be different.
To configure webhooks in ServiceNow to receive notifications when a new record is created, follow these steps. This involves creating an Outbound REST Message, setting up a Business Rule to capture record creation, and configuring the webhook.
Since connector version 4.0.0 the triggers (New Record, Updated Record, Deleted Record) only receive events that carry the connection's Webhook Secret.
Project - Project changes
ProjectUpdate - Project status updates


















order.updated
customer.created
customer.updated
Include Authorization: Bearer <access_token> header in requests
Test with endpoints like /v2/locations to verify authentication

appmixer-mcpFields the model fills: insert the Model Defined Parameter variable of the tool port. These fields become the parameters of the tool.
Fixed fields: type the value. It's sent on every call and the model can't change it.
Variables from other components don't work here. A tool call runs only the connected component, so these values never exist, and the gateway ignores such fields.
Rename each connected component to say what the tool does, e.g. Create support ticket. The name becomes part of the tool name.
Start the flow. The tools exist only while the flow is running.
TOOLS: which tools to offer, api,mcpgateway by default.
mcpgateway: the tools of your MCP Gateways.
api: tools that manage your flows. They list, start, stop and delete flows, trigger components, send app events and read flow logs.
Add the server:
Quit Claude Desktop and start it again. Settings > Developer shows the appmixer server and whether it's running.
appmixer-mcpTOOLS doesn't include mcpgateway.
The MCP Tools module isn't installed on the tenant. The gateways request in Check the connection returns 404.
The tools don't change after a flow starts or stops. appmixer-mcp notifies the client, but not every client reloads its tool list. Reconnect the server (/mcp in Claude Code) or restart Claude Desktop.
Requests fail with "Unauthorized". The access token has expired. Get a new one, or set the username and password instead.
A tool call fails with "Failed to fetch … Not Found". The flow was stopped, or the client is using an old tool list. Reload the tools as described above.
A tool returns "Error calling tool …". The component itself failed, e.g. because a required field is empty or a connected account has expired. The text includes the error of the component, and the flow logs in Appmixer have the details.
Tools of a deleted flow are still listed. If a flow is removed without its gateway being stopped, the gateway stays registered. Remove it:
Server logs: Claude Desktop writes the output of the server to ~/Library/Logs/Claude/mcp-server-appmixer.log on macOS and %APPDATA%\Claude\logs\ on Windows.
number
Optional. Delay between items in milliseconds (at most 60000). In sequential mode it is an extra pause before each next item, for example to stay within an API rate limit.
list
array / string
The list to iterate over. If a string is provided, it must be a valid JSON array.
sequential
boolean
Send the next item only after the previous one has been confirmed by Continue Each. Off by default. Turn it on for the recommended loop.
itemTimeout
number
Sequential mode only. How long (in seconds) to wait for Continue Each to confirm an item before the loop moves on to the next one. Default 300, minimum 60.
in
Receives the list to iterate over.
item
Emits each item from the list with additional metadata.
done
Fires after all items have been processed, with the total count, the correlation ID and the collected result.
index
The index of the current item in the list.
value
The value of the current item.
count
Total number of items in the list.
correlationId
Unique identifier of this loop run.
count
The total number of processed items.
correlationId
Unique identifier of this loop run.
result
One entry per item, in item order: an object with the fields that Continue Each added for that item, {} when it added none, or null for an item that was skipped after Item Timeout. Always an empty list when Sequential is off.
delay
localhostEach update is verified with a secret token Telegram sends in the X-Telegram-Bot-Api-Secret-Token header, so forged requests to the webhook URL are rejected.
Bot Token
The token from Step 1
Public channel or public group
@channelusername
Private chat
Numeric user ID, e.g. 6412345678
Group
Negative number, e.g. -987654321
Supergroup / channel
Negative number starting with -100, e.g. -1002345678901
Messages per second (all chats)
~30 — Appmixer throttles to 25/s so the bot does not trip flood control
Messages per minute per group
~20, enforced by Telegram
Send Photo upload size
10 MB
Send Document upload size
50 MB
Get File download size
20 MB (Bot API limit)
{
"mcpServers": {
"appmixer": {
"command": "npx",
"args": ["-y", "appmixer-mcp"],
"env": {
"APPMIXER_BASE_URL": "https://api.YOUR_TENANT.appmixer.cloud",
"APPMIXER_USERNAME": "you@example.com",
"APPMIXER_PASSWORD": "YOUR_PASSWORD",
"TOOLS": "mcpgateway"
}
}
}
}curl -s -X DELETE "https://api.YOUR_TENANT.appmixer.cloud/plugins/appmixer/ai/mcptools/gateways/COMPONENT_ID?flowId=FLOW_ID" \
-H "Authorization: Bearer YOUR_TOKEN"curl -s -X POST https://api.YOUR_TENANT.appmixer.cloud/user/auth \
-H 'Content-Type: application/json' \
-d '{"username":"you@example.com","password":"YOUR_PASSWORD"}'claude mcp add appmixer -s user \
-e APPMIXER_BASE_URL=https://api.YOUR_TENANT.appmixer.cloud \
-e APPMIXER_ACCESS_TOKEN=YOUR_TOKEN \
-e TOOLS=mcpgateway \
-- npx -y appmixer-mcpcurl -s https://api.YOUR_TENANT.appmixer.cloud/plugins/appmixer/ai/mcptools/gateways \
-H "Authorization: Bearer YOUR_TOKEN"[
{ "id": "1001", "status": "created" },
null,
{ "id": "1003", "status": "created" }
]123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsawapigee.keyvaluemaps.create (Optional. If this permission is not granted, you will need to manually create a Key Value Map (KVM) in Apigee; see the KVM storage section for instructions. If the permission is granted, the connector will automatically create the KVM.)
Select the shared flow deplyed in the previous step: blocking-ip-shared-flow
hit Create




























hubspot-plugin-route-webhook-invalid-signature, hubspot-plugin-route-webhook-missing-signature, hubspot-plugin-route-webhook-expired-timestamp or hubspot-plugin-route-webhook-missing-client-secret.lastnamephonewebsitecompanyaddresscitystatezipContact Property Changed — contact.propertyChange for the property selected in the trigger (custom properties included)
New Deal — deal.creation
Updated Deal — deal.propertyChange for dealname, dealstage, pipeline, hubspot_owner_id, closedate and amount
oauth
automation
e-commerce
forms
timeline
tickets
media_bridge.read
sales-email-read
crm.lists.read
crm.lists.write
crm.objects.companies.read
crm.objects.companies.write
crm.objects.contacts.read
crm.objects.contacts.write
crm.objects.deals.read
crm.objects.deals.write
crm.objects.owners.read
crm.schemas.companies.read
crm.schemas.companies.write
crm.schemas.contacts.read
crm.schemas.contacts.write
crm.schemas.custom.read
crm.schemas.deals.read
crm.schemas.deals.write












SMART on FHIR Version: R4.
Redirect URI: depends on your environment, usually in the following format: https://api.qa.appmixer.com/auth/epic/callback
This is the most important step. Epic authorizes each FHIR interaction separately — for every resource there is a .Read and a .Search API, often split further by use-case category. If a .Search API is missing, the corresponding connector component fails with 403 insufficient_scope even though authentication succeeds.
Select all (R4) variants (ignore DSTU2 and STU3) of both .Read and .Search for the resources below. The table shows which connector component depends on which API:
GetAppointment, NewAppointment, UpdatedAppointment, CancelledAppointment
Appointment.Read, Appointment.Search — select all R4 variants
FindPatients, GetPatient
Patient.Read, Patient.Search
FindConditions
Condition.Read (Problems), Condition.Search (Problems) — select all other Condition.* R4 variants too (Encounter Diagnosis, Health Concern, …)
FindVitalSigns
Observation.Read (Vitals), Observation.Search (Vitals)
The exact labels can differ slightly between Epic portal versions — when in doubt, select every (R4) variant of the resource.
The Epic UI lists available APIs alphabetically. Work through this list top to bottom (all items are the (R4) variants):
If a label from the list does not exist exactly (e.g. Observation.Search (Smoking History) (R4) instead of Social History), pick the closest (R4) variant of the same resource and interaction.
After saving the app, Epic shows a Non-Production Client ID and a Production Client ID. Use the non-production ID against the Epic sandbox (https://fhir.epic.com/interconnect-fhir-oauth).
If you generate a client secret, Epic requires HTTP Basic authentication at the token endpoint (the connector handles this automatically). Without a secret the app acts as a public client — this works in the sandbox, but Epic may not issue a refresh token, so users must re-authenticate when the access token expires (1 hour).
The last step is to configure the client ID and client secret in the Appmixer Backoffice for appmixer:epic.
The public sandbox (fhir.epic.com) is only for development. Real patient data lives in the Epic instances of individual healthcare organisations — there is no central production API. Going live means:
Mark the app "Ready for Production" on fhir.epic.com. This activates the Production Client ID (so far you have been using the non-production one).
Get activated by each healthcare organisation. For apps with the Clinicians or Administrative Users audience (this connector — user/*.read scopes) the gatekeeper is the Epic customer, not Epic itself. Each organisation typically requires a business agreement and a HIPAA Business Associate Agreement (BAA), runs its own security & privacy review, and then activates your Production Client ID in their Epic environment, including the list of allowed APIs (their counterpart of your Incoming APIs selection). Epic's paid Vendor Services program (successor of App Orchard) and the Connection Hub/Showroom listing make this process smoother when distributing to multiple customers, but do not replace per-organisation activation.
Point the connector at the organisation's endpoints. Every Epic customer hosts its own FHIR and OAuth endpoints (see the public endpoint directory on ). Configure in the Appmixer Backoffice for appmixer:epic:
clientId / clientSecret — the Production Client ID (and secret, if issued).
epicFhirBaseUrl — the organisation's FHIR R4 base URL, e.g. https://ehr.hospital.org/interconnect-prd/api/FHIR/R4.
Users authenticate with their clinical (EHR) credentials of that organisation. What they can see in patient charts is governed by their Epic user role and the APIs the organisation enabled — the connector never grants more access than the organisation allows. Existing accounts must re-authenticate after any endpoint or app change.
Compliance. Once real PHI flows through Appmixer, the deployment itself must satisfy HIPAA requirements (BAA between you and the customer, encryption, audit logging, data retention). Plan this on the deployment side; no connector change is involved.
A practical rollout path: pilot with one partner organisation against their non-production environment first (every Epic customer has TST/POC instances — an intermediate step between the public sandbox and production), then request production activation.
Epic provides test users for the sandbox, e.g. provider login FHIR / EpicFhir11!. Test patient: Camila Lopez (erXuFYUfucBZaryVksYEcMg3). See https://fhir.epic.com/Documentation?docId=testpatients for the full list.
Appointment.Read (Appointments) (R4)
Appointment.Read (Prior Auth) (R4)
Appointment.Search (Appointments) (R4)
Appointment.Search (Prior Auth) (R4)
CarePlan.Read (Longitudinal) (R4)
CarePlan.Search (Longitudinal) (R4)
Condition.Read (Problems) (R4)
Condition.Search (Problems) (R4)
Device.Read (Implants) (R4)
Device.Search (Implants) (R4)
DiagnosticReport.Read (Results) (R4)
DiagnosticReport.Search (Results) (R4)
DocumentReference.Read (Clinical Notes) (R4)
DocumentReference.Search (Clinical Notes) (R4)
Goal.Read (Patient) (R4)
Goal.Search (Patient) (R4)
Immunization.Read (R4)
Immunization.Search (R4)
Medication.Read (R4)
MedicationRequest.Read (Orders) (R4)
MedicationRequest.Search (Orders) (R4)
Observation.Read (Labs) (R4)
Observation.Read (Social History) (R4)
Observation.Read (Vitals) (R4)
Observation.Search (Labs) (R4)
Observation.Search (Social History) (R4)
Observation.Search (Vitals) (R4)
Patient.Read (R4)
Patient.Search (R4)
Procedure.Read (Orders) (R4)
Procedure.Read (Surgeries) (R4)
Procedure.Search (Orders) (R4)
Procedure.Search (Surgeries) (R4)Generate a random string of at least 16 characters, for example with openssl rand -base64 24.
Enter it in the Webhook Secret field when you connect the ServiceNow account in Appmixer. The triggers refuse to start without it.
Send the same value in the X-Appmixer-Secret header of every event (see the REST Message below).
Appmixer delivers an event only to the flows whose connection has the same instance and the same Webhook Secret. Requests without the header are rejected with 401. Events with a different secret or for another instance don't trigger any flow.
Navigate to System Web Services > Outbound > REST Message.
Click on the New button to create a new REST Message.
Fill in the fields such as:
Name: e.g., AppmixerNotifications.
Endpoint: https://<YOUR_API_BASE>/plugins/appmixer/servicenow/events for example https://api.appmixer.com/plugins/appmixer/servicenow/events
Click Submit and then open the newly created REST Message.
Click on the HTTP Methods tab and create a new HTTP Method.
Fill in the details such as:
Name: e.g., events.
HTTP Method: POST.
Endpoint: Ensure this is filled with your webhook listener’s URL.
Add these HTTP Request Headers:
Content-Type: application/json
X-Appmixer-Secret: the Webhook Secret of your ServiceNow connection in Appmixer (required since connector version 4.0.0).
Save the HTTP Method.
Navigate to the table for which you want to capture new record creation. For example, if it’s the Incident table, go to Incident > All.
Right-click on the form header and select Configure > Business Rules.
Alternatively, you can navigate to Activity Subscriptions -> Administration -> Business Rules.
Click on the New button to create a new Business Rule.
Set the fields as follows:
Name: e.g., Appmixer incident events. Don't edit the built-in incident events rule, create a new one.
Table: Select the appropriate table (e.g., Incident).
Under Advanced, check the box Advanced to open the script editor.
You need to be a user with admin permissions to perform this step.
In the Script section, add the following code. Business rules in the global scope run as ES5, so the script uses var: let and const stop it from compiling, and the rule then silently does nothing. Please note that AppmixerNotifications must match the name of the Outbound REST Message specified in the previous step, and events should correspond to the event name defined in the Outbound REST Message.
(function executeRule(current, previous /*null when async*/) {
function serializeGlideRecordToJSON(gr) {
var obj = {};
var fields = gr.getFields();
for (var i = 0; i < fields.size(); i++) {
var field = fields.get(i);
var fieldName = field.getName();
// skipping sensitive fields if necessary
if (fieldName !== 'sys_updated_on' && fieldName !== 'sys_created_on') {
obj[fieldName] = gr.getValue(fieldName);
}
}
// getFields() does not return sys_id; the triggers output it as the record ID
obj.sys_id = gr.getUniqueValue();
return obj;
}
var operation = current.operation();
// Uncomment this line for tracing
// messages can be seen in System Logs > System Log > All
//gs.info("Webhook Rule Fired for " + gs.getProperty('instance_name'));
var instance = gs.getProperty('instance_name');
var tableName = current.getTableName();
// Make sure this matches the name of your Outbound REST Message
// `AppmixerNotifications` is the name of the Outbound REST Message
// `events` is the name of the HTTP method within the `AppmixerNotifications` REST Message mapped to the Appmixer plugin url
var rq = new sn_ws.RESTMessageV2('AppmixerNotifications', 'events');
var requestBody = {
'type': instance + '.' + tableName + '.' + operation,
'data': serializeGlideRecordToJSON(current)
};
rq.setRequestBody(JSON.stringify(requestBody));
rq.execute();
})(current, previous); To see messages triggered by the Business Rule go System Logs > System Log > All
To see messages triggered by the sn_ws.RESTMessageV2 within the Business Rule, go to System Logs > Outbound HTTP Requests
The Appmixer endpoint answers:
200: the event was accepted. Only flows whose connection has the same instance and Webhook Secret are triggered.
401 (Missing X-Appmixer-Secret header.): the REST Message does not send the X-Appmixer-Secret header.
400 (Missing 'type' property.): the request body has no type.
If the request succeeds but no flow is triggered, check that the header value matches the Webhook Secret of the connection used by the trigger, and that the instance name in type matches the connection's instance.
ServiceNow instances can restrict Basic authentication for APIs. With the restriction on, the REST API rejects a correct username and password with 401 unless the user has the snc_basic_auth_api_access role. If connecting the account with a username and password fails, add this role to the user (User Administration > Users, open the user, Roles tab, Edit), or use an API key (see below).
Follow steps on: https://www.servicenow.com/docs/bundle/zurich-platform-security/page/integrate/authentication/task/configure-api-key.html
After that is done, you should have:
Created Inbound Authentication Profile
Created REST API Key
Created REST API Access Policy
Main requirements in the set up:
Inbound Authentication Profile
The Auth Parameter should be set to Type: Auth Header (Parameter Name: x-sn-apikey)
REST API Access Policy
All checkboxes except for Global and Apply to all versions should be checked
The Inbound authentication profile table should have these two Authentication profiles:
API Key
On-call subscription basic authentication
The names of the authentication profiles can vary if you called them differently during their creation, the main point is that this REST API Access Policy should work with both API Key AND Basic Authentication otherwise you will receive error 401.


How to generate a Cliniko API key and connect Cliniko components in Appmixer. Cliniko does not use OAuth.
Before using Cliniko components in Appmixer, you need:
A Cliniko account — https://www.cliniko.com
An API key generated from your own Cliniko user profile
A Cliniko user whose permissions cover the data your flows touch (see Permissions)
Log into Cliniko
Open My Info from your user menu
Go to Manage API keys
Create a new API key and give it a name that says where it is used, e.g. Appmixer
Copy the generated key
Keys belong to a user, not to the account — each Cliniko user has their own.
Cliniko documents this at .
When adding a Cliniko component you will be prompted to authenticate. Provide:
That is the only field. You do not need to pick a region.
Cliniko is sharded: accounts are hosted per region, and the shard is appended to the API key itself:
Appmixer reads that suffix and calls https://api.{shard}.cliniko.com/v1. Keys generated before Cliniko introduced sharding carry no suffix and are treated as au1, which is what Cliniko does too.
The current shards are:
See for the current list.
The key is sent as the HTTP Basic username with an empty password, as Cliniko requires.
An API key inherits the permissions of the Cliniko user it belongs to — it is not a separate, independently-scoped credential. A key belonging to a receptionist-role user authenticates fine and then returns 403 on the resources that role cannot see, most commonly treatment notes.
If some components work and others return "Access denied (403)", the key is almost certainly attached to the wrong user. Generate the key from a user whose role covers the data your flows need, rather than trying to widen the key.
Find Available Times and Get Next Available Time read Cliniko's online-bookings availability. Cliniko returns 404 — not an empty result — when the business, the practitioner or the appointment type is not published to online bookings.
To use them, enable online bookings in Cliniko for all three:
the business (clinic location)
the practitioner
the appointment type
Cliniko also caps the window at 7 days and will not look into the past. In Appmixer both date fields are optional: leave them empty and the components query the next seven days.
Cliniko allows 200 requests per minute per user. Polling triggers and paginated Find components both consume that budget, so a flow polling several Cliniko triggers on a large account can approach it. Appmixer throttles Cliniko calls below the limit; if you still see "Rate limit exceeded (429)", reduce how many Cliniko triggers run concurrently on the same account.
The key is wrong, or it was deleted in Cliniko. Check for whitespace pasted around the key, and confirm the key still exists under My Info > Manage API keys.
The key belongs to a Cliniko user whose role cannot access that resource — see . Treatment notes are the usual case.
The business, practitioner or appointment type is not enabled for online bookings — see . Cliniko answers 404 rather than returning an empty list.
The shard suffix on the key is what selects the account. A key that was copied without its trailing -eu1 (or similar) is treated as an au1 key and will not authenticate against the right shard. Re-copy the whole key.
Cliniko requires Last Name on a patient, and a First Name or Last Name on a contact — a company name alone is not enough. The error message names the field Cliniko rejected.
Confirm the flow has been running long enough for a second poll: the first run only takes a baseline. Also check the trigger's optional Practitioner / Business filters — a filter set to a record from a different account matches nothing.
https://core.telegram.org/api
The Appmixer Telegram User connector signs in as a Telegram user account through the official client API (MTProto). Unlike a bot, a user account can read public channels it has not joined, so you can watch channels you do not own: news, competitors, topics you want to be alerted about.
Use the connector (Bot API) to send messages and to react to messages sent to your bot. Use Telegram User to read public channels.
There is no OAuth app to register. You need three values:
an API ID and an API Hash, which you create once at my.telegram.org,
a Session String, which you generate once on your own computer by logging in to the account.
epicOauthBaseUrl — optional. When omitted, the connector derives it from epicFhirBaseUrl using Epic's standard interconnect layout (…/api/FHIR/R4 → …/oauth2). Set it explicitly only when the organisation uses a non-standard layout.
FindLabResults
Observation.Read (Labs), Observation.Search (Labs)
FindSmokingHistory
Observation.Read (Social History), Observation.Search (Social History) (a.k.a. Smoking History)
GetMedication
Medication.Read
FindMedicationRequests, GetMedicationRequest
MedicationRequest.Read (Orders), MedicationRequest.Search (Orders) — select all MedicationRequest.* R4 variants
FindProcedures, GetProcedure
Procedure.Read, Procedure.Search — select all R4 variants (Surgeries, Orders, …)
FindCarePlans
CarePlan.Read (Longitudinal), CarePlan.Search (Longitudinal)
FindGoals
Goal.Read (Patient), Goal.Search (Patient)
FindImmunizations
Immunization.Read, Immunization.Search
FindDiagnosticReports, GetDiagnosticReport
DiagnosticReport.Read (Results), DiagnosticReport.Search (Results)
FindDocumentReferences
DocumentReference.Read (Clinical Notes), DocumentReference.Search (Clinical Notes)
FindDevices
Device.Read (Implants), Device.Search (Implants)
MakeApiCall
whatever APIs the called endpoint requires — the component sends arbitrary authorized FHIR requests
Archive a patient (hidden from Cliniko, not destroyed)
Unarchive Patient
Restore a previously archived patient
Find Appointments
Search individual appointments by date, patient, practitioner or business
Get Appointment
Retrieve an individual appointment by ID
Create Appointment
Book an individual appointment
Update Appointment
Reschedule or edit an appointment
Cancel Appointment
Cancel an appointment with a cancellation reason
Find Available Times
Bookable start times for a practitioner, in a date window
Get Next Available Time
The single next bookable start time
List Practitioners
List the practitioners in the account
List Businesses
List the businesses (clinic locations)
List Appointment Types
List the configured appointment types
Find Treatment Notes
Search treatment notes by patient, practitioner or draft status
Create Treatment Note
Create a treatment note for a patient
Create Medical Alert
Add a medical alert to a patient
Find Invoices
Search invoices by patient, practitioner, business, status or issue date
Find Contacts
Search contacts (referring doctors, third-party payers)
Create Contact
Create a contact
Make API Call
Call any Cliniko API endpoint
New Booking
A new booking appeared in the calendar (includes online bookings)
New Invoice
A new invoice was created
API Key
The key generated in Step 1
AU
au1 au2 au3 au4 au5
CA
ca1
UK
uk1 uk2 uk3
EU
eu1
Find Patients
Search patients by name, email or date of birth
Get Patient
Retrieve a patient by ID
Create Patient
Create a patient (Last Name is required)
Update Patient
Update an existing patient
New Patient
A new patient was created
Updated Patient
A patient record changed
New Appointment
A new individual appointment was booked
Updated Appointment
An individual appointment changed
Cancelled Appointment
An individual appointment was cancelled
Archive Patient
MS0xMjM0NTY3ODkwLUV4YW1wbGVLZXlOb3RSZWFsRG9Ob3RVc2VUaGlz-eu1
↑
shardafterInsertUpdateDelete




Open https://my.telegram.org and enter the phone number of the Telegram account, in international format (for example +420123456789).
Telegram sends a login code as a message in the Telegram app (from the Telegram service chat), not by SMS. Enter it.
Go to API development tools (https://my.telegram.org/apps).
Fill in the form. Only App title and Short name are required. The short name takes letters and digits only, 5 to 32 characters. Pick any Platform.
Click Create application.
Copy App api_id (a number) and App api_hash (32 characters).
A phone number can have one API ID. If the account already has one, the page shows it instead of the form and you use that.
The form is known to reject a request with a bare ERROR and no explanation. It is almost never caused by what you typed:
Turn off your VPN or proxy. Requests from well-known VPN address ranges are refused.
Use a private window without extensions, or another browser. Ad blockers and privacy extensions break the request.
After several attempts in a row, wait 15 to 60 minutes and try again. Repeated attempts are blocked for a while.
A newly created account or a virtual (VoIP) phone number may be refused altogether. The API ID identifies the application, not the account you later log in to, so you can create it with another, older Telegram account and still generate the Session String for the account you want to connect.
Telegram has no API key and no OAuth for user accounts. An account logs in the way the Telegram app does: phone number, then a login code that Telegram sends to the account, then the two-step verification password if the account has one. The result of that login is a session, and the Session String is that session written as text. It works like a long-lived access token: whoever holds it is logged in as the account, without the phone or the code.
Appmixer cannot ask you for the login code while you connect the account, so you log in once on your own computer and give Appmixer the resulting Session String. The API ID and API Hash from Step 1 are not enough on their own. They identify your application, not the account.
The API ID and API Hash from Step 1.
The Telegram app, on a phone or a computer, logged in to the account. The login code arrives there.
The account's two-step verification password, if it has one (Telegram app: Settings → Privacy and Security → Two-Step Verification).
Node.js 18 or newer. node --version shows what you have. The steps are the same on macOS, Windows and Linux.
It takes about five minutes.
Create an empty folder and install the Telegram client library in it:
mkdir telegram-session && cd telegram-session
npm install teleprotoSave this file in the folder as session.js:
const readline = require('node:readline/promises');
const { TelegramClient } = require('teleproto');
const { StringSession } = require('teleproto/sessions');
(async () => {
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
const apiId = Number(await rl.question('API ID: '));
const apiHash = (await rl.question('API Hash: ')).trim();
const client = new TelegramClient(new StringSession(''), apiId, apiHash, { connectionRetries: 3 });
client.setLogLevel('none');
await client.start({
phoneNumber: () => rl.question('Phone number (international format, e.g. +420123456789): '),
phoneCode: () => rl.question('Login code Telegram sent to your account: '),
password: () => rl.question('Two-step verification password: '),
onError: (error) => {
console.error('Login failed:', error.errorMessage || error.message);
return true;
}
});
console.log('\nSession String:\n\n' + client.session.save() + '\n');
await client.destroy();
process.exit(0);
})().catch(() => process.exit(1));The script logs in and prints the session. It talks to Telegram only and sends nothing anywhere else.
Run it:
node session.jsWhat to enter at each question:
API ID and API Hash: the values from Step 1.
Phone number: with the + and the country code, without spaces.
Login code: five digits. Within a few seconds Telegram sends them as a message from the official Telegram chat (the one with the blue checkmark), to every device where the account is logged in. Keep the account logged in in an official Telegram app; do not count on an SMS.
Two-step verification password: asked only when the account has one. It is shown on the screen as you type.
The message with the code warns you not to give the code to anyone. Typing it into this script on your own computer is what the code is for. Do not paste it into a website or send it in a chat. A code that is sent in a Telegram message stops working.
The Session String is one line of about 370 characters. It starts with 1 and ends with =. Copy all of it, without spaces or line breaks.
Right after the login, Telegram sends the account a New login notification and the session appears in the Telegram app under Settings → Devices, named after the App title from Step 1. Both are expected.
The script prints Login failed: with Telegram's reason and stops. Fix the cause and run it again.
API_ID_INVALID: the API ID or API Hash is wrong. Copy both again from Step 1 and check for a stray space.
PHONE_NUMBER_INVALID: the number is not in international format. Start with + and the country code.
PHONE_CODE_INVALID: the code was mistyped. Run the script again; Telegram sends a new code.
PHONE_CODE_EXPIRED: the code was entered too late, or it was sent in a Telegram chat, which invalidates it. Run the script again.
PASSWORD_HASH_INVALID: the two-step verification password is wrong.
PHONE_NUMBER_BANNED: Telegram has banned the account.
A wait of … seconds is required: too many login attempts. Wait that long before you try again. Further attempts make the wait longer.
The script hangs or reports a connection error: a firewall or VPN is blocking Telegram. Try another network.
The phone number must already have a Telegram account. The script does not sign a new account up; create it in the official Telegram app first.
Paste the Session String into Appmixer (Step 3).
Delete the folder and clear the terminal. The Session String and the password were printed on the screen. Do not keep the string in a note, a repository or a chat. If you need to keep it, use a password manager.
Need another one? Run the script again, for example for a second Appmixer connection or another environment. Every run creates a new, independent session, and the earlier ones keep working.
It does not expire on a date. It ends when you terminate it under Settings → Devices in the Telegram app, when you use Terminate all other sessions there, or when it has not been used for the period set under Settings → Devices → If inactive for (six months unless you changed it). A running flow keeps the session in use.
To cut Appmixer off from the account, terminate that session under Settings → Devices in the Telegram app. The Session String stops working immediately.
When you add a Telegram User component to a flow, Appmixer asks you to authenticate. Provide:
API ID: the App api_id from Step 1.
API Hash: the App api_hash from Step 1.
Session String: the string from Step 2.
Appmixer verifies the values by reading the account's own profile and names the connection after its username (for example @jana_novakova). The phone number is not stored. A session that belongs to a bot is rejected; bots belong in the Telegram connector.
Every component takes a channel as @username or as a link (https://t.me/username, a link to a single post works too).
The channel must be public, which means it has a username. Public groups work as well.
The account does not have to join the channel, and the connector never joins it.
Private channels and invite links (https://t.me/+…) are not supported.
A channel restricted in the account's region returns no messages. This is Telegram's restriction, not a fault of the connection.
The trigger checks the watched channels once a minute and delivers new posts oldest first.
Starting the flow sets the starting point. Only posts published after the flow starts are delivered. To read older posts, use Find Channel Messages.
If the connection to Telegram is down for a while, the posts published in the meantime are delivered once it is back, in order and without duplicates. A long backlog is delivered over several checks, at most 200 posts per channel per check.
Service messages, such as "channel photo changed", are not delivered.
The forward source of a forwarded post is shown only when it is a channel. Private users are never exposed.
Find Channel Messages returns at most 1,000 messages per call, newest first.
Telegram does not publish fixed limits for user accounts. It answers bursts with a flood wait (see Troubleshooting). Looking up a channel by its username is the most restricted call, so Appmixer remembers the channels it has already looked up. Watching a few dozen channels is fine. Feeding hundreds of new usernames a day into a flow is not.
Telegram revokes a session that is used from two IP addresses at the same time. If your Appmixer engine nodes reach the internet through different public IP addresses, route them through one address (a NAT gateway).
The API ID or the API Hash is wrong, or they do not belong together. Copy both again from https://my.telegram.org/apps.
The value is not a session string, or it was copied incompletely. It is one long line with no spaces. Run the script from Step 2 again.
The session was ended in Settings → Devices, the account logged out everywhere, or the same string was used from two places at once (AUTH_KEY_DUPLICATED). Generate a new Session String and create the connection again.
The Session String was created by logging in with a bot token. Log in with a phone number of a user account, or use the Telegram connector for the bot.
A temporary network problem between Appmixer and Telegram. The request is retried.
The username is misspelled or the channel was renamed. Open https://t.me/username in a browser to check it.
The channel has no public username, it was deleted, or the account is banned from it. Only public channels can be read.
The username belongs to a person or a bot. The connector reads channels and public groups only.
The account sent too many requests. Waits of up to a minute are handled silently. A longer wait fails the step, Appmixer retries it later, and the trigger continues at its next check. If it keeps happening, lower the number of channels or how often your flows call Find Channel Messages and Get Channel.
The post was published before the flow started. Only later posts are delivered.
The channel is restricted in the account's region, so Telegram returns nothing for it.
The channel went private or was renamed after the flow started. The flow log shows an error for that channel, and the other channels keep working.
$ node session.js
API ID: 12345678
API Hash: 0123456789abcdef0123456789abcdef
[INFO] - [Running teleproto version 1.229.1]
Phone number (international format, e.g. +420123456789): +420123456789
Login code Telegram sent to your account: 12345
Two-step verification password: correct horse battery
Session String:
1BQANOTEuMTA4LjU2LjE2NwG7…(about 370 characters)…Xk=


Configure the Shopify.
You register a Shopify app once and store its credentials in the Backoffice. Users then connect a store by entering its address and approving the app on Shopify's consent screen, which shows your app's name and logo.
Open the Shopify Dev Dashboard, go to Apps and click Create app. Choose Start from Dev Dashboard, enter the app name and click Create.
On the Versions page fill in:
App URL: the URL of your product or of your Appmixer instance.
Embed app in Shopify admin: off.
Scopes: a comma-separated list. All scopes the connector version 4 uses:
For version 3, replace read_publications,write_publications with read_price_rules,write_price_rules. See to leave out the ones of components you do not offer.
Redirect URLs: https://[YOUR_API_BASE]/auth/shopify/callback, for example https://api.appmixer.com/auth/shopify/callback.
Webhooks API version: the latest one.
Click Release.
Open the app Settings and note the Client ID and Client secret in the Credentials card.
The connector asks for all its scopes in one consent: Shopify keeps one valid token per app and store, so a second consent for more scopes would invalidate the first. The scopes that version 4 components need:
read_customers — the customer components and triggers, and every component that returns orders, draft orders or checkouts (they include the customer).
write_customers — Create, Update and Delete Customer.
read_orders — the order components and triggers, New Refund, the fulfillment, checkout and draft order triggers, Abandoned Cart,
Make API Call declares all of them, so it can reach any of these resources.
In the , open Apps, select the app, go to Distribution and choose Public distribution. Custom distribution limits the app to a single store (or one Shopify Plus organization), and the choice cannot be changed later. Once chosen, the page shows the Shopify App Store listing card; you do not have to submit the app to use it on development stores.
Customers, orders, draft orders, checkouts, fulfillments, refunds and returns are protected customer data. Until the app has access to it, these components and triggers answer 403 Forbidden, even on a development store. The distribution has to be chosen first.
In the Partner Dashboard, open Apps, select the app and click API access requests in the sidebar.
In Protected customer data access, click Request access.
Under Select your data use and reasons, open Protected customer data, tick the reasons that describe how your product uses the data (for example Store management and App functionality) and click Save.
On development stores the access works as soon as the steps above are saved — the request stays in the Draft state and does not have to be submitted. Before you submit the app for review, also fill in the Data protection details:
A public app has to provide Shopify's mandatory compliance webhooks. The connector implements them; set these URLs in the app:
Customer data request endpoint: https://[YOUR_API_BASE]/plugins/appmixer/shopify/customers/data_request
Customer data erasure endpoint: https://[YOUR_API_BASE]/plugins/appmixer/shopify/customers/redact
Shop data erasure endpoint: https://[YOUR_API_BASE]/plugins/appmixer/shopify/shop/redact
The connector verifies the signature of each request with the client secret and stores the request. An administrator can list the stored requests with a GET request to the same URLs.
Configure the Client ID as clientId and the Client secret as clientSecret in the service settings within the Backoffice, under the configuration ID appmixer:shopify.
To learn more about configuring connectors, please visit the section.
When adding a Shopify account in Appmixer, enter the Store Address — the store subdomain without .myshopify.com (for example my-store for my-store.myshopify.com) — and approve the app on the Shopify consent screen.
There is nothing to register or configure in the Backoffice. Every user generates their own access token directly in their Shopify store admin by creating a custom app:
Log in to your Shopify admin and go to Settings → Apps and sales channels → Develop apps. The direct link is https://admin.shopify.com/store/<your-store>/settings/apps/development, where <your-store> is the store subdomain (for example my-store for my-store.myshopify.com). This is also where you later change the scopes of an existing app: open the app, then Configuration → Admin API integration → Edit. Scopes added to an installed app apply to its existing access token as soon as you save — there is no need to generate a new token or reconnect the account in Appmixer.
If app development is not enabled yet, click Allow custom app development and confirm.
On the app detail page, open the Configuration tab and click Configure in the Admin API integration section.
Enable the following scopes (required by the Appmixer Shopify components):
read_customers, write_customers
Open the API credentials tab and click Install app, then confirm with Install.
In the Admin API access token section, click Reveal token once and copy the token (it starts with shpat_).
When adding a Shopify account in Appmixer, fill in:
Store Address: your store subdomain without .myshopify.com (for example my-store for my-store.myshopify.com)
Admin API Access Token: the shpat_... token generated above
Alongside the customer, order, product, report and discount code actions, the connector provides trigger components that start a flow when something happens in the store. Most are webhook-based (Shopify calls Appmixer in real time); Abandoned Cart polls the store's abandoned checkouts because Shopify has no cart-abandoned webhook.
In version 4, a webhook trigger subscribes to its topic when the flow starts and removes the subscription when the flow stops. When a webhook arrives, the trigger reads the object through the GraphQL Admin API, so it emits the same fields as the matching Get and Find components. Scopes needed in version 4:
Make sure the corresponding scopes are enabled on the app, otherwise the trigger fails to register or returns 403 Forbidden.
Sign Up or Log In: If you haven’t already, go to the and sign up for an account. If you have an account, just log in.
Create a New App: Once logged in, navigate to the "Apps" section using the dashboard menu. Click on "Create app" to get started, select the "Create app manually"
Note the clientId and clientSecret. Next, click on the "Choose distribution"
Select the "Public distribution" option
Go to the "Configuration" section from the main menu
set the Redirect URI to https://[YOUR_API_BASE]/auth/shopify/callback, for example https://api.appmixer.com/auth/shopify/callback
event version to the latest (2024-01)
Embed app in Shopify admin: false
Go to the "API Access" section from the main menu. In the "Access requests" request access for the "Protected customer data access" Fill details in the "Select your data use and reasons" section:
Fill the form in the "Provide your data protection details" section:
Configure the App Key as clientId and the App Secret as clientSecret in the service settings within the Backoffice, under the configuration ID appmixer:shopify. Also, add the appStoreInstallRedirectUri pointing to your instance, for example https://my.master-hamster-87765.appmixer.cloud/
To learn more about configuring connectors, please visit the section.
write_orders — Create, Update and Delete Order.
read_products, write_products — the product components and triggers; Create Order and Inventory Level Updated read products too.
read_publications, write_publications — Create Product and Update Product, to publish a product to the Online Store (Publish to Online Store).
read_draft_orders — New Draft Order, Updated Draft Order.
read_fulfillments — New Fulfillment, Updated Fulfillment.
read_inventory, read_locations — Inventory Level Updated.
read_returns — Return Tracking.
read_discounts, write_discounts — Create, Get and Delete Discount Code.
read_reports — Run Report, Sales Report, Payments Report.
In Protected customer fields (optional), select Name, Email, Phone and Address the same way and save each. Without them Shopify returns these fields empty.
Click Create an app, enter a name (for example Appmixer) and click Create app.
read_products, write_products
read_orders, write_orders
If you use the additional components, also enable the scopes they depend on. Enable only the ones you need:
read_reports — Run Report, Sales Report, Payments Report
read_price_rules, write_price_rules, read_discounts, write_discounts — Create Discount Code, Get Discount Code (connector version 2.1.0 and later). Without them Shopify answers 403 — This action requires merchant approval for write_price_rules scope.
read_draft_orders — New Draft Order, Updated Draft Order
read_fulfillments — New Fulfillment, Updated Fulfillment
read_inventory, read_locations — Inventory Level Updated
read_returns — Return Tracking (also requires the store's Shopify API version to be 2023-10 or later — the Returns API does not exist on older versions)
read_orders (already enabled above) covers New Paid Order, New Refund, New / Updated Checkout and Abandoned Cart — Shopify has no separate checkout scope; checkouts and abandoned checkouts are part of the orders scope.
Click Save.
New Fulfillment / Updated Fulfillment
a fulfillment is created / updated (tracking or shipment status changes)
read_orders, read_fulfillments
New Checkout / Updated Checkout
a checkout is created / updated in the online store
read_orders, read_customers
Abandoned Cart
a checkout is abandoned (polled)
read_orders, read_customers
New Draft Order / Updated Draft Order
a draft order is created / updated
read_draft_orders, read_orders, read_customers
Inventory Level Updated
an inventory level changes (e.g. for low-stock alerts)
read_inventory, read_locations, read_products
Return Tracking
a return is requested, approved, declined, cancelled, closed, reopened or updated
read_returns, read_orders
New Customer / Updated Customer
a customer is created / updated
read_customers, read_orders
Deleted Customer
a customer is deleted (emits its id)
read_customers
New Product / Updated Product / Deleted Product
a product is created / updated / deleted
read_products
Customer data request endpoint: https://[YOUR_API_BASE]/plugins/appmixer/shopify/customers/data_request
Customer data erasure endpoint: https://[YOUR_API_BASE]/plugins/appmixer/shopify/customers/redact
Shop data erasure endpoint: https://[YOUR_API_BASE]/plugins/appmixer/shopify/shop/redact
Version 1.x — the legacy OAuth 2.0 setup at the end of this page.
New Order / Updated Order / Cancelled Order / Fulfilled Order / New Paid Order
an order is created / updated / cancelled / fulfilled / paid
read_orders, read_customers
Deleted Order
an order is deleted (emits its id)
read_orders
New Refund
a refund is created on an order
read_orders








read_customers,write_customers,read_products,write_products,read_orders,write_orders,read_draft_orders,read_fulfillments,read_inventory,read_locations,read_reports,read_returns,read_discounts,write_discounts,read_publications,write_publications