Step 1: Explore the catalog
The catalog is a read-only registry of the providers, catalog executors, and triggers that ship with Flowker. You discover them; you never create them.
1
List available providers
Call the List catalog providers endpoint to see the service types Flowker connects to. The catalog always includes the generic HTTP connector. Native providers such as
ledger (Midaz) and tracer are synthesized from published OpenAPI specifications and appear only when the native schema registry is configured and synthesis succeeds.2
List available catalog executors
Call the List catalog executors endpoint to see the operations a workflow node can invoke. Use List executors by provider to narrow the list to one provider.
3
List available triggers
Call the List catalog triggers endpoint to see the built-in trigger types: webhooks and schedules. The Execute workflow API starts a workflow but is not a catalog trigger.
Step 2: Create a provider configuration
Call
POST /v1/provider-configurations to define your connection to one instance of an external service.
A
providerId is a catalog identifier, and it does not always match the product name. Midaz is registered as ledger. Always take the value from List catalog providers rather than guessing it from the product name.Example request
Example request
Authentication
Theconfig.auth block holds the authentication the external service requires, as a { type, config } pair. Use the method your service expects.
Secret leaves in
config.auth are stored outside the persisted configuration document. An authorized provider-configuration read can resolve those values from the vault and return them in clear; leaves that are not resolved remain masked. Grant read access accordingly.
Anything else you place in the configuration document — a header, for example — is stored with the configuration, and a read can return it. Put each credential in config.auth.
To rotate a secret, send the new value in an update. To keep the current one, omit the field or send it blank — this works while auth.type stays the same. An update that changes auth.type must carry a value for each secret the new type requires and the previous one did not, otherwise Flowker rejects it with FLK-0952. A change between two types that use the same secret, such as oidc_user to oidc_client_credentials, does not need that value again.
Example — OIDC client credentials
Example — OIDC client credentials
Enabling and disabling
Provider configurations have two statuses:active (in use) and disabled (temporarily offline). They are created in active status. Use Disable provider configuration to take a connection out of service and Enable provider configuration to bring it back.
See the Provider configurations API for the full reference.
Step 3: Reference the provider configuration from a workflow node
Every executor node carries a
providerConfigId — the identifier of the provider configuration it calls through. Flowker rejects a workflow whose executor node has no providerConfigId, and rejects a value that is not a UUID. At run time it builds each outgoing request from the base URL of that provider configuration plus the path on the node, and the node fails if the provider configuration is not active.
These are the fields an executor node sets in its data object when it calls through the generic HTTP connector:
A node that calls an operation of an uploaded OpenAPI document names it with
operation_path and operation_method instead of an executorId. Flowker fills the executorId in for you from the provider configuration the node points at. Connecting your own API walks that whole path.
Validate a node configuration before you save
Call the Validate a node configuration endpoint (POST /v1/catalog/executors/{id}/validate) to check a node’s configuration against the catalog executor’s JSON Schema.
This performs JSON Schema validation only — it checks that your configuration object matches the structure the catalog executor expects (required fields, types, formats). It does not call the external service, so the first real round trip happens when a workflow runs the node.
Pass mappedTargets to name the fields your node supplies through an inputMapping rather than a fixed value. Those fields count as satisfied, so a node that maps a required field from the trigger validates before you save it.
Field mapping and data transformation
When workflow data doesn’t match the format an external service expects — or when a service returns data in a shape the next step can’t consume — use field mappings and transformations to bridge the gap. Field mappings and transformations are defined inside the
data object of executor nodes. Flowker applies input mappings before calling the external service, and output mappings after receiving the response.
An input target is a path in the outgoing request body, written exactly as the external service expects it — there is no wrapper object and no prefix to add. An output source is a path into the response envelope, so response fields sit under body.
Quick example — mapping workflow fields to an executor node
Quick example — mapping workflow fields to an executor node
${executor-balance.balance}.Step 4: Run the workflow
Reference the provider configuration in a workflow node of type
executor.
The example below creates a payment validation workflow on top of the FraudShield connection from Step 2. When a payment arrives, Flowker calls the fraud check service, evaluates the risk score, and either approves or rejects the payment based on the result.
The workflow has five nodes: a webhook trigger that receives the payment, an executor node that calls the fraud check service, a conditional node that evaluates the score, and two action nodes for the approve and reject outcomes. Edges connect them in sequence, with the conditional node branching to either path based on the score threshold.
Use the Create workflow endpoint to define the workflow, then Activate it, and finally Execute it.
Example — Create a payment validation workflow
Example — Create a payment validation workflow
check-fraud node names http — the generic HTTP connector from the catalog — and the FraudShield configuration created in Step 2, which holds the base URL and the credentials. Both sides name the same provider, so the workflow saves. Flowker sends the request to https://api.fraudshield.example.com/score-transaction.The node declares no outputMapping, so its output keeps the response envelope shape. The score therefore sits at check-fraud.body.score, which is what the evaluate-score condition reads. Add an outputMapping when you prefer a flatter name — see Field mapping and data transformation.Example — Execute the workflow
Example — Execute the workflow
Triggering workflows
Workflow executions are triggered via the Execute workflow endpoint:
inputData for the execution. All fields are available to subsequent nodes via the workflow namespace — for example, workflow.transactionId or workflow.amount. Node outputs are available via the node’s ID — for example, check-fraud.body.score for a node that declares no outputMapping.
Idempotency
Every execution request must include anIdempotency-Key header. Requests without it are rejected with 400 Bad Request (error FLK-0509). Generate a fresh UUID for each new execution, and reuse the same key only when retrying the identical request.
Webhook triggers
Webhooks are the primary way external systems trigger Flowker workflows. Instead of your system calling the executions API directly, you register a webhook path in a workflow and external services send HTTP requests to that path.
How it works
- Add a trigger node of type
webhookto your workflow with apath, amethod, and aninput_contractin itsdata. - When the workflow is activated, Flowker registers the path in its webhook registry.
- External systems send requests to
POST /v1/webhooks/{path}(or the method you configured). - Flowker resolves the path to the matching workflow and executes it.
Defining a webhook trigger node
The webhook trigger is a node withtype: "trigger" and triggerType: "webhook" in its data, plus a path, a method and an input_contract. Configuring a webhook trigger covers every field, the three input_contract modes and what each one requires, and carries a worked node for each mode.
The trigger configuration is a closed contract. Saving a workflow whose webhook trigger omits path, method or input_contract, misses a field its input_contract mode requires, names another mode’s schema id or operation field, or carries a key or a value the schema does not accept fails with FLK-0934. The schema also declares the optional response_mode and response_view fields — see Synchronous response mode.
Securing a webhook
Webhook delivery uses the same authentication as the rest of the API. With Access Manager enabled (PLUGIN_AUTH_ENABLED=true), every request to /v1/webhooks/* must carry a Bearer token (OIDC JWT), and the caller must hold the execute permission on the webhooks resource. Requests without a valid token are rejected with 401 Unauthorized.
Grant that permission to a machine-to-machine identity for each system you let call your webhooks, and manage the grant in Access Manager. This keeps webhook access under the same role and policy model as workflow management, rather than a credential attached to the path.
Webhook metadata
Flowker automatically injects a_webhook object into the execution’s inputData with metadata about the incoming request:
This metadata is available to all nodes in the workflow via the
workflow._webhook namespace.
Important notes
- Each webhook path + method combination can only be registered by one active workflow. Activating a second workflow with the same path fails with a conflict error.
- Webhook paths support nested segments (e.g.,
payments/stripe/received). - The request body maximum size is 1 MB.
- Deactivating a workflow automatically unregisters its webhook routes.
Synchronous response mode
By default, a webhook trigger responds with a202 receipt as soon as the execution starts (the async mode) — the caller must poll the execution status separately. Set response_mode to "sync" in the trigger node’s data to have Flowker hold the HTTP connection open and return the execution’s outcome directly in the response:
If the execution does not reach a terminal state before the internal wait cap elapses, Flowker falls back to the same
202 receipt (with a Location header pointing at the results endpoint) the async mode would have returned.
response_view selects the shape of the sync response body:
A failed execution’s
finalOutput (in full or final_output view) always carries status: "failed" and errorMessage, and errorClass when Flowker could classify the failure — never a bare {}. Absent a responseStatusCode override (see below), the sync HTTP status stays 200 for full/final_output/receipt (it reports transport health, not business outcome). A valid responseStatusCode on the terminal set_output node overrides that status for those three views.
An action node with actionType: "set_output" can carry an optional responseStatusCode (integer, 200–599) to override the HTTP status a sync webhook response returns. An out-of-range or non-integer value is rejected at save time (FLK-0122). For passthrough, the override applies only when the set_output node itself is the terminal step — a terminal executor’s relayed provider status always wins, and the no-response fallback always uses a plain 200 so an override never masks a failure.
Passthrough detection is strict: only the terminal step counts. A set_output terminal downstream of an executor is shaped as its own output — Flowker never walks back to an earlier executor’s response. On a failed execution the halting step is the terminal step, so a provider 4xx that stopped the workflow is relayed as the real 4xx.
Values in a set_output node’s output support ${...} references resolved against the workflow context — including ${workflow.<field>} (trigger payload), ${execution.id}, ${execution.startedAt}, and ${execution.now} (stamped at interpolation time). An unresolvable ${...} reference fails the step (fail-closed).
Error handling
If a node fails, the execution stops and is marked as
failed.
There is no automatic fallback. After retries are exhausted, the execution fails.
Execution results report the execution status and stepResults. A failed step provides stepNumber, nodeId, status, and errorMessage, with statusCode and errorClass when available; output is optional. Do not promise an errorCode, including FLK-0504 or FLK-0507, in every execution-results payload.
Retry and circuit breaker
Flowker includes built-in resilience for executor calls.
Retries
When an executor call fails with a transient error — a network error, a timeout on the attempt, any5xx status, or status 408 or 429 — Flowker retries automatically. Retry behavior is configurable per node, in the executor node’s data:
Retries only apply when the operation is safe to repeat. By default,
POST and PATCH calls are treated as non-idempotent and are not retried (a single attempt), while GET, PUT, DELETE, and other verbs retry normally. A retry.max_attempts greater than 1 opts that node into retries whatever the method is. A retry.max_attempts of 1 is not an opt-in — it sets a single attempt.
Non-retryable errors short-circuit to a single attempt regardless of configuration: circuit breaker open, context cancelled, configuration errors, secret-resolution failures, a request body over the configured size cap, a provider response body over the same cap, and non-transient 4xx provider responses (any 4xx except 408 and 429).
The retry applies per node execution. If all attempts fail, the step is marked as failed and the execution stops.
Circuit breaker
Flowker uses a circuit breaker to protect external services from being overwhelmed by repeated failing calls:
Provider
4xx client/auth errors do not trip the circuit: they are the caller’s problem, not a sign the provider is down. Only transport-level and 5xx failures count toward the threshold.
When the circuit is open, executor calls fail immediately with FLK-0507 instead of reaching the external service. This prevents cascading failures and gives the external service time to recover.
Circuit breaker state transitions
Executor configuration registry
This registry is a third, separate use of the word “executor”: its records are not the catalog executors of Step 1, not the workflow nodes of
type: "executor", and not the provider configurations of Step 2. The engine reads provider configurations to call external services, not these records, and the registry carries its own field vocabulary (baseUrl, endpoints, authentication). The registry exposes four operations:
Every record carries a
status, which the API reports in each response:
PATCH accepts name, baseUrl, endpoints, and authentication, plus the optional description and metadata. It does not accept status, but the list operation accepts status as a query filter. Update applies to records in unconfigured or configured status; delete applies to records in unconfigured, configured, or disabled status. No operation in this version moves a record into tested, active, or disabled; the table lists those values because responses report them and the list filter accepts them.
What’s next
Core concepts
Understand workflows, nodes, edges, and executions.
Provider configurations API
Explore the provider configuration API.

