Connector Builder Documentation
Build integration routes using visual activity blocks
Contents
501 (inbound webhooks are received but not yet processed) and any other
answers 404; no outbound connector is handed jobs. Nothing is charged for connectors.
This page describes what a connector definition records.
1. What is a Connector?
A Connector is a named integration route meant to bridge an external system to the Priostack execution engine. A connector is composed of one or more activity blocks, stored in order, describing how data should move from a source to a destination.
Every connector has a direction:
-
Inbound - declares events coming into Priostack from the outside world,
with a webhook or a cron schedule as its trigger. A webhook connector gets the URL
/api/connector/{id}/inbound; once published, that URL answers501and processes nothing. Intended use-cases: receive Stripe payment events, accept GitHub webhook pushes, trigger a workflow from a scheduled job. - Outbound - declares the BPMN service-task topic it is meant to serve and the delivery it describes (HTTP call, Telegram notification, email, etc.). Nothing hands it jobs today. Intended use-cases: call a third-party REST API, send a Slack message, push data to a warehouse.
Until a connector runtime exists, build the same integrations with code you run: a
worker that activates the service task's jobs (outbound), or your own
endpoint that calls POST /api/v1/process-instances (inbound).
2. Base Activity Types
Each connector is a chain of activities. The table below lists the activity types the builder stores, their category, and what each block is meant to configure. None of them runs today.
| Activity | Category | Description |
|---|---|---|
http |
I/O | Describes an HTTP request to a REST endpoint: method (GET, POST, PUT, PATCH, DELETE), URL and body. |
oauth2 |
Auth | Holds the OAuth2 settings (client ID, client secret, token endpoint) for the client-credentials or authorization-code flow. No token is fetched. |
transform |
Transform | Holds a field mapping written as FEEL expressions, with dot-notation for nested properties. |
filter |
Transform | Holds the FEEL predicate a message should match. Nothing evaluates it, so no message is dropped or redirected; no reject path is defined. |
aggregate |
Transform | Describes collecting N messages before proceeding, like the Layer 2 Aggregator pattern. |
split |
Transform | Describes expanding an array field into one branch per element. |
cache |
Storage | Describes storing or retrieving a value under a TTL-keyed entry. |
retry |
Flow | Describes a retry policy (maximum attempts, linear or exponential backoff) around a set of activities. |
delay |
Flow | Describes a pause of an ISO 8601 duration before the next activity. |
conditional |
Flow | Describes an if/else branch on a FEEL condition, with a then and an else sub-chain. |
| Webhook (inbound) | Trigger | Generates the URL /api/connector/{id}/inbound. It answers 501 once the connector is active, 404 before. |
| Schedule (inbound) | Trigger | Stores a cron expression. Nothing fires on it. |
| Process Start (outbound) | Output | Describes a process start: output_type: process_start with the process id in process_key and a variable mapping. Nothing starts it. |
| Message Channel (outbound) | Output | Names a Layer 2 channel to publish to. Nothing publishes to it, and BPMN catch events do not subscribe to channels. |
| Telegram Notify (outbound) | Output | Holds a Telegram bot, chat ID and message template. |
| Email Notify (outbound) | Output | Holds the recipients, subject and body of an email. |
3. Activity Control Flow
Every activity in a connector can have one or more control flow toggles enabled. These
map directly to the toggles visible in the Connector Builder UI and are stored on the activity
(async, repetitive, compensation, escalation,
goto, timer, constraints, retry_max,
retry_backoff). None of them is executed today; each description says what the
toggle is meant to express.
Asynchronous
Marks the activity as fire-and-forget: the chain would continue without waiting for its result.
Repetitive
Marks the activity as meant to repeat, for example to poll together with a delay
activity. It is a flag only: no loop condition is stored with it.
Compensation
Marks the activity as meant to undo the side effects of an earlier one (e.g., delete a record created by an earlier HTTP POST). It is unrelated to BPMN compensation, which the process engine does run (see BPMN Elements).
Escalation
Marks an error in the activity as meant for the parent scope (a conditional or retry block) rather than for the connector as a whole.
Goto
Names, in the goto field, the activity id the chain is meant to jump to
instead of proceeding sequentially.
Timer
Stores an ISO 8601 duration (e.g., PT30S for 30 seconds, PT5M for 5
minutes) meant to delay the activity. Unlike the Delay activity type, the Timer toggle
can be set on any activity type.
Constraints
A free-text condition stored with the activity. The Console builder sets it with a checkbox, as
"true" or empty. Nothing evaluates it: it neither skips an activity nor filters a
message. A filter's condition belongs in the filter activity's own config.
Retry
Stores a maximum retry count (retry_max, 0 = disabled) and a backoff strategy
(retry_backoff: linear or exponential). They are not
applied, because no activity runs.
4. Connector JSON Schema
The example below shows a complete connector definition as returned by
GET /api/connectors/{id}/export. You can import this JSON on any account using
POST /api/connectors/import, which creates a new draft connector (new id, version 1).
config is free-form: the builder stores whatever a block's panel collects, and this
example keeps the filter's condition in config.predicate. Export replaces config
values whose key names a secret (secret, token, password, API key and similar) with
***redacted***.
{
"id": "con_1712345678000000000",
"name": "Stripe → Start Billing Process",
"description": "Receive Stripe checkout.session.completed events and start a BPMN billing workflow",
"type": "inbound",
"trigger_type": "webhook",
"webhook_url": "/api/connector/con_1712345678000000000/inbound",
"status": "active",
"version": 2,
"created_at": "2026-04-01T10:00:00Z",
"updated_at": "2026-04-07T08:30:00Z",
"activities": [
{
"id": "a1",
"type": "filter",
"label": "Only completed checkouts",
"config": {
"predicate": "payload.type = \"checkout.session.completed\""
}
},
{
"id": "a2",
"type": "transform",
"label": "Extract customer data",
"config": {
"mapping": {
"customerId": "payload.data.object.customer",
"amount": "payload.data.object.amount_total / 100",
"currency": "payload.data.object.currency"
}
}
},
{
"id": "a3",
"type": "http",
"label": "Enrich from CRM",
"config": {
"method": "GET",
"url": "https://crm.example.com/api/customers/{{output.customerId}}"
},
"retry_max": 3,
"retry_backoff": "exponential"
},
{
"id": "a4",
"type": "output",
"label": "Start billing process",
"config": {
"output_type": "process_start",
"process_key": "billing_workflow",
"variables": {
"customerId": "output.customerId",
"amount": "output.amount",
"crmData": "output"
}
}
}
]
}
5. Quick-start: First Connector Deployment
-
Sign up and get your API key.
Create a free account at priostack.com. You get 100 credits at signup and 100 more per day; your API key arrives in the welcome email once you verify your address. No credit card required.
-
Open the Connector Builder in the Console.
Navigate to Console and click New Connector. Choose Inbound (Webhook) or Outbound depending on your integration direction.
-
Add and configure activity blocks.
Drag activity blocks from the sidebar into the canvas. Configure each block - set the HTTP URL, FEEL expression, or output target - and set the control flow toggles in the right panel. They are saved with the connector.
-
Publish your connector.
Click Publish to set the connector's status to active. For an inbound connector the webhook URL then answers
501(received but not yet processed); nothing runs and no execution log is written.
6. FAQ
How do I store OAuth2 secrets?
oauth2 activity stores the client ID, client secret and token endpoint in its
config. Connector configs are not encrypted at rest. Export replaces config values whose key
names a secret with ***redacted***, so a shared export carries no credentials. No
token is fetched or refreshed, because no connector runs.
What happens if an activity fails?
GET /api/connectors/{id}/logs) stays empty. retry_max and
retry_backoff are stored and not applied.
Can I use connectors without BPMN?
POST /api/v1/process-instances from it.
How are connector executions counted?
Can I export and share connectors?
connector.json file. The export strips execution logs and redacts secret-named
config values; the rest of the activity configuration is kept. On another account, use the Import button (or
POST /api/connectors/import) to recreate the connector in draft status, ready to
configure secrets and publish.