Integration Studio
Connect third-party APIs, manage webhooks, build event pipelines, and transform data between systems.
Overview
Integration Studio provides the glue layer between FlowOS and the rest of your toolchain. It exposes connectors (configured API connections), a webhook manager for outbound and inbound events, an event bus for platform-wide pub/sub, a REST API builder to expose custom endpoints, a data transformer, and a circuit-breaker dashboard for connection health monitoring.
Connectors
A connector is a configured connection to a third-party service. Once a connector is added and authenticated, it can be used in workflow action nodes, App Studio data sources, and the REST API builder.
/api/flows/connectorsList all configured connectors
/api/flows/connectorsAdd a new connector
/api/flows/connectors/:idGet connector details (secrets masked)
/api/flows/connectors/:idUpdate connector config or credentials
/api/flows/connectors/:idRemove a connector
/api/flows/connectors/:id/testHealth-check the connector (updates its healthCheck status)
/api/flows/connectors/:id/runtime-schemaList the connector's configured endpoints (name, method, path, schemas)
Create a connector
POST /api/flows/connectors
{
"connectorName": "Jira Production",
"connectorType": "rest_api",
"provider": "Atlassian Jira",
"configuration": {
"baseUrl": "https://acme.atlassian.net/rest/api/3",
"authType": "basic",
"authConfig": {
"username": "bot@acme.com",
"password": "{{secrets.JIRA_API_TOKEN}}"
}
},
"endpoints": [
{ "name": "Create issue", "method": "POST", "path": "/issue" }
]
}
// Response
{
"success": true,
"data": {
"_id": "con_01HZ...",
"connectorName": "Jira Production",
"connectorType": "rest_api",
"provider": "Atlassian Jira",
"configuration": { "baseUrl": "...", "authType": "basic", "authConfig": { "username": "bot@acme.com", "password": "***" } },
"isActive": true,
"healthCheck": { "enabled": false, "status": "unknown" }
}
}Built-in connector presets
GET /api/flows/connectors/presets returns ready-made starting configs (base URL, auth type, OAuth endpoints, sample endpoints) for common providers:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| slack | preset | optional | — | Slack — post messages, upload files (bearer token) |
| jira | preset | optional | — | Atlassian Jira — create/transition issues (basic auth) |
| teams | preset | optional | — | Microsoft Teams — send channel messages (OAuth2) |
| servicenow | preset | optional | — | ServiceNow — create incidents, update CMDB CIs (basic auth) |
| github | preset | optional | — | GitHub — create issues and issue comments (bearer token) |
| openai | preset | optional | — | OpenAI — create responses and embeddings (bearer token) |
| postgres | preset | optional | — | PostgreSQL — execute query, bulk upsert (basic auth) |
| twilio | preset | optional | — | Twilio — send SMS, create calls (basic auth) |
| whatsapp-twilio | preset | optional | — | WhatsApp via Twilio — send messages/media (basic auth) |
| pagerduty | preset | optional | — | PagerDuty — create incidents, list services/on-calls (bearer token) |
| datadog | preset | optional | — | Datadog — query metrics, create events, list monitors (api_key) |
| salesforce | preset | optional | — | Salesforce — create/update/query records (OAuth2) |
| azure-devops | preset | optional | — | Azure DevOps — work items and builds (OAuth2) |
| zendesk | preset | optional | — | Zendesk — tickets and users (api_key) |
| generic-rest | preset | optional | — | Blank REST scaffold for bespoke internal or partner systems |
Test one connector endpoint directly
POST /api/flows/connectors/:id/test-endpoint
{
"endpointName": "Create issue",
"body": {
"fields": { "project": { "key": "OPS" }, "summary": "Server disk at 95%", "issuetype": { "name": "Bug" } }
}
}
// Executes one real request through the connector's configured auth/baseUrl —
// the same call a workflow's Connector Action node would make.Webhooks
Outbound webhooks let FlowOS push event payloads to URLs you control when platform events occur. Inbound webhooks generate URLs that external systems can POST to, triggering workflows.
/api/webhooksList webhooks (filter by ?direction=inbound|outbound)
/api/webhooksCreate a webhook
/api/webhooks/:idGet webhook details
/api/webhooks/:idUpdate webhook name, url, direction, secret, or active state
/api/webhooks/:idDelete a webhook
/api/webhooks/:id/logsList delivery/receipt log entries for a webhook
Create an outbound webhook
POST /api/webhooks
{
"name": "Incident alerts to Slack bridge",
"direction": "outbound",
"url": "https://hooks.example.com/flowos-incidents",
"secret": "wh_sec_..." // used to sign outbound deliveries (X-FlowOS-Signature header)
}Verifying webhook signatures
import crypto from 'crypto'
function verifyFlowOSWebhook(
payload: string, // raw request body as string
signature: string, // X-FlowOS-Signature header value
secret: string
): boolean {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex')
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from('sha256=' + expected)
)
}
// Express handler
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const sig = req.headers['x-flowos-signature'] as string
if (!verifyFlowOSWebhook(req.body.toString(), sig, process.env.WH_SECRET!)) {
return res.status(401).send('Invalid signature')
}
const event = JSON.parse(req.body.toString())
// process event...
res.status(200).send('OK')
})Event Bus
The FlowOS event bus is a platform-wide pub/sub system. Producers publish events to named topics; consumers subscribe and process them asynchronously. Topics persist events for up to 7 days.
/api/events/typesList registered event types
/api/events/typesRegister a new event type
/api/events/emitEmit (publish) an event
/api/events/logQuery the event log (filter by eventName, source, dispatchStatus)
// Publish an event
POST /api/events/emit
{
"eventName": "infrastructure.disk.threshold_exceeded",
"payload": {
"host": "prod-web-01",
"mount": "/dev/sda1",
"usagePercent": 95,
"freeGb": 12
}
}
// Response
{ "eventId": "evt_01HZ...", "eventName": "infrastructure.disk.threshold_exceeded", "emittedAt": "2026-06-01T10:00:00Z" }Circuit Breaker
Every connector is protected by an automatic circuit breaker. After a configurable number of consecutive failures, the connector transitions to open state and requests are rejected immediately without waiting for a timeout. After a cooldown, the circuit moves to half-open to probe recovery.
GET /api/v1/connectors/:id/circuit-breaker
// Response
{
"data": {
"connectorId": "con_01HZ...",
"state": "closed", // "closed" (normal) | "open" (tripped) | "half-open"
"failureCount": 0,
"failureThreshold": 5,
"successCount": 142,
"lastFailureAt": null,
"nextRetryAt": null
}
}// Manually reset a tripped circuit
POST /api/v1/connectors/:id/circuit-breaker/resetData Transformer
The transformer converts data between shapes using JSONata expressions. Use it in workflow Transform nodes or call it directly via API to test expressions.
POST /api/v1/transformer/evaluate
{
"expression": "{ 'summary': title, 'assignee': assignedTo.email, 'tags': labels.name[] }",
"input": {
"title": "API latency spike",
"assignedTo": { "name": "Alice", "email": "alice@acme.com" },
"labels": [{ "name": "infra" }, { "name": "p1" }]
}
}
// Response
{
"data": {
"output": {
"summary": "API latency spike",
"assignee": "alice@acme.com",
"tags": ["infra", "p1"]
},
"durationMs": 2
}
}