Documentation
Build a workflow you can execute and inspect.
For teams with app access. Follow an event into an agent task, inspect its execution and define the event that confirms the outcome. API and policy references are included below.
-
1
Start in Workflows.
Once your access is set up, open Workflows. A workspace without workflows offers a starter you can install and run from the app.
This quickstart uses the hosted app.
Pre-register -
2
Define the work and completion event.
New workflow connects an event to an agent task. Specify a name, the event and the instruction. The full YAML form has a rules list. This example starts from an issue label, asks an agent to prepare a pull request and waits for a merge event.
first-run.yamlDownload
rules: - name: first-run on: plane.label_added if: { label: first-run } do: - agent: { type: first-run, context: "Fix {issue.title} and open a pull request." } - plane.comment: "Picked up. The pull request is linked in the run." verify: on: github.pr.merged within: 24h finally: - matrix.send: "[{_status}] first-run {issue.title}"
Validated against the Recuriant workflow parser on 2026-11-02. Workflow language version 1.
Recuriant validates a workflow before saving it. With a declared policy, mutating steps are checked before execution: by default, L1 runs, L2 waits for approval and L3 is refused.
How tiers are applied -
3
Inspect the run.
Label an issue to start the workflow. In Executions, inspect each step's result and duration. An agent dispatch links to the agent's execution. Held actions appear in Approvals.
- first-run on plane.label_added first-run started
- first-run agent type=first-run dispatched
- first-run plane.comment L1 · ran
- first-run verify github.pr.merged within 24h watching until tomorrow 09:12
Illustrative example with fictional data Run results and available policy decisions can also be read through the API. Allow and deny audit writes are best effort; held approval state requires storage.
Authenticate with an API key.
Every request carries a key as a bearer token. Requests go to the API address you receive with your workspace; the examples call it $RECURIANT_API.
- Create a key in the app under API Keys. Give it a name and an expiry of 30 days, 90 days, one year or never. The key is shown once, so copy it then.
- A key that starts with ck_ acts for the person who created it. A key that starts with cka_ belongs to a managed agent and carries only the scopes of that agent's role.
- A key can call actions and read runs. It cannot approve a held step: approvals need a human login.
- Revoke a key from the same screen when you no longer need it.
Check a key
curl "$RECURIANT_API/me" -H "Authorization: Bearer $RECURIANT_API_KEY"
API reference.
Use the API address supplied with your workspace. Bodies are JSON, and /openapi.json serves the machine-readable schema. The examples below show selected response fields.
GET /me who you are
Returns the person or agent behind the key and the workspace it belongs to.
Request
curl "$RECURIANT_API/me" \ -H "Authorization: Bearer $RECURIANT_API_KEY"
Response, abridged
{
"sub": "<id>",
"email": "<email>",
"username": "ana",
"tenant": {
"id": "<id>",
"slug": "acme",
"name": "acme"
},
"role": "",
"principal_type": "user",
"principal_id": "<id>"
}
GET /workflows your workflows
Lists each workflow with its trigger, conditions, steps and whether it declares a verification.
Request
curl "$RECURIANT_API/workflows" \ -H "Authorization: Bearer $RECURIANT_API_KEY"
Response, abridged
{
"workflows": [
{
"name": "first-run",
"on": "plane.label_added",
"conditions": {
"label": "first-run"
},
"steps": 2,
"do": [
{
"action": "agent"
},
{
"action": "plane.comment"
}
],
"has_verify": true
}
],
"defaults": {}
}
GET /actions the action catalog
Lists every action your key can call, with its inputs, whether it changes anything outside Recuriant, its reversibility, impact and tier.
Request
curl "$RECURIANT_API/actions" \ -H "Authorization: Bearer $RECURIANT_API_KEY"
Response, abridged
{
"tenant": "acme",
"actions": [
{
"name": "matrix.send",
"kind": "connector",
"mutates_external_state": true,
"reversibility": "reversible",
"impact": "low",
"tier": "L1"
}
],
"total": 1
}
POST /actions/{action} call one action
Runs an action by name through the configured execution checks. Put the action's arguments under args. A call that continues in the background returns 202 with a status URL in data.
Request
curl -X POST "$RECURIANT_API/actions/matrix.send" \
-H "Authorization: Bearer $RECURIANT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"args": {"body": "Deploy complete"}}'
Response, abridged
{
"ok": true,
"output": "<the action output>",
"data": {}
}
POST /dry-run preview an event
Explains which workflows match a sample event and why. It dispatches no work and records no policy decision. With explain set, the response also includes workflows that did not match.
Request
curl -X POST "$RECURIANT_API/dry-run" \
-H "Authorization: Bearer $RECURIANT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event": "plane.label_added", "vars": {"label": "first-run"}, "explain": true}'
Response, abridged
{
"event": "plane.label_added",
"vars": {
"label": "first-run"
},
"matched_workflows": 1,
"total_evaluated": 1,
"matches": [
{
"workflow": "first-run",
"matched": true
}
],
"results": [
{
"workflow": "first-run",
"matched": true
}
]
}
GET /executions list runs
Lists runs. Filter by workflow, type, status or issue. A list leaves out step logs; read one run for the full record.
Request
curl "$RECURIANT_API/executions?workflow=first-run" \ -H "Authorization: Bearer $RECURIANT_API_KEY"
Response, abridged
[
{
"id": "<id>",
"type": "workflow",
"status": "completed",
"workflow_name": "first-run",
"event_type": "plane.label_added",
"started_at": "2026-11-02 09:10:04+00:00",
"finished_at": "2026-11-02 09:12:41+00:00",
"details_included": false,
"step_log": null
}
]
GET /executions/{id} read one run
Returns one run with its step log, the run that started it, the current step and its nesting depth.
Request
curl "$RECURIANT_API/executions/<id>" \ -H "Authorization: Bearer $RECURIANT_API_KEY"
Response, abridged
{
"id": "<id>",
"type": "workflow",
"status": "completed",
"workflow_name": "first-run",
"parent_execution_id": null,
"current_step": 2,
"total_steps": 2,
"depth": 0,
"details_included": true
}
Find the actions your workspace exposes.
Your catalog lists the actions your credentials allow. A connector's actions appear once its integration is configured for your workspace and disappear when it is turned off.
A managed agent's key lists read-only actions, workflows and the actions on its role, and nothing else. Each action declares how reversible it is and how far it reaches, and that sets its tier.
- plane.comment
- reversible, low impact: L1, runs
- plane.issue
- reversible, low impact: L1, runs
- matrix.send
- reversible, low impact: L1, runs
- http
- hard to undo, low impact: L2, waits for a person
- llm
- read-only: no gate
- grafana.query_metrics
- read-only: no gate
Connect an MCP client.
Recuriant's MCP server exposes workflows, runs, approval records and connector actions to compatible clients such as Claude Code or Cursor. Actions use the same configured checks as workflow steps. The server is not yet published as an installable package; contact the team to discuss access.
It authenticates with the same ck_ or cka_ key as the API.
Discuss MCP accessConfigure action policy.
With a declared policy, mutating steps are checked after their inputs are resolved and before execution. Your policy maps the default tiers below to allow, gate or deny.
- L1
- Reversible and low impact. The step runs. Its allow decision is written best effort unless the operation requires persistence.
- L2
- Other mutating actions, including unclassified actions. The step waits for a named approver, for 24 hours by default. Expiry denies the step unless the policy specifies grant or escalation. Approval state must be stored before the action can proceed.
- L3
- Irreversible with medium or high impact, or hard to undo with high impact. The step is refused; an available decision record identifies the rule.
- No policy declared
- Without a declared policy, workflow steps run ungoverned and no policy approval is held. Applicable identity scopes are still checked.
- policy_unavailable
- A declared policy that cannot be loaded blocks every action that would change an external system.
Check for the expected event.
A workflow can define an event that represents completion and a deadline. After its steps, the run waits for that event. If the deadline passes first, it records the missed outcome and runs the follow-up steps configured for that case.
incident-resolution.yamlDownload
rules: - name: incident-resolution on: alertmanager.firing if: { severity: critical } do: - agent: { type: incident, context: "Diagnose {alert.name} and propose one change." } as: diagnosis - plane.issue: { title: "[INCIDENT] {alert.name}", description: "{diagnosis}" } - http: { url: "https://deploy.example.com/rollback", method: POST, body: { service: "{alert.namespace}" } } verify: on: alertmanager.resolved within: 30m else: - alert: { severity: critical, summary: "{alert.name} is still firing after 30 minutes" } finally: - matrix.send: "[{_status}] incident-resolution {alert.name}"
Validated against the Recuriant workflow parser on 2026-11-02. Workflow language version 1.
- verify.on names the expected event. within sets its deadline as a duration such as 30m or 24h. Choose an event that represents the result you need to observe.
- else defines the steps to run when the deadline passes without the expected event.
- finally schedules cleanup or reporting after the workflow body, including when a step fails.
- A held action has a separate approval deadline: 24 hours by default, configured in policy. Expiry denies the action unless the policy specifies another outcome.
Understand errors and recovery.
The API returns a status code and JSON detail. Execution records show step results; available policy decisions explain why an action was allowed, held or refused.
- 401
- The key is missing, invalid or expired. Check the Authorization header, or create a new key.
- 404
- Unknown action. Call GET /actions for the names your workspace has.
- 422 invalid_action_arguments
- The arguments do not match the action's inputs. The detail names the field; compare it with the inputs GET /actions lists.
- 202
- Accepted. The work continues in the background; poll the status URL in data.
- 502, 503
- Key validation is briefly unavailable. Your key was not judged invalid: retry with backoff.
- refused · scope_missing
- The action is not on the token the run carries. No approval reopens it: add the action to the agent's role or move the step to a workflow that has it.
- refused · policy_unavailable
- Your declared policy could not be loaded. Restore it: until it loads, every step that would change something is refused.
Pre-register to use Recuriant.
Paid access is preparing to open. Leave your work details and plan interest, and we will contact you when access is available.