Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 193 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

Connector Configuration

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...

Utilities

Loading...

Loading...

Controls

Controls

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Converters

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

CSV

Loading...

Loading...

Loading...

Connector Configuration

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.

ActiveCampaign

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. ActiveCampaign API Key

  • use the API Key to authenticate ActiveCampaign components in the Appmixer Designer. Authenticate

AWS

Authentication

Lambda, S3 and SNS

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.

Airtable

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

Anthropic Claude

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.

  1. Sign in to the Claude Console at (formerly console.anthropic.com). Create an account if you do not have one.

  2. Open Settings > API keys ().

Arcmira

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.


1. Create an API key

  1. Sign in to Arcmira. Create an account if you do not have one. New accounts start on the Free plan.

  2. Open Dashboard → API keys.

  3. Click Create key.

  4. 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.

Asana

1. Create Asana account

Sign up with Asana: https://app.asana.com

2. Register OAuth app

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

Set clientId and clientSecret into Appmixer Backoffice.

The last step is to configure clientId and clientSecret in the Appmixer Backoffice for appmixer:asana

Backoffice Airtable connector configuration

HTML to JSON

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.

XLSX to JSON

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.

Jotform

Configure the Jotform.

Log In to JotForm

  • Go to the JotForm website.

  • Log in with your JotForm account credentials.

Generate a New API Key

  • 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

Create a new API key

Use the API key in the Appmixer

  • In the authentication pop-up enter your API key.

Setup the App and Administrator account

Specify Base name

Specify Table details (fields)

2. Register OAuth app

Specify name

Specify name and callback url

Generate client secret

Specify scopes

Set clientId and clientSecret into Appmixer Backoffice.

https://airtable.com/signup
Specify base name
Specify base name
Specify table name
Specify table details
Airtable workspace created
Backoffice Airtable connector configuration

Mailchimp

Setup Mailchimp account

Sign up with Mailchimp: https://mailchimp.com/

2. Register OAuth app

Now you need to add an OAuth application. Navigate to: Profile > Extras > Registered apps.

Navigate to Profile
Navigate to Registered apps

Click on the "Register an app" button.

Specify client details

Specify app details

Generate client secret

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

Copy Client ID and Client secret

Set clientId, clientSecret and subdomain into Appmixer Backoffice.

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

Backoffice Mailchimp connector configuration

Imperva

Authentication

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".

API Keys

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

API Keys

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

API Keys

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

API Keys

Configuration

There are three optional configuration parameters for the SetBlockIPRule action of the Imperva connector. See the table below for more information.

Parameter
Required
Default
Description

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

Open AI

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. Authenticate

DeepAI

https://deepai.org/

Sign-up at DeepAI

Visit https://deepai.org and sign-up:

Copy api-key from your profile dashboard:

Set the API key via the the Backoffice Connector Configuration page:

And then add you own apiKey value:

Azure Cognitive Services

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.

Azure Cognitive Services
Setting the endpoint and key under appmixer:azureCognitiveServices

Pipedrive

1. Create Pipedrive account

Sign up with Pipedrive: https://www.pipedrive.com

2. Obtain API key

Navigate to My Account -> Personal Preferences -> API. Copy the API token.

Copy API token

Use the copied token as apiKey when connecting Pipedrive components in Appmixer.

Monday

1. Create Monday account

Sign up with Monday: https://auth.monday.com/users/sign_up_new

2. Obtain API key

Navigate to your Monday Developer Center -> My access tokens. Create a new token and copy it.

Navigate to Developer Center
Click Show and then Copy the token

Use the copied token as apiKey when connecting Monday components in Appmixer.

Cloudflare WAF

Cloudflare WAF integrations allows you to actively block attacker IP by using Cloudflare WAF infrastructure.

Authentication

Cloudflare WAF connector support authentication via Account API Token or User API Token

Account 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

Account API Token

User API Token

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

User API Token In the Cloudflare connector authentication window, use your API Token to log in.

DocuSign

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.

Schoology

Get your consumer key and secret

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.

Integrations screen with the consumer key and secret.

Configure the authentication values in Appmixer

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:

Configuration values for Schoology

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.

Redmine

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.

Freshdesk

1. Create Freshdesk account

Sign up with Freshdesk: https://www.freshdesk.com

2. Obtain API key

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.

Copy API token

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.

Use API key and Domain in Appmixer

Highrise

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.

User-Agent

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:

Change user agent.

Screenshot API

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.

Setting Screenshot API token in the Backoffice.

Typeform

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.

Token expiration settings.

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.

Trello

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

Setting the Oauth page name in the Backoffice

If you don't do this, the Oauth page will show Appmixer by default.

AI

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.

Pre-built integration template.
End-user can just actiavte the integration without any other configurations.

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

appmixer:utils:ai connector configuration
apiKey is a mandatory setting, pointing to your OpenAI api key

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

Twilio

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. Twilio Account Inof

  • use the Auth Token and Account Token to authenticate the Twilio components in the Appmixer Designer. Authenticate

HTML to CSV

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

Parameter
Type
Required
Description

fileId

string

✅

The ID of the HTML file to convert.

Output Parameters

Parameter
Type
Description

fileId

string

The unique ID of the converted file.

fileName

string

The name of the generated CSV file.

Instructions

  1. Select the HTML File:

    • Provide the fileId of the HTML document that contains a table.

  2. Processing:

    • The component extracts the table data from the HTML file and converts it into a structured CSV format.

  3. Retrieve Output:

    • The component returns a new file with fileId and fileName in CSV format.

Snowflake

Account

You'll need a Snowflake account. If you don't have one, you can sign up for a free trial on the Snowflake website.

Obtain Credentials and Configuration

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.

How to Find This Information:

  • 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.

Azure DevOps

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.

1. Register an Application in 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.

2. Get Application (Client) ID

After registration, you will be taken to the app's Overview page. Copy the Application (client) ID - this is your clientId.

3. Create a Client Secret

  1. In the left menu, go to Certificates & secrets.

  2. Click + New client secret.

  3. Add a description and select an expiration period (use the longest available).

  4. Click Add.

  5. Copy the Value of the newly created secret immediately - this is your clientSecret. It will not be shown again.

4. Configure API Permissions

  1. In the left menu, go to API permissions.

  2. Click + Add a permission.

  3. Select Azure DevOps.

  4. Select Delegated permissions.

  5. Check user_impersonation.

  6. Click Add permissions.

The final set of permissions should include:

Permission
Type
Description

user_impersonation

Delegated

Azure DevOps - Full access

5. Configure Appmixer Backoffice

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.

Set Variable

Overview

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.

Usage

Input Ports

Port
Description

in

Accepts an object containing variables and their values.

Output Ports

Port
Description

out

Emits the assigned variables as an object.

Supported Variable Types

  • 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.

Instructions

  1. Provide Variables

    • Send an object containing variable names, types, and values to the in port.

  2. Processing Variables

    • The component assigns the variables dynamically based on their types.

  3. Retrieve Output

    • The processed variables are sent as an object through the out port.

Notes

  • 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.

CSV to XLSX

Description

Convert a CSV file to XLSX (Excel 2007+ XML Format).

Input Parameters

Parameter
Type
Required
Description

fileId

string

✅

The ID of the file to convert.

Output Parameters

Parameter
Type
Description

fileId

string

The unique ID of the converted XLSX file.

fileName

string

The name of the converted file.

Instructions

  1. Provide File ID:

    • Select the CSV file to be converted using its fileId.

  2. Processing:

    • The component processes the file and converts it into an XLSX format.

  3. Retrieve Output:

    • The converted file is returned with a fileId and fileName for further use.

On Start

Overview

The OnStart Component is a trigger that fires once when the flow starts. It emits a timestamp indicating when the flow was initiated.

Usage

Output Ports

Port
Description

out

Fires when the flow starts, providing the start time.

Output Data for out Port

Field
Description

started

The timestamp (ISO 8601 format) indicating when the flow started.

Instructions

  1. Automatic Trigger

    • The component automatically fires when the flow begins execution.

  2. Start Time Emission

    • Outputs a started timestamp that can be used for logging, tracking, or scheduling purposes.

Notes

  • 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.

Data URI to File

Overview

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.

Input Parameters

Parameter
Type
Required
Description

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.

Output Parameters

Parameter
Type
Description

fileId

string

The unique ID of the generated file.

fileName

string

The name of the resulting file.

Instructions

  1. Provide a Data URI

    • Input a valid Data URI string that represents a file.

  2. 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.

  3. 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.

Counter

Overview

The Counter Component maintains an internal counter that increments with each received message. It can also be reset to a specified value.

Usage

Input Parameters

Parameter
Type
Description

count

number

The initial counter value (default: 0).

increment

number

The amount by which the counter increments (default: 1, can be negative for decrement).

Input Ports

Port
Description

item

Triggers the counter increment.

reset

Resets the counter to a specified value or its initial value if not provided.

Output Ports

Port
Description

count

Emits the updated counter value after each increment.

Instructions

  1. Set Initial Value and Increment

    • Configure the count parameter for the starting value.

    • Set increment to define how much the counter increases or decreases.

  2. Increment Behavior

    • Each time a message arrives at the item port, the counter increases by the increment value.

  3. 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.

Notes

  • 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.

). Create a dashboard key, which carries all write scopes.

A key acts in the Arcmira account that was active when the key was created: your personal account or a team account. All requests made with the key use that account's plan and credits. Paid reads use credits from the plan first, then the on-demand budget. Scopes never unlock plan features.

2. Connect in Appmixer

Rate limits

Troubleshooting

Backoffice configuration

Keys and sign-in
Connector Configuration

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.

    Get an API key

    platform.claude.com
    platform.claude.com/settings/keys

    Backoffice configuration

    Mistral AI

    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.

    Get an API key

    1. Sign in to Mistral AI Studio at console.mistral.ai. Create an account if you do not have one.

    2. In the left sidebar, open API Keys.

    3. Click Create new key.

    4. 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.

    5. Click Create new key and copy the key. Mistral shows the full key only once.

    6. 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.

    Backoffice configuration

    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
    }'

    Blackboard

    Create Blackboard App in the Developer portal

    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.

    Register your application on Blackboard

    Self-managed instances

    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:

    REST API Integrations option

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

    REST API Integrations list

    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.

    Configure the Backoffice

    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:

    Manage Keys in developer portal

    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:

    Key information

    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:

    Blackboard configuration

    And you are done! You are ready to use the Blackboard module.

    Cloudflare Lists

    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.

    Custom IPs list

    You can access custom lists in your Cloudflare account by navigating to Manage Account > Configurations > Lists. Cloudflare Lists connector only supports IP lists.

    Custom IP list

    Authentication

    Cloudflare Lists connector support authentication via Account API Token, User API Token, or Global API Key (deprecated).

    Account 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 | Account Filter Lists | Edit

    Account API Token

    User API Token

    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

    User API Token

    Global API Key (deprecated)

    My Profile > API Tokens. Click on "View" to get the token:

    Global API Key

    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.

    Dropbox

    Configure the Dropbox.

    Access the Dropbox App Console

    • Open the Dropbox App Console.

    • Log in with your Dropbox account credentials.

    Create OAuth app

    Create new OAuth app

    Settings page

    • 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.

    settings

    Permissions page

    Ensure that the following permissions are selected:

    • account_info.read

    • files.content.read

    • files.content.write

    • files.metadata.read

    permissions

    Facebook Business

    Create Facebook OAuth Application

    1. Visit https://developers.facebook.com/ and create a new OAuth application (or use your existing one).

    2. Add Facebook Login for Business and Marketing API products.\

    3. 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:\

      Use App ID as clientId and App Secret as clientSecret
    4. 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.

    5. Set the OAuth redirect URI under Facebook Login for Business / Settings to https://api.YOUR_TENANT.appmixer.cloud/auth/facebookbusiness/callback:\

    LinkedIn

    https://linkedin.com

    To publish posts as a company page, use the LinkedIn Pages connector. It needs a separate LinkedIn app, see LinkedIn Pages.

    Register OAuth app

    • 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:

      Scopes

    Appmixer Backoffice.

    Set clientId and clientSecret into Appmixer Backoffice for appmixer:linkedin

    Verification

    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.

    Microsoft Dynamics 365 CRM

    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.

    Twitter

    Configure the Twitter.

    Access the Twitter App Console

    • 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.

    Create OAuth app

    • 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.

    User 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

    Keys and Tokens

    • 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.

    Discord

    Register OAuth2 app

    Go to the Discord Developer Portal: https://discord.com/developers/applications and create a new Application.

    1. Click “New Application”

    2. Give it a name, accept their Terms of Service and click “Create”

    3. Open your new application

    Basic Information

    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.

    Join

    Overview

    The Join Component is used to merge multiple input connections. It forwards every received message to the output port without modification.

    Usage

    Input Ports

    Port
    Description

    in

    Receives messages from multiple sources.

    Output Ports

    Port
    Description
    1. Connect Multiple Inputs

      • Attach multiple input sources to the in port.

    2. 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.

    CSV to JSON

    Overview

    The CSV2JSON component converts a CSV file into a JSON file.

    Input Parameters

    Parameter
    Type
    Required
    Description

    fileId

    string

    ✅

    The ID of the CSV file to convert.

    Output Parameters

    Parameter
    Type
    Description
    1. Provide File ID:

      • Select or upload the CSV file to be converted.

    2. Processing:

      • The component processes the CSV file and converts it into JSON format.

    XLSX to HTML

    XLSX2HTML Component

    Overview

    The XLSX2HTML component converts an XLSX (Excel 2007+ XML) file into an HTML table format.

    Input Parameters

    Parameter
    Type
    Required
    Description

    fileId

    string

    ✅

    The ID of the XLSX file to convert.

    Output Parameters

    Parameter
    Type
    Description
    1. Select the XLSX File

      • Choose an existing XLSX file by providing its fileId.

    2. Processing

      • The component will convert the XLSX file into an HTML table.

    CSV to HTML

    Overview

    The CSV2HTML component converts a CSV file into an HTML table. This allows for easier visualization and sharing of structured data.

    Input Parameters

    Parameter
    Type
    Required
    Description

    fileId

    string

    ✅

    The unique identifier of the CSV file.

    Output Parameters

    Parameter
    Type
    Description
    1. Select the CSV File:

      • Provide the fileId of the CSV file to be converted.

    2. Processing:

      • The component will transform the CSV file into an HTML table.


    HTML to XLSX

    Overview

    The HTML2XLSX component converts an HTML table file into an XLSX (Excel 2007+ XML Format) file.

    Input Parameters

    Parameter
    Type
    Required
    Description

    fileId

    string

    ✅

    The ID of the HTML file containing the table to convert.

    Output Parameters

    Parameter
    Type
    Description
    1. Provide the File ID:

      • Select or upload an HTML file containing a table.

    2. Conversion Process:

      • The component extracts tabular data from the HTML file and converts it into an Excel spreadsheet.


    XLSX to CSV

    XLSX2CSV Component

    Overview

    The XLSX2CSV component converts an XLSX Excel 2007+ XML format file into a CSV file.

    Input Parameters

    Parameter
    Type
    Required
    Description

    fileId

    string

    ✅

    The ID of the XLSX file to convert.

    Output Parameters

    Parameter
    Type
    Description
    1. Provide File ID:

      • Select an XLSX file using its fileId.

    2. 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.

    JSON to HTML

    Overview

    The JSON2HTML component converts a JSON file into an HTML table.

    Input Parameters

    Parameter
    Type
    Required
    Description

    fileId

    string

    ✅

    The ID of the JSON file to be converted.

    Output Parameters

    Parameter
    Type
    Description
    1. Provide the JSON File:

      • Select or upload a JSON file using its fileId.

    2. Processing:

      • The component reads the JSON file and converts it into an HTML table.

    JSON to XLSX

    JSON2XLSX Component

    Overview

    The JSON2XLSX component converts a JSON file into an XLSX (Excel 2007+ XML Format) file.

    Input Parameters

    Parameter
    Type
    Required
    Description

    fileId

    Output Parameters

    Parameter
    Type
    Description

    Instructions

    1. Select the Input JSON File:

      • Upload or provide the fileId of the JSON file to be converted.

    2. Processing:

      • The component converts the JSON file into an XLSX format.

    Add Rows

    Overview

    The AddRows component allows adding multiple rows to an existing dataset.

    Input Parameters

    Parameter
    Type
    Required
    Description

    dataset

    array

    ✅

    Output Parameters

    Parameter
    Type
    Description

    Instructions

    1. Provide the Dataset:

      • Ensure the dataset is passed in the correct array format.

    2. Add Rows Data:

      • Provide multiple rows in an array where each object represents a row.


    Add Row

    Overview

    The AddRow component allows adding a single row to a dataset.

    Input Parameters

    Parameter
    Type
    Required
    Description

    dataset

    array

    ✅

    Output Parameters

    Parameter
    Type
    Description

    Instructions

    1. Provide the Dataset:

      • Ensure the dataset is passed in the correct array format.

    2. Add Row Data:

      • Provide the new row as an object where keys match column names.


    Add Column

    Overview

    The AddColumn component allows adding a new column to an existing dataset.

    Input Parameters

    Parameter
    Type
    Required
    Description

    dataset

    array

    ✅

    Output Parameters

    Parameter
    Type
    Description

    Instructions

    1. Provide the Dataset:

      • Ensure the dataset is passed in the correct array format.

    2. Specify Column Details:

      • Enter the column name.


    Calendly

    • Create a Calendly Developer account:

    • Go to and sign up.

    ⚠️ Note: This is not your Calendly user account. It’s a separate developer account.


    1. Create a new OAuth application:

    Jira

    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-configuration scope for project operations instead.

    Fathom

    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.


    1. Log in to .

    2. Open Settings (top right) and go to the API Access section of your user settings. The direct link is .

    3. Click Add

    Quickbooks

    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

    Condition

    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.

    Parameter
    Type
    Description

    Switch

    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.

    Parameter
    Type
    Description

    GitHub

    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

    Archive

    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.

    Parameter
    Type
    Required
    Description

    TypeSafe AI

    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.


    1. Open the and sign in with Google or with a code sent to your e-mail.

    2. In the left sidebar, go to API Keys ().

    AppEvents

    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.

    Property
    Type
    Description

    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.

    port.

    out

    Emits the received input messages as output.

    Instructions

    Notes

    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.

    Instructions

    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.

    Instructions

    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.

    Instructions

    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.

    Instructions

    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.

    Instructions

    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.

    Instructions

    OAuth2 & Redirect URL

    Add a Bot and get the Bot Token

    Scopes and Permissions

    Backoffice (Appmixer admin)

    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.

    Parameter
    Type
    Description

    fileId

    string

    The unique ID of the newly created or updated archive file.

    fileName

    string

    The name of the archive file.

    1. Select Output Format:

      • Choose between zip or tar as the output format.

    2. Provide File Name:

      • Specify a name for the archive file, ensuring it includes the appropriate extension (.zip or .tar).

    3. 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.

    4. 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.

    Overview

    Input Parameters

    fileName

    Output Parameters

    Instructions

    Use Cases

    , then
    Generate API Key
    .
  • 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.

    1. Generate an API key

    Fathom
    fathom.video/customize#api-access-header

    Fathom API keys belong to the user who creates them. A key can read meetings that user recorded, plus meetings shared with them or with their team. It never gives access to other users' private meetings, and that includes admin keys. Connect Fathom with the account whose meetings you want to work with in Appmixer.

    2. Connect in Appmixer

    3. New Meeting Content Ready trigger

    Rate limits

    Troubleshooting

    Backoffice configuration

    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:1234
    • Production: Must use HTTPS.

    👉 You can add multiple redirect URIs, separated by commas. 👉 For Appmixer, set the redirect URI to:

    Example:

    alt text

    Once the app is created, you’ll see:

    • Client ID

    • Client Secret

    ⚠️ Important: These values will only be shown once. Copy them immediately!


    1. Go to the Appmixer BackOffice -> Configuration.

    2. Add new configuration: acme:calendly .

    3. Add your clientId and clientSecret keys with values.

    alt text
    alt text
    • 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.


    Calendly – Connector Configuration

    Step 1: Create a Developer Account & First Application

    Step 2: Register Your OAuth Application

    Create a Developer Account
    Calendly Console Apps
    https://[YOUR_API_BASE]/auth/docusign/callback
    https://api.appmixer.com/auth/docusign/callback

    Step 3: Set Redirect URI

    Step 4: Copy Your Credentials

    Step 5: Connector Configuration

    Step 6: Edit Your Application

    Why granular scopes for projects? With classic scopes, creating, updating or deleting a Jira project requires manage: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 just read:project:jira. A missing scope causes a runtime 401 Unauthorized; scope does not match. (offline_access is requested automatically by the connector.)

    This is how the permissions should look like:

    Specify scopes
    Specify callback URL

    After you have created the app, you will see the overview of the app. Here you can find the client ID and client secret.

    Settings with clientId and clientSecret
    Overview of the new app

    The last step is to configure clientId and clientSecret in the Appmixer Backoffice for appmixer:jira connector.

    Backoffice JIRA connector configuration

    Register OAuth app

    Set up distribution

    Specify scopes

    official guide
    Attlassian Developer Console
    official guide

    Specify Callback URL

    Overview

    Set clientId, clientSecret into Appmixer Backoffice.

    Add your
    clientId
    and
    clientSecret
    keys.

    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.

    QuickBooks Webhooks configuration

    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:

    Entity
    Operations
    Trigger components

    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.

    QuickBooks Webhooks event triggers

    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.

    Appmixer BackOffice configuration for QuickBooks Webhooks
    https://developer.intuit.com/app/developer/dashboard

    Webhooks

    Operator
    Description

    =

    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.

    Port
    Description

    true

    Fires if the condition evaluates to true.

    false

    Fires if the condition evaluates to false.

    1. Define Conditions

      • Create conditions using logical grouping (AND, OR).

      • Choose an operator and provide a comparison value.

    2. Evaluate Inputs

      • Inputs are compared using selected operators.

      • Logical groups (AND, OR) allow complex expressions.

    3. 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.

    Overview

    Usage

    Input Parameters

    Supported Operators

    Output Ports

    Instructions

    Notes

    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.

    Operator
    Description

    =

    Equal to

    !=

    Not equal to

    >

    Greater than

    >=

    Greater than or equal to

    <

    Output
    Description

    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.

    1. Define Conditions

      • Configure up to 5 expressions (expression1 to expression5) for routing messages.

    2. Set Operators

      • Use supported operators to define comparison logic.

    3. Handle Default Cases

      • If none of the conditions match, the message is sent to else.


    expression1 - expression5

    Overview

    Usage

    Input Parameters

    expression

    Supported Operators

    Output Parameters

    Instructions

    configuration in the
    with 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

    Adding the organization webhook

    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):

    Register OAuth app

    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>"
    }'

    If the GitHub organization your users work with restricts third-party OAuth app access (Organization settings → Third-party access → OAuth app policy), an organization owner has to approve the Appmixer app there. Until then the connector reads public data but every write into the organization's repositories fails with 403 — OAuth App access restrictions.

    Organization webhook for the project board trigger

    1. Give the connector a webhook secret

    2. Create the organization webhook

    Appmixer connected to an Auth Hub. When your Appmixer instance authenticates GitHub through an Auth Hub, the trigger's subscription lives on the hub, so the Payload URL must be the hub's endpoint: https://<your-auth-hub>/plugins/appmixer/github/events. The GitHub connector must be installed on the hub and the webhookSecret set in the hub's appmixer:github configuration. The hub relays every delivery to the subscribed flows of the connected instances.

    3. Use the trigger

    Backoffice configuration

    Backoffice

    Click Create key and give the key a descriptive name (e.g. Appmixer Integration).

  • Copy the key. It starts with apikey_.

  • API keys in the TypeSafe console

    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.


    • TypeSafe API reference

    • Question types (primitives)

    • Models

    1. Generate an API Key

    TypeSafe console
    https://console.typesafe.ai/keys

    Treat the API key like a password. Anyone who has it can run requests that are billed to your TypeSafe account. Store it securely and do not expose it in client-side code.

    Requests are billed by input tokens. Check Usage and Billing in the TypeSafe console to see what your flows consume.

    2. Connect in Appmixer

    3. Try It Out

    Need more than one answer about the same content? Put all the questions into a single Ask Questions component instead of chaining Classify Text, Score Text and Verify Statement. The content is sent and billed only once, so the flow is both faster and cheaper.

    Troubleshooting

    "Invalid TypeSafe API key" / 401 Unauthorized

    "TypeSafe rejected the request (400)"

    429 Too Many Requests / 529 Overloaded

    Resources

    eventDataExample

    string

    An example JSON structure representing the event data.

    Port
    Description

    out

    Emits the received app event data.

    1. Registers Webhook: Subscribes to the specified event using the Appmixer API.

    2. Receives Event Data: Waits for an event from the external system.

    3. Processes Data:

      • Parses the received JSON payload.

      • Extracts structured data based on eventDataExample.

    4. Emits Structured Output: Sends the processed event data to the out port.

    Property
    Type
    Description

    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.

    Overview

    Usage

    Properties

    Output Ports

    Processing Logic

    Output Data Schema

    Notes

    LinkedIn Pages

    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.

    LinkedIn reviews every Community Management API request by hand. Access is granted only to registered legal organizations for commercial use. If a request is rejected, you can't apply again with the same app; you have to create a new one. Prepare everything in first.

    Before you start

    • 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.

    1. 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: , .

    AWS SNS

    Overview

    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.

    Prerequisites

    Before using the AWS SNS Connector to send SMS messages, ensure the following:

    1. 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 .

    2. 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.

    3. 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.

    4. 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).

    Issue
    Cause
    Solution
    1. Verify Phone Number:

      • Check if the recipient's number is added in the AWS SNS SMS sandbox.

    2. 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.

    Spotify

    Register a Spotify app for the Appmixer Spotify connector (OAuth 2).

    Register the Spotify app

    1. Sign in to the Spotify for Developers Dashboard with the Spotify account that will own the app.

    2. 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.

    3. 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):

    Digest

    Overview

    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.

    Usage

    Input Parameters

    Parameter
    Type
    Description

    threshold

    number

    Number of entries required to trigger output. If set, output is triggered when this count is reached.

    webhookUrl

    Port
    Description
    Port
    Description
    1. Set a Threshold (Optional)

      • Define the threshold parameter to release data when a certain number of entries are reached.

    2. 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.

    Join Each

    For most loops, use with Sequential turned on and at the end of the loop instead. It processes the items in order, and Add to Result in Continue Each collects values from every item into result on the done port of Each. Join Each is for loops that run the items in parallel (Sequential off).

    Overview

    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.

    Usage

    Input Ports

    Port
    Description

    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.

    Output Ports

    Port
    Description
    Field
    Description
    Field
    Description
    1. Set Up with Each Component

      • Ensure messages sent to in contain a correlationId matching the one from the Each component.

    2. 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.

    GoHighLevel

    Before using GoHighLevel components in Appmixer, you need:

    1. A GoHighLevel account with at least one Sub-Account (location)

    2. A Private Integration Token created from within that Sub-Account

    3. A Pipeline (required for Opportunity components)

    Strava

    • 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.


    Salesforce

    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

    ,
    hour
    ,
    dayMonth
    , and
    dayWeek
    to process batches at specific times.
  • Manual 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).

    Input Ports

    Output Ports

    Instructions

    Notes

    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.

    Output Data for out Port

    Output Data for timeout Port

    Instructions

    Notes

    Each
    Continue Each
  • 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

    Important Considerations

    ✅ 200 OK Response Does Not Guarantee SMS Delivery

    ✅ Common Issues and Solutions

    Debugging Steps

    References

    Conclusion

    AWS documentation
    Publishing SMS messages to a mobile phone using Amazon SNS
    Adding and verifying phone numbers in the Amazon SNS SMS sandbox

    Unable to view logs

    —
    Delete Playlist
    (Spotify removes a playlist from the user's library through
    DELETE /me/library
    ).

    outputFilePrefix — 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.

    Scopes

    Development Mode limits. Every new Spotify app starts in Development Mode. Since February 2026 such an app works only while its owner has an active Spotify Premium subscription, and at most 5 Spotify users can use it. Each of them has to be added on the app's Settings → User Management tab (name and the e-mail address of their Spotify account) before they connect the account in Appmixer — a user who is not on the list can log in, but every API call then fails with 403.

    To open the app to more users, request Extended Quota Mode (Settings → Quota extension Request). Spotify accepts these requests only from registered organizations with a launched service and at least 250k monthly active users, and the review can take up to six weeks. See Quota modes.

    Rate limits

    Useful links

    Backoffice configuration

    Spotify Web API — Apps
    Redirect URIs
    Scopes
    Quota modes
    Connector Configuration
    February 2026 Web API Dev Mode changes
    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.

  • You also need a high-resolution screen recording, preferably narrated. It must show a user authorizing your app through the OAuth flow and publishing a post to their LinkedIn page. If your application doesn't have a feature that LinkedIn asks to see (for example, displaying comments), say so in the recording.
    r_basicprofile
    w_organization_social
    rw_organization_admin

    Register the OAuth app

    Appmixer Backoffice

    Scopes

    Access tiers and limits

    LinkedIn access tokens are valid for 60 days. LinkedIn issues refresh tokens only to some apps. Without one, users have to reconnect their LinkedIn Pages account when the token expires.

    Troubleshooting

    https://www.linkedin.com/developers/apps/new
    Community Management App Review
    Increasing access
    Before you start
    A Calendar (required for Appointment components)

    Sign 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

    1. Give it a name (e.g. "Appmixer Integration")

    2. Enable all required scopes — at minimum:

      • Contacts (read/write)

      • Opportunities (read/write)

      • Calendars (read/write)

      • Locations (read)

    3. 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:

    Field
    Value

    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:

    1. Go to your Sub-Account in GoHighLevel

    2. Navigate to CRM → Pipelines (or Opportunities → Pipelines)

    3. Click + Add Pipeline

    4. Add at least one stage (e.g. "New Lead", "Contacted", "Closed")

    5. 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:

    1. Go to your Sub-Account in GoHighLevel

    2. Navigate to Calendars

    3. Click + New Calendar and select the calendar type (e.g. "Event")

    4. Configure basic settings and save

    The Calendar will appear in the Calendar dropdown when configuring Appointment components in Appmixer.


    Component
    Description

    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.

    Prerequisites

    https://app.gohighlevel.com/location/<LOCATION_ID>/dashboard

    1. Create a GoHighLevel account

    2. Create a Sub-Account

    3. Create a Private Integration Token

    4. Connect in Appmixer

    5. Create a Pipeline (for Opportunity components)

    6. Create a Calendar (for Appointment components)

    Available Components

    Troubleshooting

    "The token is not authorized for this scope"

    "Auth source is not valid"

    Empty Pipeline / Calendar dropdowns

    "locationId can't be undefined"

    Create 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)


    1. Authorization Callback Domain:

      • Enter your callback domain in the "Authorization Callback Domain" field

      • For Appmixer, use your API domain without the full path:

    Example:

    1. 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.


    1. Go to the Appmixer BackOffice -> Configuration.

    2. Add new configuration: acme:strava.

    3. Add your clientId and clientSecret keys with values.

    alt text
    alt text

    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:

    1. Submit for Review:

      • Applications requesting higher rate limits need approval

      • Provide detailed information about your use case

      • Include screenshots and documentation

    2. Compliance Requirements:

      • Follow Strava's

      • Implement proper data handling and privacy measures

      • Display Strava attribution where required


    • Strava Developers Documentation

    • API Reference

    • OAuth Guide

    • Webhook Documentation


    Strava – Connector Configuration

    Step 1: Create a Strava Account & Access API Settings

    Step 2: Create Your API Application

    Strava
    Strava API Settings
    [YOUR_API_DOMAIN]
    api.appmixer.com
    https://[YOUR_API_DOMAIN]/auth/strava/callback
    https://api.appmixer.com/auth/strava/callback

    Step 3: Configure OAuth Settings

    Step 4: Copy Your Credentials

    Step 5: Understand Strava Scopes

    Step 6: Connector Configuration

    Step 7: Rate Limits

    Step 8: Going Live & App Review

    Useful Links

    .

    Fill 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:

    App manager

    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:

    Filling OAuth settings for your application
    Configure additional properties

    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.

    Navigating to your app details

    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):

    Salesforce client id (Consumer Key) and secret (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:

    Creating configuration for Salesforce in the Backoffice

    Finally, set the clientId (Consumer Key in Salesforce) and the clientSecret (Consumer Secret in Salesforce) like this:

    Adding clientId and clientSecret to Appmixer

    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.

    1. 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.

    Create a Salesforce application

    The Appmixer Salesforce connector uses PKCE from version 1.7.4. With an older connector version, connecting an account through an External Client App fails with error=invalid_request&error_description=missing required code challenge. Upgrade the connector before following this guide.

    Create an External Client App

    Getting the client id and secret

    Legacy: Connected App

    Configure Appmixer

    Authentication configuration

    Login URL

    Troubleshooting

    Intercom

    Intercom – Connector Configuration

    Step 1: Create a Developer Account & Access Developer Hub

    • 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.


    Step 2: Create Your App

    1. 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

    2. App Configuration:

      • Choose "Internal integration" for private use within your workspace

      • Or choose "Public app" if you plan to distribute it publicly


    1. Navigate to Authentication:

      • In your app dashboard, go to the "Authentication" section

      • Select "OAuth" as the authentication method

    2. 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:

    1. Go to Webhooks section:

      • Navigate to "Webhooks" in your app dashboard

      • Click "Create webhook"

    2. Webhook Configuration:


    1. Go to the Appmixer BackOffice -> Configuration.

    2. Add new configuration: acme:intercom.

    3. Add your clientId and clientSecret keys with values.


    1. Install your app:

      • In the app dashboard, click "Install app"

      • This will install the app to your selected workspace

    2. Generate Access Token (for testing):


    When ready for production:

    1. 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



    Figma

    Figma – Connector Configuration

    Step 1: Access Figma & Developer Platform

    • 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.


    Step 2: Create Your Application

    1. Access Developer Settings:

      • Go to Account Settings → Connected apps

      • Or visit: https://www.figma.com/developers/apps

    2. Create New App:

      • Click "Create new app"

      • Fill in the application details:

        • App name (e.g., "Appmixer Design Integration")


    1. OAuth Configuration:

      • In your app settings, configure OAuth details

      • Set your callback URL for OAuth flow

    2. Set Callback URL:

    Example:

    1. 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:

    1. 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:

    1. Create Webhook:

      • Use the

      • POST to https://api.figma.com/v2/webhooks

    2. Webhook Events:


    1. Go to the Appmixer BackOffice -> Configuration.

    2. Add new configuration: acme:figma.

    3. 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



    Microsoft

    1. Register Oauth2 applications

    Follow the next link:

    + New registration

    Redirect URI

    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

    /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"

    1. Click "Add Item" to create a new configuration entry

    1. Set the following values:

    • Key: microsoftTenant

    • Value: true

    1. Click Confirm to save the configuration

    Note: This configuration enables the tenant field in the Microsoft connection interface.

    1. Return to your flow and locate a Microsoft connector

    2. Click "Connect account"

    3. You should now see a "Tenant" field in the connection form

    1. 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

    Google

    Application verification

    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.

    Register Oauth2 app

    Go to the Google developer console at https://console.developers.google.com/ and create a new project.

    Developer Console
    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.

    Pinterest

    Pinterest – Connector Configuration

    Step 1: Create a Pinterest Business Account & Access Developer Portal

    • 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.


    Step 2: Create Your App

    1. 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")

    2. 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


    1. Navigate to App Settings:

      • In your app dashboard, go to "OAuth" or "Settings" section

      • Configure OAuth redirect URIs

    2. Set Redirect URIs:

    Example:

    1. 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:

    1. Submit for Review:

      • Public apps require Pinterest review before going live

      • Provide detailed use case description

      • Include screenshots and flow documentation


    1. Go to the Appmixer BackOffice -> Configuration.

    2. Add new configuration: acme:pinterest.

    3. 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



    PostHog

    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.


    1. Identify Your PostHog Host URL

    PostHog can be used in the cloud or self-hosted. Use the appropriate base URL:

    Instance
    Host URL

    US Cloud

    https://us.posthog.com

    EU Cloud

    https://eu.posthog.com


    1. Log in to your PostHog instance.

    2. Click your avatar or name in the top-right corner and go to Settings.

    3. In the left sidebar, navigate to User → Personal API Keys.

    4. 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:

    Scope
    Needed for

    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:

    Field
    Value

    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.


    Continue Each

    Overview

    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.

    Usage

    Input Parameters

    Parameter
    Type
    Description

    Every row has two fields:

    Field
    Description

    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.

    Port
    Description
    Port
    Description
    Field
    Description
    1. Turn On Sequential in Each

      • Open the Each component and turn on Sequential.

    2. 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.

    beehiiv

    Prerequisites

    Before using beehiiv components in Appmixer, you need:

    1. A beehiiv account on the Scale plan ($49/mo) or higher — the free Launch plan does not include API access

    2. An API key generated from the beehiiv dashboard

    3. Owner or Admin role in your beehiiv workspace


    1. Create a beehiiv Account

    Sign up at https://app.beehiiv.com/signup.

    API access is only available on the Scale plan ($49/month) or higher. The free Launch plan does not include API access.

    2. Generate an API Key

    1. Log into your beehiiv account at

    2. Scroll down to Workspace Settings in the left sidebar

    3. Click API

    4. Click Create New Key

    5. Enter a name for the key (e.g., "Appmixer Integration")

    6. Click Create New Key

    7. Copy the generated API key immediately

    When adding a beehiiv component in Appmixer, you will be prompted to authenticate. Provide:

    Field
    Value

    The API key is used as a Bearer token for all requests to the beehiiv API (https://api.beehiiv.com/v2).


    Component
    Description
    Component
    Description

    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.

    Linear

    • 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.


    Slack

    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.

    Square

    • 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)

    JSON to CSV

    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

    1. Upload JSON File: Provide the fileId of the JSON file you wish to convert.

    2. Processing: The component processes the input JSON and converts it into a structured CSV format.

    3. Retrieve Output: The resulting CSV file's fileId and fileName are returned as output.

    API Agreement
    Rate Limits
    API Agreement

    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

    2. Generate a Personal API Key

    The Personal API key is shown only once at creation. Store it securely before closing the dialog.

    Personal API keys authenticate as you (the user who created them) and inherit your PostHog permissions. For production integrations, consider creating a dedicated PostHog user with appropriate project access.

    Required scopes

    3. Connect in Appmixer

    Troubleshooting

    "Authentication failed" / 401 Unauthorized

    "Connection refused" / network error

    403 Forbidden

    Resources

    Required scopes
    PostHog Personal API Keys documentation
    PostHog API reference

    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

    The API key is only shown once at the time of creation. Make sure to copy and store it in a secure location before closing the dialog.

    You must have an Owner or Admin role in your workspace to access API key settings.

    3. Connect in Appmixer

    Available Components

    Actions

    Triggers

    Troubleshooting

    "Authentication failed: Invalid API key"

    No publications returned

    "403 Forbidden" errors

    https://app.beehiiv.com

    Update an existing subscriber

    Triggers when a subscriber downgrades from premium

    Select your
    Workspace
    from the dropdown

    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

    Step 3: Configure OAuth Settings

    Step 4: Copy Your Credentials

    Step 5: Configure Webhooks (Optional)

    Step 6: Connector Configuration

    Step 7: Going Live

    Important Notes

    Useful Links

    Intercom Rate Limits
    Intercom Developer Documentation
    API Reference
    OAuth Guide
    Webhook Documentation
    blankImage
    blankImage
    Rate Limits

    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:

  • Rate Limits

  • Step 3: Configure OAuth Settings

    Step 4: Copy Your OAuth Credentials

    Step 5: Personal Access Token (Alternative)

    Step 6: Webhook Configuration (Optional)

    Step 7: Connector Configuration

    Step 8: Rate Limits

    Important Notes

    Useful Links

    Webhooks API
    Figma API Documentation
    OAuth Documentation
    Webhooks Guide
    Plugin Development
    alt text
    alt text
    Community Forum
  • 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:

  • - Create public boards and pins
  • 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

  • Specify which scopes you need and why
  • 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

  • Community Guidelines

  • Brand Guidelines

  • Step 3: Configure OAuth Settings

    Step 4: Copy Your Credentials

    Step 5: App Review Process

    Step 6: Connector Configuration

    Step 7: Rate Limits

    Important Notes

    Useful Links

    My Apps
    Pinterest Developers Documentation
    API Reference
    OAuth Guide
    Rate Limits
    alt text
    alt text
    Pinterest Business

    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.

    Add to Result

    Input Ports

    Output Ports

    Output Data for out Port

    Instructions

    Notes

    https://[YOUR_API_BASE]/auth/intercom/callback
    https://api.appmixer.com/auth/intercom/callback
    https://[YOUR_API_BASE]/auth/figma/callback
    https://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/callback
    https://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


    1. Set Callback URLs:

      • Add your OAuth callback URL in the "Callback URLs" field

      • For Appmixer, set the redirect URI to:

    Example:

    1. 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)

    2. 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:

    1. Create Webhook:

      • In API settings, go to "Webhooks" section

      • Click "Create webhook"

    2. Configure Webhook Settings:

      • URL: Your endpoint to receive webhook notifications

      • Label: Descriptive name for the webhook

      • Secret: Optional signing secret for verification

    3. 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:

    1. 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.


    1. Go to the Appmixer BackOffice -> Configuration.

    2. Add new configuration: acme:linear.

    3. Add your clientId and clientSecret keys with values from Linear.

    alt text

    1. Test OAuth Flow:

      • Linear authorization URL: https://linear.app/oauth/authorize

      • Required parameters: client_id, redirect_uri, response_type=code, scope

    2. 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


    • Linear API Documentation

    • GraphQL API Reference

    • OAuth Documentation

    • Webhook Guide


    Linear – Connector Configuration

    Step 1: Access Linear & Create Developer Account

    Step 2: Create Your OAuth Application

    Linear
    https://[YOUR_API_BASE]/auth/linear/callback
    https://api.appmixer.com/auth/linear/callback
    {
      viewer {
        id
        name
        email
      }
    }
    {
      issues(first: 10) {
        nodes {
          id
          title
          description
          state {
            name
          }
          assignee {
            name
          }
        }
      }
    }

    Step 3: Configure OAuth Settings

    Step 4: Copy Your OAuth Credentials

    Step 5: Webhook Configuration (Optional)

    Step 6: Personal API Key (Alternative)

    Step 7: Connector Configuration

    Step 8: GraphQL API Overview

    Step 9: Rate Limits

    Useful Links

    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

    Setting the redirect URL

    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.


    Scope
    Description

    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.

    Activate Public Distribution

    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)

    Slack Event Subscription.

    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.

    Ignore bot scopes

    Scroll all the way down and hit continue. You get to a second page with user scopes.

    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.

    Register OAuth2 app

    Basic Information

    https://api.slack.com/apps
    appmixer service-config set appmixer:slack -u -d '{
      "clientId": "<Client ID>",
      "clientSecret": "<Client Secret>",
      "signingSecret": "<Signing Secret>",
      "authToken": "<App-Level Token>"
    }'

    OAuth & Permissions

    Redirect URL

    Bot Scopes

    User Scopes

    Events API

    Slack app migration

    Backoffice configuration

    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


    1. Navigate to OAuth Tab:

      • In your application dashboard, click on "OAuth"

      • Configure OAuth settings for secure authentication

    2. Set Redirect URIs:

      • Add your callback URL in the "Redirect URL" field

      • For Appmixer, set the redirect URI to:

    Example:

    1. 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:

    1. Navigate to Webhooks:

      • In your application dashboard, click on "Webhooks"

      • Click "Add Endpoint"

    2. 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

    3. Webhook Security:

      • Square signs webhook requests with a signature

      • Use the provided webhook signature key to verify authenticity


    1. Go to the Appmixer BackOffice -> Configuration.

    2. Add new configuration: acme:square.

    3. Add your clientId (Application ID) and clientSecret (Application Secret) keys with values.

    alt text

    1. 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

    2. 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


    • Square Developer Documentation

    • API Reference

    • OAuth Guide

    • Webhook Documentation


    Square – Connector Configuration

    Step 1: Create a Square Developer Account & Access Developer Portal

    Step 2: Create Your Application

    Square
    Square Developer Portal
    https://[YOUR_API_BASE]/auth/square/callback
    https://api.appmixer.com/auth/square/callback

    Step 3: Configure OAuth Settings

    Step 4: Copy Your Credentials

    Step 5: Webhook Configuration (Optional)

    Step 6: Connector Configuration

    Step 7: Rate Limits

    Useful Links

    2. Allowing Custom Tenant

    Step 1: Access Appmixer Admin

    Step 2: Locate Microsoft Connector

    Step 3: Add Tenant Configuration

    Step 4: Connect with Custom Tenant

    Tenant Value Options

    Disable Custom Tenant

    Add new client secret
    appmixer:microsofr

    OAuth consent screen

    Client ID and Client Secret

    Custom callback URL

    Domain verification

    When you use a Google Webhook component without a verified domain, you will receive the Unauthorized WebHook callback channel error.

    here
    CNAME
    HTML file method
    Creating appmixer:google service configuration
    Setting clientId and clientSecret
    Domain verification
    Download HTML verification file
    Google verification file uploaded via Backoffice
    Access tiers and limits

    Apigee

    The Apigee connector allows you block requests from specific IP addresses. To make the integration work, you need to

    1. register Google OAuth2 application

    2. perform setup in Apigee instance

    Google OAuth2 application registration

    Application verification

    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.

    Required scopes

    • 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

    MCP Gateway

    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.

    appmixer-mcp is a local (stdio) MCP server. Claude on the web (claude.ai custom connectors) accepts only remote MCP servers, so it can't use the gateway. Use Claude Code, Claude Desktop or another client that runs local MCP servers.

    How it works

    1. 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.

    2. 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).

    3. 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.

    1. Create a flow and add MCP Gateway from AI > MCP Tools.

    2. 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.

    3. 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: .

    1. 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: .

    Hubspot

    Register OAuth2 app

    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.

    Each

    Overview

    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).

    Building a Loop

    1. Provide a List

      • Set Field (list) to an array, or to a string with a valid JSON array.

    2. Turn On Sequential

      • Leave Item Timeout at its default (300 seconds) unless one item can take longer.

    3. Add the Steps for One Item

      • Connect them to the item port. Use the value variable of the item port for the current item.

    4. 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.

    5. 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.

    6. 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.

    Parameter
    Type
    Description
    Port
    Description
    Port
    Description
    Field
    Description
    Field
    Description

    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.

    Telegram

    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.

    The bot token grants full control of the bot (reading its messages, sending as the bot, changing its webhook). Treat it exactly like a password and never commit it to a repository or share it in a chat.


    1. Create a Bot with @BotFather

    1. Open Telegram (mobile or desktop) and search for @BotFather — the account with the blue verified checkmark.

    2. Start the chat and send /newbot.

    3. Enter a display name for the bot (e.g. Appmixer Notifier). This is what users see in the chat header.

    4. Enter a username for the bot. It must be unique and end with bot (e.g. appmixer_notifier_bot).

    5. BotFather replies with the token, in the form:

    6. 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.

    1. Add the bot to the group like any other member.

    2. 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.

    3. 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:

    Field
    Value

    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:

    Chat type
    Value to use

    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


    Limit
    Value

    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.


    Epic (on FHIR)

    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).

    ServiceNow

    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

  • Rate Limiting
    GraphQL Best Practices
  • order.updated

  • customer.created

  • customer.updated

  • Include Authorization: Bearer <access_token> header in requests

  • Test with endpoints like /v2/locations to verify authentication

  • Rate Limits
    Sandbox Testing
    appmixer-mcp
    sees only the gateways in flows that this user owns.

    Fields 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.

  • the label and tooltip of the field in the component inspector. A parameter is required if the field is required in the component.

    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.

  • The flow belongs to a different user than the one
    appmixer-mcp
    signs in as.
  • TOOLS 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.

  • Before you start

    Build the flow

    The tool definitions are built when the flow starts. After you change the components on the tool port, stop the flow and start it again.

    Get Appmixer credentials

    Configuration

    Set TOOLS=mcpgateway unless you want the model to manage your flows. With the default value the model also gets a tool that deletes flows.

    Connect Claude Code

    Connect Claude Desktop

    Claude Desktop doesn't load your shell profile when it starts the server. If you use nvm or another Node.js version manager and the server doesn't start, set command to the absolute path of npx (run which npx).

    Other MCP clients

    Check the connection

    Security

    Troubleshooting

    Connect Claude Code to tools via MCP
    appmixer-mcp README
    Connect to local MCP servers

    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.

    : spaces the items out in time, but does not keep them in order.

    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.

    Usage

    Input Parameters

    Input Ports

    Output Ports

    Output Data for item Port

    Output Data for done Port

    Other Options (Advanced)

    Notes

    Continue Each
    Join Each

    delay

    localhost
    , a private IP or a self-signed endpoint.
  • Each 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)

    Using an existing bot

    2. Configure the Bot for Your Use Case

    Direct messages (1:1 chats)

    Groups

    Changing Group Privacy only takes effect after the bot is removed from the group and added again.

    Channels

    3. Connect in Appmixer

    4. Find the Chat ID

    5. Triggers and Webhooks

    Limits

    Troubleshooting

    401 — Authentication failed

    403 — Forbidden

    400 — "chat not found"

    409 — Conflict

    429 — Rate limit exceeded

    The trigger never fires

    Resources

    Telegram Bots: an introduction for developers
    Bot API reference
    BotFather commands
    {
      "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-mcp
    curl -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:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw

    apigee.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

  • Required user roles

    Register Oauth2 app

    OAuth consent screen

    Client ID and Client Secret

    Custom callback URL

    Domain verification

    When you use a Google Webhook component without a verified domain, you will receive the Unauthorized WebHook callback channel error.

    Apigee setup

    Blocking IP Shared Flow Installation Guide

    Configure KVM storage

    https://console.developers.google.com/
    Step 1: Enable required APIs
    here
    CNAME
    HTML file method
    Developer Console
    New Project
    Creating appmixer:apigee service configuration
    Setting clientId and clientSecret
    Setting custom calback URL
    Domain verification
    Download HTML verification file
    Google verification file uploaded via Backoffice
    blocking-ip-shared-flow.zip
    archive · 4KB
    Open
    upload bundle
    deploy
    deploy
    create
    add policy step
    add policy
    create KVM
    — the developer API key from the previous step.
    A rejected request is logged as 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.
    ,
    lastname
    ,
    phone
    ,
    website
    ,
    company
    ,
    address
    ,
    city
    ,
    state
    and
    zip
  • Contact 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

    Prefer the "Conditionally required" bucket over "Required" for every scope (except oauth, which HubSpot manages itself). HubSpot validates the authorization URL against the app's scope configuration in both directions: a Required scope must appear in every authorization URL, while a scope marked Optional must not appear in the scope parameter at all. Conditionally required scopes are the flexible middle ground — they may be included in the scope parameter but do not have to be, so older connector versions (or other Appmixer instances sharing the app) that request fewer scopes keep working, and adding a new scope in a future connector release does not break existing deployments.

    When a new connector version adds a scope (e.g. forms and automation in bundle 4.8.0), add it to the HubSpot app configuration before deploying the connector — a consent request with a scope the app does not have configured fails. Scope granting is independent of the portal's subscription tier: HubSpot grants e.g. automation on any portal, but the workflows API itself requires a Professional/Enterprise subscription (or a developer test account) and returns 403 on lower tiers at call time.

    appId and apiKey are required for the webhook triggers when you use your own HubSpot app — without them the triggers do not start (HubSpot appId or apiKey missing in configuration). The connector uses them to manage the app's webhook settings and subscriptions (see Webhooks); with AuthHub they are not needed. The developer API key belongs to the HubSpot developer account, not to a customer portal, and can manage every app in that account — keep it only in the Backoffice configuration.

    Webhooks

    Target URL

    Request signatures

    Subscriptions

    Creating a record in HubSpot also sends property-change events for its initial values. Updated Contact and Updated Deal ignore them reliably only while the creation subscriptions (contact.creation, deal.creation) are active — keep those on even if you do not use New Contact or New Deal.

    Appmixer with AuthHub

    HubSpot ends support for legacy public apps (created before 23 June 2026) and for the /v1/–/v3/ APIs in September 2027 (announcement). The connector manages webhooks through that API with the developer API key. Once an app is migrated to HubSpot's projects framework, its webhook subscriptions are defined in the project and can no longer be changed through the API or the app management UI.

    Hubspot App verification

    Request signatures
    request signatures
    appmixer:hubspot

    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:

    Connector component
    Required Incoming APIs (R4)

    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:

    1. 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).

    2. 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.

    3. 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.

    4. 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.

    5. 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.

    1. Create an Epic on FHIR account

    2. Register an app

    https://fhir.epic.com
    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)

    3. Select Incoming APIs

    Alphabetical checklist

    The connector requests these SMART on FHIR scopes during authentication: openid, fhirUser and user/<Resource>.read for Patient, Condition, Observation, Medication, MedicationRequest, Procedure, CarePlan, Goal, Immunization, DiagnosticReport, DocumentReference, Device and Appointment. The .read scope covers both the read and search interaction — whether a search call is actually allowed is controlled purely by the Incoming APIs selected above, not by the scope string. No connector configuration change is needed when you add more APIs to the app.

    4. Client ID and client secret

    Changes on fhir.epic.com — creating an app, generating a client secret, adding Incoming APIs — are not effective immediately. Propagation to the sandbox typically takes tens of minutes and can take up to 12 hours. Until then the token endpoint returns invalid_client (unknown app / secret) or searches return 403 insufficient_scope (missing APIs).

    Additionally, Epic freezes the granted permissions at authorization time. After adding Incoming APIs to an existing app, users must re-authenticate — refreshing the access token is not enough, existing tokens (including refreshed ones) keep returning 403 insufficient_scope.

    Set clientId and clientSecret into Appmixer Backoffice

    Going to production

    Sandbox test logins

    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.

    Outbound REST
    • 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

    Log Message Screenshot

    To see messages triggered by the sn_ws.RESTMessageV2 within the Business Rule, go to System Logs > Outbound HTTP Requests

    Log Message Screenshot

    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:

    1. Created Inbound Authentication Profile

    2. Created REST API Key

    3. 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)

    Inbound Authentication Profile
    • REST API Access Policy

    1. All checkboxes except for Global and Apply to all versions should be checked

    2. The Inbound authentication profile table should have these two Authentication profiles:

      1. API Key

      2. On-call subscription basic authentication

    REST API Access Policy

    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.

    Setup the App administrator account

    Setup Webhooks

    Choose a Webhook Secret

    https://developer.servicenow.com/dev.do#!/home
    https://dev180380.service-now.com/

    Upgrading from a connector version before 4.0.0: running trigger flows stop receiving events until you reconnect the ServiceNow account with a Webhook Secret and add the X-Appmixer-Secret header to the REST Message.

    Create an Outbound REST Message

    Create a Business Rule

    Debug

    Username and Password Authentication

    Setup API Key

    Cliniko

    How to generate a Cliniko API key and connect Cliniko components in Appmixer. Cliniko does not use OAuth.

    Prerequisites

    Before using Cliniko components in Appmixer, you need:

    1. A Cliniko account — https://www.cliniko.com

    2. An API key generated from your own Cliniko user profile

    3. A Cliniko user whose permissions cover the data your flows touch (see Permissions)

    There is no OAuth app to register. Cliniko's API is API-key only — there is no OAuth app console, no client ID or secret, and no multitenant app to submit for verification. Every user connects with their own key. If you are looking for the "register your app" step other guides in this section have, Cliniko simply does not have one.


    1. Generate an API Key

    1. Log into Cliniko

    2. Open My Info from your user menu

    3. Go to Manage API keys

    4. Create a new API key and give it a name that says where it is used, e.g. Appmixer

    5. 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:

    Field
    Value

    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:

    Region
    Shards

    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.


    Component
    Description
    Component
    Description

    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.

    Telegram User

    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

    open.epic.com
    https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBladeportal.azure.com
    Azure portal

    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

    The key is only shown once, at creation time. Copy it before you close the dialog — if you lose it, delete the key and create a new one.

    2. Connect in Appmixer

    Permissions

    Online bookings and available times

    Rate limit

    Available Components

    Actions

    Triggers

    Cliniko has no webhooks, so every trigger polls. Two consequences: events arrive on the polling interval rather than instantly, and the first run after you start a flow only records a baseline — it does not replay records that already existed. Updated Patient and Updated Appointment poll the record's "updated at" timestamp, which also moves when a record is created, so they fire on new records too.

    Troubleshooting

    "Authentication failed (401)"

    "Access denied (403)" on some components only

    "Not found (404)" from Find Available Times or Get Next Available Time

    Requests reach the wrong Cliniko account, or 401 on a key that works elsewhere

    "Validation failed (422)" when creating a patient or contact

    A trigger does not fire

    https://docs.api.cliniko.com/developer-portal/
    Base URL and shards
    Permissions
    Online bookings and available times

    Archive Patient

    MS0xMjM0NTY3ODkwLUV4YW1wbGVLZXlOb3RSZWFsRG9Ob3RVc2VUaGlz-eu1
                                                            ↑
                                                          shard
    When:
    after
    ,
    Insert
    ,
    Update
    ,
    Delete
    . This setting will trigger an event in Appmixer whenever a record is inserted, updated, or deleted in the table.

    1. Open https://my.telegram.org and enter the phone number of the Telegram account, in international format (for example +420123456789).

    2. Telegram sends a login code as a message in the Telegram app (from the Telegram service chat), not by SMS. Enter it.

    3. Go to API development tools (https://my.telegram.org/apps).

    4. 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.

    5. Click Create application.

    6. Copy App api_id (a number) and App api_hash (32 characters).

    The Create new application form at my.telegram.org

    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 ERROR message of the form

    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.

    1. Create an empty folder and install the Telegram client library in it:

      mkdir telegram-session && cd telegram-session
      npm install teleproto
    2. Save 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.

    3. Run it:

      node session.js

    What 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.


    • Telegram API: obtaining api_id

    • Telegram API terms of service

    • teleproto, the client library used by the connector

    Telegram
    $ 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=

    The Session String grants full access to the Telegram account: its chats, contacts and settings. Treat it like a password. Use a dedicated Telegram account for Appmixer rather than your personal one.

    Telegram keeps accounts that log in through the client API under observation. An account used for flooding or spamming is banned for good. The connector only reads, and paces its requests, but keep the number of watched channels reasonable.

    1. Get the API ID and API Hash

    The form answers only with ERROR

    2. Generate the Session String

    What the Session String is

    What you need

    Generate it

    What you will see

    If the login fails

    After you have it

    Generate one Session String per Appmixer connection and do not use the same string anywhere else at the same time. Telegram revokes a session that is used from two places at once, and the connection then has to be created again.

    3. Connect in Appmixer

    4. Which Channels You Can Read

    5. How the New Channel Post Trigger Works

    Limits

    Self-Managed Installations

    Troubleshooting

    Invalid API ID / API Hash (API_ID_INVALID)

    Invalid Session String

    The Session String is no longer valid

    This session belongs to a bot

    Telegram did not answer within 30 seconds while connecting

    Channel does not exist

    Channel is private or not accessible

    "is a user or a bot, not a channel"

    Telegram asked to wait … seconds (FLOOD_WAIT)

    The trigger never fires

    Resources

    Business Rule

    Shopify

    Configure the Shopify.

    The setup depends on the connector version:

    • Version 3 and later — OAuth 2.0. You register one Shopify app and users connect their store through its consent screen. Version 4 calls the GraphQL Admin API only, which Shopify requires of new public apps in the App Store; version 3 calls the REST Admin API. Both use the same app setup; only the scopes differ (see below).

    • Version 2.x — an Admin API access token that each user creates in their own store admin. Shopify stopped allowing new custom apps to be created there on January 1, 2026, so this only works for stores that already have such an app.

    Version 3 and Later: OAuth 2.0 Application

    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.

    Create the App

    1. Open the Shopify Dev Dashboard, go to Apps and click Create app. Choose Start from Dev Dashboard, enter the app name and click Create.

    2. 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.

    3. Click Release.

    4. 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.

    1. In the Partner Dashboard, open Apps, select the app and click API access requests in the sidebar.

    2. In Protected customer data access, click Request access.

    3. 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:

    1. 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.

    2. If app development is not enabled yet, click Allow custom app development and confirm.

    1. On the app detail page, open the Configuration tab and click Configure in the Admin API integration section.

    2. Enable the following scopes (required by the Appmixer Shopify components):

      • read_customers, write_customers

    1. Open the API credentials tab and click Install app, then confirm with Install.

    2. 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:

    Trigger
    Fires when
    Scopes (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.

    Return Tracking
    , and the customer components (they include the customer's last order).
  • 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

    set the compliance webhooks (it's required for the submission)
    • 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

    Shopify grants the scopes configured in the app version, not the ones the connector asks for. A component whose scope is missing in the app answers 403 Forbidden. After you change the scopes, release a new version and reconnect the Shopify account in Appmixer so that the store owner approves them.

    read_orders covers the orders of the last 60 days only. For older orders, request the Read all orders scope under API access requests in the Partner Dashboard (it needs Shopify's approval) and add read_all_orders to the scopes of the app.

    What the Scopes Are For

    Choose the Distribution

    A public app that is not published can only be installed on development stores. To connect production stores, the app has to pass Shopify's app review. This guide does not cover all the requirements of the review.

    Request Protected Customer Data Access

    Compliance Webhooks

    Configuration in the Backoffice

    Connect Your Account in Appmixer

    Shopify keeps one valid access token per app and store. Connecting the same store a second time (as another account or by another user) invalidates the earlier account within an hour, so connect each store only once. The access token is refreshed automatically; an account that is not used for 90 days has to be reconnected.

    Version 2.x: Admin API Access Token

    Shopify no longer allows new custom apps to be created in the store admin (since January 1, 2026). The steps below can only be followed in a store where Develop apps already contains such an app. For new setups use connector version 4.

    Create a Custom App in Your Shopify Admin

    Configure API Scopes

    The report components run ShopifyQL queries through the GraphQL Admin API. They need only read_reports and also work on Basic and development stores.

    Generate the Access Token

    The token is displayed only once. If you lose it, uninstall and reinstall the app on the API credentials tab to generate a new one.

    Connect Your Account in Appmixer

    Trigger Components

    A checkout has an id only once Shopify lists it as abandoned, that is after the buyer entered contact details. Until then New Checkout and Updated Checkout emit the checkout token alone; afterwards they emit the whole abandoned checkout. Abandoned Cart sees a checkout about 10 minutes after it was abandoned.

    Version 1.x (Legacy): OAuth 2.0 Application

    The OAuth setup below is only needed for connector versions 1.x. Note that only a 'developer' shop instance can be authenticated with your OAuth application unless your app is verified by Shopify. 'Production' shop instances cannot authenticate with an unverified app. This guide does not cover all the requirements for the app verification process.

    Setting Up a Shopify Partner Account

    Create a New App

    Configuration in the Backoffice

    What the Scopes Are For
    Partner Dashboard
    Connector Configuration
    Shopify Partners page
    Connector Configuration
    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
    Use App Events
    Backoffice
    Backoffice
    Backoffice
    Backoffice
    Backoffice
    Backoffice
    Setting a custom callback URL for Google Auth
    Backoffice