Skip to content

Workflow AI

The Workflow AI canvas: create and edit workflows, run them, follow a run's progress, read node outputs and history, schedule runs, manage versions, tags, collaborators and the trash, and browse the tool catalogue the canvas is built from.

Anatomy of a workflow

A workflow is a graph of nodes. Each node is an instance of a catalogue API (a tool: an LLM prompt, a document extractor, a web search, a chart builder…) with its parameters filled in, connected by edges that pass one node's output to the next. The graph is stored as nodes and edges JSON in the workflow document and rendered by the canvas.

Runs

POST /microservices/workflow/start/ launches a run. Progress is pushed over the ws/workflow/{id}/nodes/ WebSocket (see Streaming & WebSockets); the same information is available by polling the node list and the outputs endpoint. Every completed run is archived as a history version.

Endpoints

MethodPathPurpose
GET/microservices/workflow/List workflows
GET/microservices/workflow/search/Search workflows
POST/microservices/workflow/start/Create a workflow
GET/microservices/workflow/{id}/Get a workflow
PUT/microservices/workflow/{id}/Save a workflow
DELETE/microservices/workflow/{id}/Move a workflow to the trash
GET/microservices/workflow/{id}/delete-impact/What deleting a workflow removes
GET/microservices/workflow/trash/List trashed workflows
POST/microservices/workflow/{id}/restore/Restore a workflow from the trash
DELETE/microservices/workflow/{id}/permanent-delete/Delete a workflow permanently
POST/microservices/workflow/rerun/Run a workflow
POST/microservices/workflow/branch-rerun/Run from a node
POST/microservices/workflow/stop/Stop a run
GET/microservices/workflow/{id}/nodes/Node execution status
GET/microservices/workflow/{id}/nodes/{node_execution_id}/One node's execution record
GET/microservices/workflow/{id}/outputs/Persistent outputs
GET/microservices/workflow/stats/Run statistics
GET/microservices/workflow/{id}/history/Run history (versions)
GET/microservices/workflow/{id}/history/{version}/One archived run
GET/microservices/workflow/{id}/history/latest/The most recent archived run
GET/microservices/workflow/{id}/versions/Definition snapshots
POST/microservices/workflow/{id}/versions/{revision}/restore/Restore a definition snapshot
POST/microservices/workflow/schedule/Schedule a workflow
PATCH/microservices/workflow/schedule/Enable or disable a schedule
DELETE/microservices/workflow/schedule/Delete a schedule
GET/microservices/workflow/scheduled-tasks/My schedules
GET/microservices/workflow-tags/My tags
POST/microservices/workflow-tags/Create a tag
PUT/microservices/workflow-tags/{tag_id}/Rename or recolour a tag
DELETE/microservices/workflow-tags/{tag_id}/Delete a tag
GET/microservices/workflows/{id}/tags/Tags on a workflow
POST/microservices/workflows/{id}/tags/attach/Attach tags to a workflow
DELETE/microservices/workflows/{id}/tags/{tag_id}/Detach a tag from a workflow
GET/microservices/workflow/{id}/collaborators/Collaborators on a workflow
POST/microservices/workflow/{id}/collaborators/Add or update collaborators
PATCH/microservices/workflow/{id}/collaborators/{user_id}/Change a collaborator's role
DELETE/microservices/workflow/{id}/collaborators/{user_id}/Remove a collaborator
POST/microservices/workflows/copy-to-user/Share a copy with users
POST/microservices/workflows/remove-users/Withdraw shared copies
POST/microservices/workflows/sync/Push my changes to everyone I shared with
POST/microservices/workflows/duplicate/Duplicate a workflow
GET/microservices/workflow-share-updates/Share updates waiting for me
GET/microservices/workflow-share-updates/{update_id}/A pushed definition (for review)
POST/microservices/workflow-share-updates/{update_id}/apply/Accept a share update
POST/microservices/workflow-share-updates/{update_id}/decline/Decline a share update
GET/microservices/documents/Files uploaded for workflows
POST/microservices/documents/Upload a file for a workflow node
DELETE/microservices/documents/Delete a workflow file
GET/microservices/apis/Tool catalogue
GET/microservices/apis/light/Tool catalogue (names only)
POST/microservices/apis/create/Register a custom tool
GET/microservices/apis/{id}/Get a tool
PUT/microservices/apis/{id}/Update a tool (owner)
DELETE/microservices/apis/{id}/Delete a tool (owner)
POST/microservices/apis/{id}/test/Call a tool directly
GET/microservices/categories/Tool categories
POST/microservices/categories/Create a category
GET/microservices/categories/{id}/Get a category
PUT/microservices/categories/{id}/Update a category
DELETE/microservices/categories/{id}/Deactivate a category

GET /microservices/workflow/

List workflows

Paginated (10 per page by default, page_size up to 100). Includes workflows you own, copies shared with you and workflows you collaborate on; my_role says which. Filter by published-app flags and by your tags.

With with_outputs=1 the list is reduced to {id, name} rows for workflows that have at least one node saving persistent outputs (the picker in Apps).

Auth: Session token · In the app: Workflow AI → list

Query parameters

FieldTypeRequiredDescription
pageintegernoDefault: 1.
page_sizeintegernoDefault: 10.
orderingstringnoModel field, prefix - for descending (e.g. -updated_at, name). Default: "-created_at".
available_as_appbooleanno
csv_dashbordbooleanno
chatbot_appbooleanno
tag_idsstringnoComma-separated tag uuids (your tags).
with_outputsbooleanno

Response 200 — A page.

FieldTypeDescription
countinteger
nextstring (uri), nullable
previousstring (uri), nullable
resultsobject[]
results[].idstring (uuid)
results[].userstringOwner username.
results[].namestring
results[].subtitlestring, nullable
results[].descriptionstring, nullable
results[].summarystring, nullable
results[].json_specobjectThe workflow definition (json_spec). A directed graph of nodes; each node runs one catalogue tool (kind = the tool's name from GET /microservices/apis/) with its params. Execution starts at entry, follows next, and a node whose requires.wait_for names other nodes waits for them to finish first. Parameters may reference earlier outputs: - "{{_output.<node_id>.<field>}}" inside a string (interpolated), or - {"$ref": "_output.<node_id>.<field>"} as a whole value.
results[].json_spec.namestring
results[].json_spec.versionstring
results[].json_spec.entrystring[]Node ids that start the run.
results[].json_spec.nodesobject[]
results[].json_spec.nodes[].idstringUnique within the workflow (the app uses step1, step2, …).
results[].json_spec.nodes[].kindstringTool name from the catalogue.
results[].json_spec.nodes[].namestringDisplay label (max 100 chars).
results[].json_spec.nodes[].paramsobjectTool parameters, per the tool's parameters schema.
results[].json_spec.nodes[].nextstring[]Node ids to run after this one.
results[].json_spec.nodes[].requiresobject
results[].json_spec.nodes[].requires.wait_forstring[]
results[].json_spec.nodes[].save_outputbooleanKeep this node's output as a persistent Output (Apps → outputs).
results[].json_spec.nodes[].export_outputbooleanInclude the output in exports.
results[].json_spec.edgesobject[]Canvas edges (kept for the editor; execution follows next).
results[].instructionsany[]App instructions shown to users of the published app.
results[].statusstring ("IDLE", "PENDING", "RUNNING", "COMPLETED", "FAILED", "STOPPED")
results[].available_as_appbooleanPublished in Apps.
results[].csv_dashbordbooleanPublished as a CSV dashboard app.
results[].run_onlyboolean
results[].chatbot_appbooleanPublished as a chatbot app.
results[].webhook_idstringWorkflow-level webhook id (pair with webhook_secret from the detail view).
results[].successful_run_countinteger
results[].created_atstring (date-time)
results[].updated_atstring (date-time)
results[].content_revisionintegerOptimistic-concurrency token for saves.
results[].my_rolestring ("owner", "editor", "viewer", null), nullable
results[].ownerobject, nullable
results[].owner.idinteger
results[].owner.usernamestring
results[].owner.emailstring
results[].last_edited_byobject, nullable
results[].last_edited_by.idinteger
results[].last_edited_by.usernamestring
results[].last_edited_atstring (date-time), nullable

Response 400 — Bad tag_ids.

json
{
  "error": "path is required"
}

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/search/

Search workflows

Same result shape as the list, filtered by search (name/description), status, app flags and tags. include_tags=true adds each workflow's tags.

Auth: Session token · In the app: Workflow AI → search box

Query parameters

FieldTypeRequiredDescription
searchstringno
statusstring ("IDLE", "PENDING", "RUNNING", "COMPLETED", "FAILED", "STOPPED")no
orderingstringnoDefault: "-updated_at".
available_as_appbooleanno
csv_dashbordbooleanno
chatbot_appbooleanno
tag_idsstringno
include_tagsbooleanno
pageintegerno
page_sizeintegerno

Response 200 — A page.

FieldTypeDescription
countinteger
nextstring, nullable
previousstring, nullable
resultsobject[]
results[].idstring (uuid)
results[].userstringOwner username.
results[].namestring
results[].subtitlestring, nullable
results[].descriptionstring, nullable
results[].summarystring, nullable
results[].json_specobjectThe workflow definition (json_spec). A directed graph of nodes; each node runs one catalogue tool (kind = the tool's name from GET /microservices/apis/) with its params. Execution starts at entry, follows next, and a node whose requires.wait_for names other nodes waits for them to finish first. Parameters may reference earlier outputs: - "{{_output.<node_id>.<field>}}" inside a string (interpolated), or - {"$ref": "_output.<node_id>.<field>"} as a whole value.
results[].json_spec.namestring
results[].json_spec.versionstring
results[].json_spec.entrystring[]Node ids that start the run.
results[].json_spec.nodesobject[]
results[].json_spec.nodes[].idstringUnique within the workflow (the app uses step1, step2, …).
results[].json_spec.nodes[].kindstringTool name from the catalogue.
results[].json_spec.nodes[].namestringDisplay label (max 100 chars).
results[].json_spec.nodes[].paramsobjectTool parameters, per the tool's parameters schema.
results[].json_spec.nodes[].nextstring[]Node ids to run after this one.
results[].json_spec.nodes[].requiresobject
results[].json_spec.nodes[].requires.wait_forstring[]
results[].json_spec.nodes[].save_outputbooleanKeep this node's output as a persistent Output (Apps → outputs).
results[].json_spec.nodes[].export_outputbooleanInclude the output in exports.
results[].json_spec.edgesobject[]Canvas edges (kept for the editor; execution follows next).
results[].instructionsany[]App instructions shown to users of the published app.
results[].statusstring ("IDLE", "PENDING", "RUNNING", "COMPLETED", "FAILED", "STOPPED")
results[].available_as_appbooleanPublished in Apps.
results[].csv_dashbordbooleanPublished as a CSV dashboard app.
results[].run_onlyboolean
results[].chatbot_appbooleanPublished as a chatbot app.
results[].webhook_idstringWorkflow-level webhook id (pair with webhook_secret from the detail view).
results[].successful_run_countinteger
results[].created_atstring (date-time)
results[].updated_atstring (date-time)
results[].content_revisionintegerOptimistic-concurrency token for saves.
results[].my_rolestring ("owner", "editor", "viewer", null), nullable
results[].ownerobject, nullable
results[].owner.idinteger
results[].owner.usernamestring
results[].owner.emailstring
results[].last_edited_byobject, nullable
results[].last_edited_by.idinteger
results[].last_edited_by.usernamestring
results[].last_edited_atstring (date-time), nullable

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/search/?search=digest" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflow/start/

Create a workflow

Saves a new workflow from a spec (status IDLE) and creates one execution row per node. Despite its name this does not run anything — call POST /microservices/workflow/rerun/ to run it.

If json.name is empty or "Untitled workflow" a name is generated.

Auth: Session token · In the app: Workflow AI → Save (new canvas)

Request body (application/json)

FieldTypeRequiredDescription
jsonobjectyesThe workflow definition (json_spec). A directed graph of nodes; each node runs one catalogue tool (kind = the tool's name from GET /microservices/apis/) with its params. Execution starts at entry, follows next, and a node whose requires.wait_for names other nodes waits for them to finish first. Parameters may reference earlier outputs: - "{{_output.<node_id>.<field>}}" inside a string (interpolated), or - {"$ref": "_output.<node_id>.<field>"} as a whole value.
json.namestringno
json.versionstringno
json.entrystring[]noNode ids that start the run.
json.nodesobject[]yes
json.nodes[].idstringyesUnique within the workflow (the app uses step1, step2, …).
json.nodes[].kindstringyesTool name from the catalogue.
json.nodes[].namestringnoDisplay label (max 100 chars).
json.nodes[].paramsobjectnoTool parameters, per the tool's parameters schema.
json.nodes[].nextstring[]noNode ids to run after this one.
json.nodes[].requiresobjectno
json.nodes[].requires.wait_forstring[]no
json.nodes[].save_outputbooleannoKeep this node's output as a persistent Output (Apps → outputs).
json.nodes[].export_outputbooleannoInclude the output in exports.
json.edgesobject[]noCanvas edges (kept for the editor; execution follows next).
vueflow_jsonobjectnoCanvas layout (optional for API clients).
descriptionstringno
subtitlestringno
summarystringno
instructionsany[]no
available_as_appbooleannoDefault: false.
csv_dashbordbooleannoDefault: false.
chatbot_appbooleannoDefault: false.
json
{
  "json": {
    "name": "Weekly competitor digest",
    "version": "1.0",
    "entry": [
      "step1"
    ],
    "nodes": [
      {
        "id": "step1",
        "kind": "web_search",
        "params": {
          "query": "competitor announcements this week"
        },
        "next": [
          "step2"
        ]
      },
      {
        "id": "step2",
        "kind": "llm_prompt",
        "params": {
          "prompt": "Summarise in 5 bullets: {{_output.step1.results}}"
        },
        "next": []
      }
    ]
  },
  "description": "Searches the web and summarises"
}

Response 201 — Created.

FieldTypeDescription
workflow_idstring (uuid)
json
{
  "workflow_id": "7d4c2b1a-0e9f-4a3b-8c7d-6e5f4a3b2c1d"
}

Response 400json is not an object or json.nodes is not a list.

json
{
  "username": [
    "A user with that username already exists."
  ]
}

Example

bash
curl -X POST "https://api.example.com/microservices/workflow/start/" \
  -H "Authorization: Token $FINBLADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{"name":"Weekly competitor digest","version":"1.0","entry":["step1"],"nodes":[{"id":"step1","kind":"web_search","params":{"query":"competitor announcements this week"},"next":["step2"]},{"id":"step2","kind":"llm_prompt","params":{"prompt":"Summarise in 5 bullets: {{_output.step1.results}}"},"next":[]}]},"description":"Searches the web and summarises"}'

GET /microservices/workflow/{id}/

Get a workflow

Full definition with node execution rows and access info. Pass ?webhook=true to look the workflow up by its webhook_id instead of its uuid.

Auth: Session token · In the app: Opening a canvas

Path parameters

FieldTypeRequiredDescription
idstringyes

Query parameters

FieldTypeRequiredDescription
webhookbooleannotrue = id is a webhook_id.

Response 200 — The workflow.

FieldTypeDescription
idstring (uuid)
userstringOwner username.
namestring
subtitlestring, nullable
descriptionstring, nullable
summarystring, nullable
json_specobjectThe workflow definition (json_spec). A directed graph of nodes; each node runs one catalogue tool (kind = the tool's name from GET /microservices/apis/) with its params. Execution starts at entry, follows next, and a node whose requires.wait_for names other nodes waits for them to finish first. Parameters may reference earlier outputs: - "{{_output.<node_id>.<field>}}" inside a string (interpolated), or - {"$ref": "_output.<node_id>.<field>"} as a whole value.
json_spec.namestring
json_spec.versionstring
json_spec.entrystring[]Node ids that start the run.
json_spec.nodesobject[]
json_spec.nodes[].idstringUnique within the workflow (the app uses step1, step2, …).
json_spec.nodes[].kindstringTool name from the catalogue.
json_spec.nodes[].namestringDisplay label (max 100 chars).
json_spec.nodes[].paramsobjectTool parameters, per the tool's parameters schema.
json_spec.nodes[].nextstring[]Node ids to run after this one.
json_spec.nodes[].requiresobject
json_spec.nodes[].requires.wait_forstring[]
json_spec.nodes[].save_outputbooleanKeep this node's output as a persistent Output (Apps → outputs).
json_spec.nodes[].export_outputbooleanInclude the output in exports.
json_spec.edgesobject[]Canvas edges (kept for the editor; execution follows next).
instructionsany[]App instructions shown to users of the published app.
statusstring ("IDLE", "PENDING", "RUNNING", "COMPLETED", "FAILED", "STOPPED")
available_as_appbooleanPublished in Apps.
csv_dashbordbooleanPublished as a CSV dashboard app.
run_onlyboolean
chatbot_appbooleanPublished as a chatbot app.
webhook_idstringWorkflow-level webhook id (pair with webhook_secret from the detail view).
successful_run_countinteger
created_atstring (date-time)
updated_atstring (date-time)
content_revisionintegerOptimistic-concurrency token for saves.
my_rolestring ("owner", "editor", "viewer", null), nullable
ownerobject, nullable
owner.idinteger
owner.usernamestring
owner.emailstring
last_edited_byobject, nullable
last_edited_by.idinteger
last_edited_by.usernamestring
last_edited_atstring (date-time), nullable
vueflow_jsonobjectCanvas layout (positions, edges) for the editor.
webhook_secretstringSecret for the workflow-level webhook.
nodesobject[]
nodes[].idstring (uuid)Node execution id (distinct from the spec's node_id).
nodes[].workflowstring (uuid)
nodes[].namestring, nullable
nodes[].node_idstringThe node's id in the spec.
nodes[].kindstring
nodes[].paramsobject
nodes[].statusstring ("PENDING", "RUNNING", "COMPLETED", "FAILED", "SKIPPED", "STOPPED", "WAITING")
nodes[].inputobject
nodes[].outputobject, nullableThe tool's result once the node completes.
nodes[].nextobject|array, nullable
nodes[].attempt_countinteger
nodes[].save_outputboolean
nodes[].export_outputboolean
nodes[].started_atstring (date-time), nullable
nodes[].finished_atstring (date-time), nullable
nodes[].batch_idstring, nullable
nodes[].batch_totalinteger, nullable
nodes[].batch_completedinteger
nodes[].is_batch_processorboolean
nodes[].progress_percentageinteger, nullableFor batch nodes only.
is_ownerboolean
can_editboolean
collaboratorsobject[]Present for the owner only.
collaborators[].userobject
collaborators[].user.idinteger
collaborators[].user.usernamestring
collaborators[].user.emailstring
collaborators[].rolestring ("editor", "viewer")
collaborators[].role_labelstring
collaborators[].created_atstring (date-time)
sharerobjectPresent on a copy you received — who shared it.
only_view_in_appsbooleanOn a received copy — you may only run it from Apps.
shareesobject[]Present on your own workflow — who received copies.
sharees[].idinteger
sharees[].usernamestring
sharees[].emailstring
sharees[].only_view_in_appsboolean

Response 404 — Not found or no access.

json
{
  "detail": "Authentication credentials were not provided."
}

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/7d4c2b1a-0e9f-4a3b-8c7d-6e5f4a3b2c1d/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

PUT /microservices/workflow/{id}/

Save a workflow

Replaces the definition and metadata (editors and owners). Send expected_content_revision (the value you last read) to detect concurrent edits: on mismatch the response is 409 with the current revision, who saved it, and the current workflow. Saving while a run is in flight is allowed and flagged with warning: "running". Collaborators on the canvas receive the new definition over the nodes WebSocket.

Auth: Session token · In the app: Workflow AI → Save

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Request body (application/json)

FieldTypeRequiredDescription
namestringyes
subtitlestringno
descriptionstringno
summarystringno
json_specobjectyesThe workflow definition (json_spec). A directed graph of nodes; each node runs one catalogue tool (kind = the tool's name from GET /microservices/apis/) with its params. Execution starts at entry, follows next, and a node whose requires.wait_for names other nodes waits for them to finish first. Parameters may reference earlier outputs: - "{{_output.<node_id>.<field>}}" inside a string (interpolated), or - {"$ref": "_output.<node_id>.<field>"} as a whole value.
json_spec.namestringno
json_spec.versionstringno
json_spec.entrystring[]noNode ids that start the run.
json_spec.nodesobject[]yes
json_spec.nodes[].idstringyesUnique within the workflow (the app uses step1, step2, …).
json_spec.nodes[].kindstringyesTool name from the catalogue.
json_spec.nodes[].namestringnoDisplay label (max 100 chars).
json_spec.nodes[].paramsobjectnoTool parameters, per the tool's parameters schema.
json_spec.nodes[].nextstring[]noNode ids to run after this one.
json_spec.nodes[].requiresobjectno
json_spec.nodes[].requires.wait_forstring[]no
json_spec.nodes[].save_outputbooleannoKeep this node's output as a persistent Output (Apps → outputs).
json_spec.nodes[].export_outputbooleannoInclude the output in exports.
json_spec.edgesobject[]noCanvas edges (kept for the editor; execution follows next).
vueflow_jsonobjectno
instructionsany[]no
available_as_appbooleanno
csv_dashbordbooleanno
run_onlybooleanno
chatbot_appbooleanno
expected_content_revisionintegernoRevision you are editing on top of.
json
{
  "name": "Weekly competitor digest",
  "json_spec": {
    "name": "Weekly competitor digest",
    "version": "1.0",
    "entry": [
      "step1"
    ],
    "nodes": []
  },
  "available_as_app": true,
  "expected_content_revision": 14
}

Response 200 — Saved.

FieldTypeDescription
messagestring
content_revisioninteger
warningstringrunning when a run was in flight.
json
{
  "message": "Workflow updated",
  "content_revision": 15
}

Response 400 — Validation errors.

json
{
  "username": [
    "A user with that username already exists."
  ]
}

Response 409 — Someone saved a newer revision.

json
{
  "detail": "Workflow save conflict.",
  "content_revision": 16,
  "last_edited_by": {
    "id": 57,
    "username": "omar"
  },
  "last_edited_at": "2026-09-22T07:55:00Z",
  "workflow": {
    "id": "7d4c2b1a-…",
    "name": "Weekly competitor digest"
  }
}

Example

bash
curl -X PUT "https://api.example.com/microservices/workflow/<id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Weekly competitor digest","json_spec":{"name":"Weekly competitor digest","version":"1.0","entry":["step1"],"nodes":[]},"available_as_app":true,"expected_content_revision":14}'

DELETE /microservices/workflow/{id}/

Move a workflow to the trash

Owner only. Soft delete with 30-day retention (WORKFLOW_TRASH_RETENTION_DAYS); schedules and webhooks stop firing. Apps shared off this workflow go with it; independent copies given to others are untouched.

Auth: Session token · In the app: Workflow AI → Delete

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Response 200 — Trashed.

FieldTypeDescription
messagestring
statusstring ("trashed")
idstring
deleted_atstring (date-time)
purge_atstring (date-time)
side_effectsobject

Response 404 — Not found or not the owner.

json
{
  "detail": "Authentication credentials were not provided."
}

Example

bash
curl -X DELETE "https://api.example.com/microservices/workflow/<id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/{id}/delete-impact/

What deleting a workflow removes

Auth: Session token · In the app: Delete confirmation dialog

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Response 200 — Impact report (counts are null when the run store is unreachable).

FieldTypeDescription
workflowobject
workflow.idstring
workflow.namestring
workflow.is_trashedboolean
artifactsobject
artifacts.countinteger
artifacts.bytesinteger
artifacts.samplestring[]
chartsobject
charts.countinteger
charts.samplestring[]
dashboardsobject
dashboards.emptiedobject[]
chat_sessionsobject
chat_sessions.countinteger
chat_sessions.samplestring[]
run_historyobject
run_history.versionsinteger, nullable
dashboard_documentsobject
dashboard_documents.countinteger, nullable
spec_revisionsinteger
schedulesstring[]
queued_webhook_runsinteger
node_runsinteger
extractor_tables_deletedobject[]

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/<id>/delete-impact/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/trash/

List trashed workflows

Auth: Session token

Response 200 — Trashed workflows with deleted_at and purge_at.

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/trash/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflow/{id}/restore/

Restore a workflow from the trash

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Response 200 — Restored.

FieldTypeDescription
statusstring ("restored")
idstring

Response 404 — No such trashed workflow.

json
{
  "detail": "Authentication credentials were not provided."
}

Example

bash
curl -X POST "https://api.example.com/microservices/workflow/<id>/restore/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

DELETE /microservices/workflow/{id}/permanent-delete/

Delete a workflow permanently

Destroys the workflow and everything it produced (run history, outputs, artifacts, charts, extracted tables it created). Cannot be undone.

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Response 200 — Purged.

FieldTypeDescription
statusstring ("permanently_deleted")
idstring
deletedobjectPer-resource counts.

Response 404 — Not your workflow.

json
{
  "detail": "Authentication credentials were not provided."
}

Example

bash
curl -X DELETE "https://api.example.com/microservices/workflow/<id>/permanent-delete/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflow/rerun/

Run a workflow

Starts a full run: every node is reset and the entry nodes are dispatched. Returns immediately with the run's history version; follow progress on the ws/workflow/{id}/nodes/ WebSocket or by polling GET /microservices/workflow/{id}/nodes/.

Editors and owners may run. Starting a run while one is in flight resets it — use the webhook trigger if calls may overlap; it queues them.

Auth: Session token · In the app: Workflow AI → Run

Request body (application/json)

FieldTypeRequiredDescription
workflow_idstring (uuid)yes
webhook_payloadobjectnoOptional input merged into the entry nodes' params as _webhook_payload.
json
{
  "workflow_id": "7d4c2b1a-0e9f-4a3b-8c7d-6e5f4a3b2c1d"
}

Response 200 — Started.

FieldTypeDescription
messagestring
versionintegerHistory version reserved for this run.
json
{
  "message": "Workflow has been re-run.",
  "version": 13
}

Response 404 — Not found or no edit access.

json
{
  "detail": "Authentication credentials were not provided."
}

Example

bash
curl -X POST "https://api.example.com/microservices/workflow/rerun/" \
  -H "Authorization: Token $FINBLADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"workflow_id":"7d4c2b1a-0e9f-4a3b-8c7d-6e5f4a3b2c1d"}'

POST /microservices/workflow/branch-rerun/

Run from a node

Re-runs one node (run_to_the_end: false) or the branch from that node to the end, reusing upstream outputs. Parameter references to earlier nodes are resolved from the last run.

Auth: Session token · In the app: Node menu → Run from here / Run this node

Request body (application/json)

FieldTypeRequiredDescription
workflow_idstring (uuid)yes
start_node_idstringyesSpec node id.
run_to_the_endbooleannoDefault: false.
save_outputsbooleannoHonour save_output on newly created node rows. Default: false.
webhook_payloadobjectno
json
{
  "workflow_id": "7d4c2b1a-0e9f-4a3b-8c7d-6e5f4a3b2c1d",
  "start_node_id": "step2",
  "run_to_the_end": true
}

Response 200 — Started.

FieldTypeDescription
workflow_idstring
start_node_idstring
run_to_the_endboolean
nodes_in_branchinteger
save_outputsboolean
messagestring

Response 400 — Missing ids, unknown node, or the branch is invalid.

json
{
  "error": "path is required"
}

Example

bash
curl -X POST "https://api.example.com/microservices/workflow/branch-rerun/" \
  -H "Authorization: Token $FINBLADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"workflow_id":"7d4c2b1a-0e9f-4a3b-8c7d-6e5f4a3b2c1d","start_node_id":"step2","run_to_the_end":true}'

POST /microservices/workflow/stop/

Stop a run

Auth: Session token · In the app: Workflow AI → Stop

Request body (application/json)

FieldTypeRequiredDescription
workflow_idstring (uuid)yes

Response 200 — Stopped.

FieldTypeDescription
workflow_idstring
statusstring ("STOPPED")
nodes_stoppedinteger
messagestring

Response 400 — Not running.

json
{
  "error": "Workflow cannot be stopped. Current status: COMPLETED"
}

Example

bash
curl -X POST "https://api.example.com/microservices/workflow/stop/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/{id}/nodes/

Node execution status

One row per node with status, timing and output from the current or last run. The same payload the nodes WebSocket pushes.

Auth: Session token · In the app: Canvas node badges (fallback polling)

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Response 200 — Nodes.

Array of:

FieldTypeDescription
idstring (uuid)Node execution id (distinct from the spec's node_id).
workflowstring (uuid)
namestring, nullable
node_idstringThe node's id in the spec.
kindstring
paramsobject
statusstring ("PENDING", "RUNNING", "COMPLETED", "FAILED", "SKIPPED", "STOPPED", "WAITING")
inputobject
outputobject, nullableThe tool's result once the node completes.
nextobject|array, nullable
attempt_countinteger
save_outputboolean
export_outputboolean
started_atstring (date-time), nullable
finished_atstring (date-time), nullable
batch_idstring, nullable
batch_totalinteger, nullable
batch_completedinteger
is_batch_processorboolean
progress_percentageinteger, nullableFor batch nodes only.

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/<id>/nodes/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/{id}/nodes/{node_execution_id}/

One node's execution record

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes
node_execution_idstring (uuid)yesThe execution row id (not the spec node_id).

Response 200 — Node.

FieldTypeDescription
idstring (uuid)Node execution id (distinct from the spec's node_id).
workflowstring (uuid)
namestring, nullable
node_idstringThe node's id in the spec.
kindstring
paramsobject
statusstring ("PENDING", "RUNNING", "COMPLETED", "FAILED", "SKIPPED", "STOPPED", "WAITING")
inputobject
outputobject, nullableThe tool's result once the node completes.
nextobject|array, nullable
attempt_countinteger
save_outputboolean
export_outputboolean
started_atstring (date-time), nullable
finished_atstring (date-time), nullable
batch_idstring, nullable
batch_totalinteger, nullable
batch_completedinteger
is_batch_processorboolean
progress_percentageinteger, nullableFor batch nodes only.
json
{
  "id": "0c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "workflow": "7d4c2b1a-0e9f-4a3b-8c7d-6e5f4a3b2c1d",
  "name": "Summarise",
  "node_id": "step2",
  "kind": "llm_prompt",
  "params": {
    "prompt": "Summarise these results in 5 bullets: {{_output.step1.results}}"
  },
  "status": "COMPLETED",
  "input": {},
  "output": {
    "response": "- Acme launched …"
  },
  "next": [
    "step3"
  ],
  "attempt_count": 1,
  "save_output": false,
  "export_output": false,
  "started_at": "2026-09-21T08:00:03Z",
  "finished_at": "2026-09-21T08:00:09Z",
  "batch_id": null,
  "batch_total": null,
  "batch_completed": 0,
  "is_batch_processor": false,
  "progress_percentage": null
}

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/<id>/nodes/<node_execution_id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/{id}/outputs/

Persistent outputs

Outputs of nodes flagged save_output, kept across runs. Filter by date and order by kind, status, started_at, finished_at.

Auth: Session token · In the app: Apps → outputs panel

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Query parameters

FieldTypeRequiredDescription
startstring (date)no
endstring (date)no
orderingstringnoDefault: "-started_at".

Response 200 — Outputs.

Array of:

FieldTypeDescription
idinteger
workflowstring
kindstring
paramsobject
outputobject, nullable
statusstring
started_atstring (date-time), nullable
finished_atstring (date-time), nullable

Response 400 — Bad date.

json
{
  "detail": "Authentication credentials were not provided."
}

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/<id>/outputs/?start=2026-09-01" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/stats/

Run statistics

Auth: Session token · In the app: Workflow AI header counters

Query parameters

FieldTypeRequiredDescription
breakdownbooleannoAdd a per-workflow list.

Response 200 — Totals.

FieldTypeDescription
total_successful_runsinteger
workflow_countinteger
workflowsobject[]
workflows[].idstring
workflows[].namestring
workflows[].successful_run_countinteger
json
{
  "total_successful_runs": 128,
  "workflow_count": 9
}

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/stats/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/{id}/history/

Run history (versions)

Every archived run, newest first. Each run is a snapshot of the spec plus node results.

Auth: Session token · In the app: Workflow AI → History

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Response 200 — Versions.

FieldTypeDescription
workflow_idstring
workflow_namestring
total_versionsinteger
versionsobject[]
versions[].versioninteger
versions[].version_labelstring
versions[].created_atstring (date-time)
versions[].statusstring

Response 503 — The run store is unavailable.

json
{
  "error": "path is required"
}

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/<id>/history/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/{id}/history/{version}/

One archived run

Auth: Session token · In the app: Workflow AI → History → open

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes
versionintegeryes

Response 200 — The run document.

FieldTypeDescription
_idstring
workflow_idstring
versioninteger
version_labelstring
workflow_namestring
workflow_descriptionstring
workflow_statusstring
user_idstring
usernamestring
json_specobjectThe workflow definition (json_spec). A directed graph of nodes; each node runs one catalogue tool (kind = the tool's name from GET /microservices/apis/) with its params. Execution starts at entry, follows next, and a node whose requires.wait_for names other nodes waits for them to finish first. Parameters may reference earlier outputs: - "{{_output.<node_id>.<field>}}" inside a string (interpolated), or - {"$ref": "_output.<node_id>.<field>"} as a whole value.
json_spec.namestring
json_spec.versionstring
json_spec.entrystring[]Node ids that start the run.
json_spec.nodesobject[]
json_spec.nodes[].idstringUnique within the workflow (the app uses step1, step2, …).
json_spec.nodes[].kindstringTool name from the catalogue.
json_spec.nodes[].namestringDisplay label (max 100 chars).
json_spec.nodes[].paramsobjectTool parameters, per the tool's parameters schema.
json_spec.nodes[].nextstring[]Node ids to run after this one.
json_spec.nodes[].requiresobject
json_spec.nodes[].requires.wait_forstring[]
json_spec.nodes[].save_outputbooleanKeep this node's output as a persistent Output (Apps → outputs).
json_spec.nodes[].export_outputbooleanInclude the output in exports.
json_spec.edgesobject[]Canvas edges (kept for the editor; execution follows next).
nodesobject[]
nodes[].idstring (uuid)Node execution id (distinct from the spec's node_id).
nodes[].workflowstring (uuid)
nodes[].namestring, nullable
nodes[].node_idstringThe node's id in the spec.
nodes[].kindstring
nodes[].paramsobject
nodes[].statusstring ("PENDING", "RUNNING", "COMPLETED", "FAILED", "SKIPPED", "STOPPED", "WAITING")
nodes[].inputobject
nodes[].outputobject, nullableThe tool's result once the node completes.
nodes[].nextobject|array, nullable
nodes[].attempt_countinteger
nodes[].save_outputboolean
nodes[].export_outputboolean
nodes[].started_atstring (date-time), nullable
nodes[].finished_atstring (date-time), nullable
nodes[].batch_idstring, nullable
nodes[].batch_totalinteger, nullable
nodes[].batch_completedinteger
nodes[].is_batch_processorboolean
nodes[].progress_percentageinteger, nullableFor batch nodes only.
created_atstring (date-time)
workflow_created_atstring, nullable
workflow_summarystring
workflow_vueflow_jsonobject

Response 400version is not an integer.

Response 404 — No such version.

json
{
  "error": "path is required"
}

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/<id>/history/13/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/{id}/history/latest/

The most recent archived run

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Response 200 — The run document (same shape as a version).

Response 404 — No runs yet.

json
{
  "error": "path is required"
}

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/<id>/history/latest/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/{id}/versions/

Definition snapshots

Snapshots taken before anything overwrote the definition (an assistant edit, an applied share update, a restore). Distinct from run history.

Auth: Session token · In the app: Workflow AI → Versions

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Response 200 — Snapshots, newest first.

Array of:

FieldTypeDescription
revisioninteger
sourcestring
source_labelstring
notestring
created_atstring (date-time)
node_countinteger
json
[
  {
    "revision": 6,
    "source": "agent",
    "source_label": "Assistant edit",
    "note": "Before applying assistant changes",
    "created_at": "2026-09-20T10:00:00Z",
    "node_count": 3
  }
]

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/<id>/versions/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflow/{id}/versions/{revision}/restore/

Restore a definition snapshot

Snapshots the current definition first, so a restore is itself undoable.

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes
revisionintegeryes

Response 200 — Restored.

FieldTypeDescription
statusstring ("restored")
workflow_idstring
restored_revisioninteger
content_revisioninteger

Example

bash
curl -X POST "https://api.example.com/microservices/workflow/<id>/versions/<revision>/restore/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflow/schedule/

Schedule a workflow

Owner only. Creates a periodic task that runs the workflow:

typeExtra fields
minutes / hours / daysevery (integer)
clockedclock_timeYYYY-MM-DD HH:MM:SS in the server's timezone; runs once
cronminute, hour, day_of_week, day_of_month, month_of_year (crontab fields, default *)

Auth: Session token · In the app: Workflow AI → Schedule

Request body (application/json)

FieldTypeRequiredDescription
workflow_idstring (uuid)yes
typestring ("minutes", "hours", "days", "clocked", "cron")yes
everyintegerno
clock_timestringno
minutestringnoDefault: "*".
hourstringnoDefault: "*".
day_of_weekstringnoDefault: "*".
day_of_monthstringnoDefault: "*".
month_of_yearstringnoDefault: "*".
json
{
  "workflow_id": "7d4c2b1a-0e9f-4a3b-8c7d-6e5f4a3b2c1d",
  "type": "cron",
  "minute": "0",
  "hour": "8",
  "day_of_week": "1"
}

Response 201 — Scheduled.

FieldTypeDescription
messagestring
json
{
  "message": "Workflow scheduled successfully"
}

Response 400 — Missing fields or invalid type.

json
{
  "error": "path is required"
}

Example

bash
curl -X POST "https://api.example.com/microservices/workflow/schedule/" \
  -H "Authorization: Token $FINBLADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"workflow_id":"7d4c2b1a-0e9f-4a3b-8c7d-6e5f4a3b2c1d","type":"cron","minute":"0","hour":"8","day_of_week":"1"}'

PATCH /microservices/workflow/schedule/

Enable or disable a schedule

Auth: Session token

Request body (application/json)

FieldTypeRequiredDescription
task_idintegeryes
enabledbooleanyes

Response 200 — Updated.

FieldTypeDescription
messagestring
json
{
  "message": "OK"
}

Response 403 — Not your schedule.

json
{
  "error": "path is required"
}

Response 404 — Unknown task.

json
{
  "error": "path is required"
}

Example

bash
curl -X PATCH "https://api.example.com/microservices/workflow/schedule/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

DELETE /microservices/workflow/schedule/

Delete a schedule

Auth: Session token

Request body (application/json)

FieldTypeRequiredDescription
task_idintegeryes

Response 200 — Deleted.

FieldTypeDescription
messagestring
json
{
  "message": "OK"
}

Response 403 — Not your schedule.

Response 404 — Unknown task.

Example

bash
curl -X DELETE "https://api.example.com/microservices/workflow/schedule/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/scheduled-tasks/

My schedules

Auth: Session token · In the app: Workflow AI → Schedules

Response 200 — Periodic tasks for workflows you own.

Array of:

FieldTypeDescription
idinteger
namestring
enabledboolean
last_run_atstring (date-time), nullable
total_run_countinteger
argsany[][workflow_id, user_context].
intervalinteger, nullable
crontabinteger, nullable
clockedinteger, nullable
one_offboolean
start_timestring (date-time), nullable
expiresstring (date-time), nullable

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/scheduled-tasks/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow-tags/

My tags

Auth: Session token · In the app: Workflow AI → tag filter

Response 200 — Tags.

Array of:

FieldTypeDescription
idstring (uuid)
namestring
colorstring, nullable
created_atstring (date-time)
updated_atstring (date-time)

Example

bash
curl -X GET "https://api.example.com/microservices/workflow-tags/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflow-tags/

Create a tag

Auth: Session token

Request body (application/json)

FieldTypeRequiredDescription
namestringyes
colorstringnoHex colour.
json
{
  "name": "finance",
  "color": "#12bcc2"
}

Response 201 — Created.

FieldTypeDescription
idstring (uuid)
namestring
colorstring, nullable
created_atstring (date-time)
updated_atstring (date-time)
json
{
  "id": "3a2b1c0d-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
  "name": "finance",
  "color": "#12bcc2",
  "created_at": "2026-05-01T08:00:00Z",
  "updated_at": "2026-05-01T08:00:00Z"
}

Response 400 — Duplicate name or validation error.

json
{
  "name": [
    "A tag with this name already exists."
  ]
}

Example

bash
curl -X POST "https://api.example.com/microservices/workflow-tags/" \
  -H "Authorization: Token $FINBLADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"finance","color":"#12bcc2"}'

PUT /microservices/workflow-tags/{tag_id}/

Rename or recolour a tag

Auth: Session token

Path parameters

FieldTypeRequiredDescription
tag_idstring (uuid)yes

Request body (application/json)

FieldTypeRequiredDescription
namestringyes
colorstringno

Response 200 — Updated.

FieldTypeDescription
idstring (uuid)
namestring
colorstring, nullable
created_atstring (date-time)
updated_atstring (date-time)
json
{
  "id": "3a2b1c0d-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
  "name": "finance",
  "color": "#12bcc2",
  "created_at": "2026-05-01T08:00:00Z",
  "updated_at": "2026-05-01T08:00:00Z"
}

Response 404 — Not your tag.

json
{
  "error": "path is required"
}

Example

bash
curl -X PUT "https://api.example.com/microservices/workflow-tags/<tag_id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

DELETE /microservices/workflow-tags/{tag_id}/

Delete a tag

Auth: Session token

Path parameters

FieldTypeRequiredDescription
tag_idstring (uuid)yes

Response 204 — Deleted (detached from every workflow).

Response 404 — Not your tag.

Example

bash
curl -X DELETE "https://api.example.com/microservices/workflow-tags/<tag_id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflows/{id}/tags/

Tags on a workflow

Tags are personal — you only see your own tags on a workflow, even a shared one.

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Response 200 — Tags.

Array of:

FieldTypeDescription
idstring (uuid)
namestring
colorstring, nullable
created_atstring (date-time)
updated_atstring (date-time)

Example

bash
curl -X GET "https://api.example.com/microservices/workflows/<id>/tags/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflows/{id}/tags/attach/

Attach tags to a workflow

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Request body (application/json)

FieldTypeRequiredDescription
tag_idsstring (uuid)[]yes

Response 200 — Newly attached tags (already-attached ones are omitted).

FieldTypeDescription
attachedobject[]
attached[].idstring (uuid)
attached[].namestring
attached[].colorstring, nullable
attached[].created_atstring (date-time)
attached[].updated_atstring (date-time)
errorsstring[]

Example

bash
curl -X POST "https://api.example.com/microservices/workflows/<id>/tags/attach/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

DELETE /microservices/workflows/{id}/tags/{tag_id}/

Detach a tag from a workflow

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes
tag_idstring (uuid)yes

Response 204 — Detached.

Response 404 — Tag not attached / not yours.

json
{
  "error": "path is required"
}

Example

bash
curl -X DELETE "https://api.example.com/microservices/workflows/<id>/tags/<tag_id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow/{id}/collaborators/

Collaborators on a workflow

People who edit or view the same workflow (as opposed to receiving a copy). Anyone with view access may read the list.

Auth: Session token · In the app: Workflow AI → Share → Collaborators

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Response 200 — Collaborators.

Array of:

FieldTypeDescription
userobject
user.idinteger
user.usernamestring
user.emailstring
rolestring ("editor", "viewer")
role_labelstring
created_atstring (date-time)

Example

bash
curl -X GET "https://api.example.com/microservices/workflow/<id>/collaborators/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflow/{id}/collaborators/

Add or update collaborators

Owner only. Editors get write access to the workflow's extracted tables and the files it references are shared with them where possible; files_not_shared lists what could not be shared.

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes

Request body (application/json)

FieldTypeRequiredDescription
usersobject[]yes
users[].user_idintegerno
users[].emailstringno
users[].usernamestringno
users[].rolestring ("editor", "viewer")noDefault: "editor".
json
{
  "users": [
    {
      "email": "omar@acme.com",
      "role": "editor"
    },
    {
      "username": "sara",
      "role": "viewer"
    }
  ]
}

Response 200 — Result per user.

FieldTypeDescription
workflow_idstring
collaboratorsany[]

Response 400 — Bad users, unknown user, owner in the list, or bad role.

json
{
  "error": "path is required"
}

Example

bash
curl -X POST "https://api.example.com/microservices/workflow/<id>/collaborators/" \
  -H "Authorization: Token $FINBLADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"users":[{"email":"omar@acme.com","role":"editor"},{"username":"sara","role":"viewer"}]}'

PATCH /microservices/workflow/{id}/collaborators/{user_id}/

Change a collaborator's role

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes
user_idintegeryes

Request body (application/json)

FieldTypeRequiredDescription
rolestring ("editor", "viewer")yes

Response 200 — Updated seat.

FieldTypeDescription
userobject
user.idinteger
user.usernamestring
user.emailstring
rolestring ("editor", "viewer")
role_labelstring
created_atstring (date-time)
json
{
  "user": {
    "id": 57,
    "username": "omar",
    "email": "omar@acme.com"
  },
  "role": "editor",
  "role_label": "Editor",
  "created_at": "2026-09-10T10:00:00Z"
}

Example

bash
curl -X PATCH "https://api.example.com/microservices/workflow/<id>/collaborators/<user_id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

DELETE /microservices/workflow/{id}/collaborators/{user_id}/

Remove a collaborator

Owner only — except that a collaborator may remove themselves.

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idstring (uuid)yes
user_idintegeryes

Response 200 — Removed.

FieldTypeDescription
statusstring ("removed")
user_idinteger

Example

bash
curl -X DELETE "https://api.example.com/microservices/workflow/<id>/collaborators/<user_id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflows/copy-to-user/

Share a copy with users

Owner only. Gives each user their own copy of the workflow (optionally restricted to running it from Apps). mode decides how the workflow's extracted tables travel: share grants access to the same tables, clone duplicates them. Later changes can be pushed with workflows/sync/.

Auth: Session token · In the app: Workflow AI → Share → Send a copy

Request body (application/json)

FieldTypeRequiredDescription
workflow_idstring (uuid)yes
usersobject[]yes
users[].user_idintegerno
users[].emailstringno
users[].usernamestringno
users[].only_view_in_appsbooleannoDefault: false.
modestring ("share", "clone")yes
include_outputsbooleannoDefault: false.
json
{
  "workflow_id": "7d4c2b1a-0e9f-4a3b-8c7d-6e5f4a3b2c1d",
  "users": [
    {
      "email": "omar@acme.com",
      "only_view_in_apps": true
    }
  ],
  "mode": "share"
}

Response 201 — Copies created.

FieldTypeDescription
source_workflow_idstring
resultsobject[]
results[].target_userobject
results[].only_view_in_appsboolean
results[].copied_workflow_idstring
results[].nodes_copiedinteger
results[].outputs_copiedinteger
results[].statusstring
results[].files_not_sharedstring[]
results[].files_not_shared_reasonstring

Response 400 — Missing fields or invalid mode.

json
{
  "error": "path is required"
}

Example

bash
curl -X POST "https://api.example.com/microservices/workflows/copy-to-user/" \
  -H "Authorization: Token $FINBLADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"workflow_id":"7d4c2b1a-0e9f-4a3b-8c7d-6e5f4a3b2c1d","users":[{"email":"omar@acme.com","only_view_in_apps":true}],"mode":"share"}'

POST /microservices/workflows/remove-users/

Withdraw shared copies

Auth: Session token · In the app: Workflow AI → Share → Remove

Request body (application/json)

FieldTypeRequiredDescription
workflow_idstring (uuid)yes
usersobject[]yes
users[].user_idintegerno
users[].emailstringno
users[].usernamestringno

Response 200 — Result per user.

FieldTypeDescription
source_workflow_idstring
resultsobject[]
results[].target_userobject
results[].removedboolean
results[].messagestring

Example

bash
curl -X POST "https://api.example.com/microservices/workflows/remove-users/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflows/sync/

Push my changes to everyone I shared with

App-only recipients get the new definition immediately; recipients with editable copies get a pending share update they can apply or decline.

Auth: Session token · In the app: Workflow AI → Share → Sync

Request body (application/json)

FieldTypeRequiredDescription
workflow_idstring (uuid)yes

Response 200 — Delivery summary.

FieldTypeDescription
source_workflow_idstring
synced_countinteger
copy_workflow_idsstring[]
pending_countinteger
pendingobject[]

Example

bash
curl -X POST "https://api.example.com/microservices/workflows/sync/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflows/duplicate/

Duplicate a workflow

Auth: Session token · In the app: Workflow AI → Duplicate

Request body (application/json)

FieldTypeRequiredDescription
workflow_idstring (uuid)yes

Response 201 — Copy created.

FieldTypeDescription
source_workflow_idstring
copied_workflow_idstring
nodes_copiedinteger
statusstring ("duplicated")

Example

bash
curl -X POST "https://api.example.com/microservices/workflows/duplicate/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow-share-updates/

Share updates waiting for me

Definitions pushed by the people who shared workflows with you, not yet applied or declined.

Auth: Session token · In the app: Banner on a shared workflow

Query parameters

FieldTypeRequiredDescription
workflow_idstring (uuid)noOnly updates for this copy.

Response 200 — Updates.

Array of:

FieldTypeDescription
idstring
statusstring
created_atstring (date-time)
workflowobject
workflow.idstring
workflow.namestring
sharerobject
sharer.idinteger
sharer.usernamestring
node_countinteger

Example

bash
curl -X GET "https://api.example.com/microservices/workflow-share-updates/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/workflow-share-updates/{update_id}/

A pushed definition (for review)

Auth: Session token

Path parameters

FieldTypeRequiredDescription
update_idstring (uuid)yes

Response 200 — The pushed definition next to your current one.

FieldTypeDescription
idstring
statusstring
created_atstring (date-time)
workflowobject
sharerobject
node_countinteger
json_specobject
vueflow_jsonobject
current_json_specobject

Example

bash
curl -X GET "https://api.example.com/microservices/workflow-share-updates/<update_id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflow-share-updates/{update_id}/apply/

Accept a share update

Snapshots your current definition first (recoverable from versions/).

Auth: Session token

Path parameters

FieldTypeRequiredDescription
update_idstring (uuid)yes

Response 200 — Applied.

FieldTypeDescription
statusstring ("applied")
workflow_idstring
content_revisioninteger

Response 400 — Already resolved.

json
{
  "error": "path is required"
}

Example

bash
curl -X POST "https://api.example.com/microservices/workflow-share-updates/<update_id>/apply/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/workflow-share-updates/{update_id}/decline/

Decline a share update

Auth: Session token

Path parameters

FieldTypeRequiredDescription
update_idstring (uuid)yes

Response 200 — Declined.

FieldTypeDescription
statusstring ("declined")
idstring

Example

bash
curl -X POST "https://api.example.com/microservices/workflow-share-updates/<update_id>/decline/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/documents/

Files uploaded for workflows

Files attached to nodes through the canvas file picker (separate from My Data).

Auth: Session token · In the app: Canvas → file upload field

Response 200 — Files.

Array of:

FieldTypeDescription
uidstring (uuid)
filestringMedia URL.
file_pathstringMedia path.
uploaded_atstring (date-time)

Example

bash
curl -X GET "https://api.example.com/microservices/documents/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/documents/

Upload a file for a workflow node

Auth: Session token

Request body (multipart/form-data)

FieldTypeRequiredDescription
filestring (binary)yes

Response 201 — Stored.

FieldTypeDescription
uidstring
filestring
file_pathstring
uploaded_atstring (date-time)

Example

bash
curl -X POST "https://api.example.com/microservices/documents/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

DELETE /microservices/documents/

Delete a workflow file

Auth: Session token

Request body (application/json)

FieldTypeRequiredDescription
uidstring (uuid)yes

Response 200 — Deleted.

FieldTypeDescription
messagestring
json
{
  "message": "OK"
}

Response 404 — Not your file.

json
{
  "error": "path is required"
}

Example

bash
curl -X DELETE "https://api.example.com/microservices/documents/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/apis/

Tool catalogue

Every tool you can put on a canvas: platform tools, your own, and tools shared with you. Filter with search, ids and is_tool.

Auth: Session token · In the app: Canvas → node palette

Query parameters

FieldTypeRequiredDescription
searchstringno
idsstringnoComma-separated ids.
is_toolbooleanno
orderingstringnoDefault: "-created_at".

Response 200 — Tools.

Array of:

FieldTypeDescription
idinteger
namestringStable key; used as kind in workflow specs.
name_arstring, nullable
methodstring ("GET", "POST", "PUT", "DELETE")
endpointstringPath on the service, e.g. /search.
urlstringBase URL of the service (user tools).
portinteger, nullable
descriptionstring
description_arstring, nullable
parametersobjectParameter schema shown in the node panel (field name → type/label/default/validation).
test_parametersobject
headersobject
query_paramsobject
response_exampleobject
agent_specobject, nullableDescription of the tool for the assistant.
developed_bystring ("Developer", "User")Developer tools are visible to everyone; User tools to their owner and shares.
ownerinteger, nullable
owner_usernamestringOmitted entirely when the tool has no owner.
service_typestringDeployment fields, for tools the operator runs in-cluster; empty on hosted tools.
network_namestring
requires_gpuboolean
runningbooleanLast known state of the tool container.
dirstringWorking directory of the service.
start_commandstring
env_examplestringSample environment file for running the service.
is_toolbooleanUsable by the assistant as a tool.
is_long_runningboolean
media_accessboolean
model_capabilitystring ("none", "chat", "vision", "image_gen", "embed")
categoryinteger, nullable
category_detailsobject
category_details.idinteger
category_details.namestring
category_details.titlestring
category_details.title_arstring, nullable
category_details.colorstring
category_details.iconstringSVG markup.
category_details.descriptionstring
category_details.description_arstring, nullable
category_details.is_activeboolean
category_details.apis_countinteger
category_details.created_atstring (date-time)
category_details.updated_atstring (date-time)
compatible_apis_detailsobject[]
compatible_apis_countinteger
sharedobject{"users": [{"id": 12, "username": "omar"}]}
timeout_secondsinteger
max_retriesinteger
retry_delay_secondsinteger
created_atstring (date-time)
updated_atstring (date-time)

Example

bash
curl -X GET "https://api.example.com/microservices/apis/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/apis/light/

Tool catalogue (names only)

Auth: Session token

Query parameters

FieldTypeRequiredDescription
idsstringno
is_toolbooleanno
orderingstringno

Response 200 — Tools.

Array of:

FieldTypeDescription
idinteger
namestring
name_arstring, nullable
descriptionstring
description_arstring, nullable
categoryobject, nullable

Example

bash
curl -X GET "https://api.example.com/microservices/apis/light/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/apis/create/

Register a custom tool

Adds your own HTTP service to the catalogue (developed_by: User). Share it with colleagues through shared.users.

Auth: Session token

Request body (application/json)

FieldTypeRequiredDescription
idintegerno
namestringnoStable key; used as kind in workflow specs.
name_arstring, nullableno
methodstring ("GET", "POST", "PUT", "DELETE")no
endpointstringnoPath on the service, e.g. /search.
urlstringnoBase URL of the service (user tools).
portinteger, nullableno
descriptionstringno
description_arstring, nullableno
parametersobjectnoParameter schema shown in the node panel (field name → type/label/default/validation).
test_parametersobjectno
headersobjectno
query_paramsobjectno
response_exampleobjectno
agent_specobject, nullablenoDescription of the tool for the assistant.
developed_bystring ("Developer", "User")noDeveloper tools are visible to everyone; User tools to their owner and shares.
ownerinteger, nullableno
owner_usernamestringnoOmitted entirely when the tool has no owner.
service_typestringnoDeployment fields, for tools the operator runs in-cluster; empty on hosted tools.
network_namestringno
requires_gpubooleanno
runningbooleannoLast known state of the tool container.
dirstringnoWorking directory of the service.
start_commandstringno
env_examplestringnoSample environment file for running the service.
is_toolbooleannoUsable by the assistant as a tool.
is_long_runningbooleanno
media_accessbooleanno
model_capabilitystring ("none", "chat", "vision", "image_gen", "embed")no
categoryinteger, nullableno
category_detailsobjectno
category_details.idintegerno
category_details.namestringno
category_details.titlestringno
category_details.title_arstring, nullableno
category_details.colorstringno
category_details.iconstringnoSVG markup.
category_details.descriptionstringno
category_details.description_arstring, nullableno
category_details.is_activebooleanno
category_details.apis_countintegerno
category_details.created_atstring (date-time)no
category_details.updated_atstring (date-time)no
compatible_apis_detailsobject[]no
compatible_apis_countintegerno
sharedobjectno{"users": [{"id": 12, "username": "omar"}]}
timeout_secondsintegerno
max_retriesintegerno
retry_delay_secondsintegerno
created_atstring (date-time)no
updated_atstring (date-time)no
json
{
  "name": "crm_lookup",
  "method": "POST",
  "endpoint": "/lookup",
  "url": "https://tools.acme.internal",
  "port": 8080,
  "description": "Look up a customer in the CRM.",
  "parameters": {
    "customer_id": {
      "type": "text",
      "label": "Customer id",
      "required": true
    }
  },
  "developed_by": "User",
  "timeout_seconds": 30
}

Response 201 — Registered.

FieldTypeDescription
idinteger
namestringStable key; used as kind in workflow specs.
name_arstring, nullable
methodstring ("GET", "POST", "PUT", "DELETE")
endpointstringPath on the service, e.g. /search.
urlstringBase URL of the service (user tools).
portinteger, nullable
descriptionstring
description_arstring, nullable
parametersobjectParameter schema shown in the node panel (field name → type/label/default/validation).
test_parametersobject
headersobject
query_paramsobject
response_exampleobject
agent_specobject, nullableDescription of the tool for the assistant.
developed_bystring ("Developer", "User")Developer tools are visible to everyone; User tools to their owner and shares.
ownerinteger, nullable
owner_usernamestringOmitted entirely when the tool has no owner.
service_typestringDeployment fields, for tools the operator runs in-cluster; empty on hosted tools.
network_namestring
requires_gpuboolean
runningbooleanLast known state of the tool container.
dirstringWorking directory of the service.
start_commandstring
env_examplestringSample environment file for running the service.
is_toolbooleanUsable by the assistant as a tool.
is_long_runningboolean
media_accessboolean
model_capabilitystring ("none", "chat", "vision", "image_gen", "embed")
categoryinteger, nullable
category_detailsobject
category_details.idinteger
category_details.namestring
category_details.titlestring
category_details.title_arstring, nullable
category_details.colorstring
category_details.iconstringSVG markup.
category_details.descriptionstring
category_details.description_arstring, nullable
category_details.is_activeboolean
category_details.apis_countinteger
category_details.created_atstring (date-time)
category_details.updated_atstring (date-time)
compatible_apis_detailsobject[]
compatible_apis_countinteger
sharedobject{"users": [{"id": 12, "username": "omar"}]}
timeout_secondsinteger
max_retriesinteger
retry_delay_secondsinteger
created_atstring (date-time)
updated_atstring (date-time)
json
{
  "id": 18,
  "name": "web_search",
  "name_ar": "بحث الويب",
  "method": "POST",
  "endpoint": "/search",
  "description": "Search the web and return the top results.",
  "parameters": {
    "query": {
      "type": "text",
      "label": "Query",
      "required": true
    },
    "max_results": {
      "type": "number",
      "default": 10
    }
  },
  "developed_by": "Developer",
  "owner": null,
  "owner_username": "",
  "is_tool": true,
  "is_long_running": false,
  "media_access": false,
  "model_capability": "none",
  "category": 3,
  "category_details": {
    "id": 3,
    "name": "research",
    "title": "Research",
    "color": "#0e6d92"
  },
  "compatible_apis_count": 4,
  "timeout_seconds": 60,
  "max_retries": 3,
  "retry_delay_seconds": 10,
  "created_at": "2026-01-10T08:00:00Z",
  "updated_at": "2026-08-01T08:00:00Z"
}

Response 400 — Validation errors.

json
{
  "username": [
    "A user with that username already exists."
  ]
}

Example

bash
curl -X POST "https://api.example.com/microservices/apis/create/" \
  -H "Authorization: Token $FINBLADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"crm_lookup","method":"POST","endpoint":"/lookup","url":"https://tools.acme.internal","port":8080,"description":"Look up a customer in the CRM.","parameters":{"customer_id":{"type":"text","label":"Customer id","required":true}},"developed_by":"User","timeout_seconds":30}'

GET /microservices/apis/{id}/

Get a tool

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idintegeryes

Response 200 — The tool.

FieldTypeDescription
idinteger
namestringStable key; used as kind in workflow specs.
name_arstring, nullable
methodstring ("GET", "POST", "PUT", "DELETE")
endpointstringPath on the service, e.g. /search.
urlstringBase URL of the service (user tools).
portinteger, nullable
descriptionstring
description_arstring, nullable
parametersobjectParameter schema shown in the node panel (field name → type/label/default/validation).
test_parametersobject
headersobject
query_paramsobject
response_exampleobject
agent_specobject, nullableDescription of the tool for the assistant.
developed_bystring ("Developer", "User")Developer tools are visible to everyone; User tools to their owner and shares.
ownerinteger, nullable
owner_usernamestringOmitted entirely when the tool has no owner.
service_typestringDeployment fields, for tools the operator runs in-cluster; empty on hosted tools.
network_namestring
requires_gpuboolean
runningbooleanLast known state of the tool container.
dirstringWorking directory of the service.
start_commandstring
env_examplestringSample environment file for running the service.
is_toolbooleanUsable by the assistant as a tool.
is_long_runningboolean
media_accessboolean
model_capabilitystring ("none", "chat", "vision", "image_gen", "embed")
categoryinteger, nullable
category_detailsobject
category_details.idinteger
category_details.namestring
category_details.titlestring
category_details.title_arstring, nullable
category_details.colorstring
category_details.iconstringSVG markup.
category_details.descriptionstring
category_details.description_arstring, nullable
category_details.is_activeboolean
category_details.apis_countinteger
category_details.created_atstring (date-time)
category_details.updated_atstring (date-time)
compatible_apis_detailsobject[]
compatible_apis_countinteger
sharedobject{"users": [{"id": 12, "username": "omar"}]}
timeout_secondsinteger
max_retriesinteger
retry_delay_secondsinteger
created_atstring (date-time)
updated_atstring (date-time)
json
{
  "id": 18,
  "name": "web_search",
  "name_ar": "بحث الويب",
  "method": "POST",
  "endpoint": "/search",
  "description": "Search the web and return the top results.",
  "parameters": {
    "query": {
      "type": "text",
      "label": "Query",
      "required": true
    },
    "max_results": {
      "type": "number",
      "default": 10
    }
  },
  "developed_by": "Developer",
  "owner": null,
  "owner_username": "",
  "is_tool": true,
  "is_long_running": false,
  "media_access": false,
  "model_capability": "none",
  "category": 3,
  "category_details": {
    "id": 3,
    "name": "research",
    "title": "Research",
    "color": "#0e6d92"
  },
  "compatible_apis_count": 4,
  "timeout_seconds": 60,
  "max_retries": 3,
  "retry_delay_seconds": 10,
  "created_at": "2026-01-10T08:00:00Z",
  "updated_at": "2026-08-01T08:00:00Z"
}

Response 404 — Not accessible.

json
{
  "error": "path is required"
}

Example

bash
curl -X GET "https://api.example.com/microservices/apis/<id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

PUT /microservices/apis/{id}/

Update a tool (owner)

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idintegeryes

Request body (application/json)

FieldTypeRequiredDescription
idintegerno
namestringnoStable key; used as kind in workflow specs.
name_arstring, nullableno
methodstring ("GET", "POST", "PUT", "DELETE")no
endpointstringnoPath on the service, e.g. /search.
urlstringnoBase URL of the service (user tools).
portinteger, nullableno
descriptionstringno
description_arstring, nullableno
parametersobjectnoParameter schema shown in the node panel (field name → type/label/default/validation).
test_parametersobjectno
headersobjectno
query_paramsobjectno
response_exampleobjectno
agent_specobject, nullablenoDescription of the tool for the assistant.
developed_bystring ("Developer", "User")noDeveloper tools are visible to everyone; User tools to their owner and shares.
ownerinteger, nullableno
owner_usernamestringnoOmitted entirely when the tool has no owner.
service_typestringnoDeployment fields, for tools the operator runs in-cluster; empty on hosted tools.
network_namestringno
requires_gpubooleanno
runningbooleannoLast known state of the tool container.
dirstringnoWorking directory of the service.
start_commandstringno
env_examplestringnoSample environment file for running the service.
is_toolbooleannoUsable by the assistant as a tool.
is_long_runningbooleanno
media_accessbooleanno
model_capabilitystring ("none", "chat", "vision", "image_gen", "embed")no
categoryinteger, nullableno
category_detailsobjectno
category_details.idintegerno
category_details.namestringno
category_details.titlestringno
category_details.title_arstring, nullableno
category_details.colorstringno
category_details.iconstringnoSVG markup.
category_details.descriptionstringno
category_details.description_arstring, nullableno
category_details.is_activebooleanno
category_details.apis_countintegerno
category_details.created_atstring (date-time)no
category_details.updated_atstring (date-time)no
compatible_apis_detailsobject[]no
compatible_apis_countintegerno
sharedobjectno{"users": [{"id": 12, "username": "omar"}]}
timeout_secondsintegerno
max_retriesintegerno
retry_delay_secondsintegerno
created_atstring (date-time)no
updated_atstring (date-time)no
json
{
  "id": 18,
  "name": "web_search",
  "name_ar": "بحث الويب",
  "method": "POST",
  "endpoint": "/search",
  "description": "Search the web and return the top results.",
  "parameters": {
    "query": {
      "type": "text",
      "label": "Query",
      "required": true
    },
    "max_results": {
      "type": "number",
      "default": 10
    }
  },
  "developed_by": "Developer",
  "owner": null,
  "owner_username": "",
  "is_tool": true,
  "is_long_running": false,
  "media_access": false,
  "model_capability": "none",
  "category": 3,
  "category_details": {
    "id": 3,
    "name": "research",
    "title": "Research",
    "color": "#0e6d92"
  },
  "compatible_apis_count": 4,
  "timeout_seconds": 60,
  "max_retries": 3,
  "retry_delay_seconds": 10,
  "created_at": "2026-01-10T08:00:00Z",
  "updated_at": "2026-08-01T08:00:00Z"
}

Response 200 — Updated.

FieldTypeDescription
idinteger
namestringStable key; used as kind in workflow specs.
name_arstring, nullable
methodstring ("GET", "POST", "PUT", "DELETE")
endpointstringPath on the service, e.g. /search.
urlstringBase URL of the service (user tools).
portinteger, nullable
descriptionstring
description_arstring, nullable
parametersobjectParameter schema shown in the node panel (field name → type/label/default/validation).
test_parametersobject
headersobject
query_paramsobject
response_exampleobject
agent_specobject, nullableDescription of the tool for the assistant.
developed_bystring ("Developer", "User")Developer tools are visible to everyone; User tools to their owner and shares.
ownerinteger, nullable
owner_usernamestringOmitted entirely when the tool has no owner.
service_typestringDeployment fields, for tools the operator runs in-cluster; empty on hosted tools.
network_namestring
requires_gpuboolean
runningbooleanLast known state of the tool container.
dirstringWorking directory of the service.
start_commandstring
env_examplestringSample environment file for running the service.
is_toolbooleanUsable by the assistant as a tool.
is_long_runningboolean
media_accessboolean
model_capabilitystring ("none", "chat", "vision", "image_gen", "embed")
categoryinteger, nullable
category_detailsobject
category_details.idinteger
category_details.namestring
category_details.titlestring
category_details.title_arstring, nullable
category_details.colorstring
category_details.iconstringSVG markup.
category_details.descriptionstring
category_details.description_arstring, nullable
category_details.is_activeboolean
category_details.apis_countinteger
category_details.created_atstring (date-time)
category_details.updated_atstring (date-time)
compatible_apis_detailsobject[]
compatible_apis_countinteger
sharedobject{"users": [{"id": 12, "username": "omar"}]}
timeout_secondsinteger
max_retriesinteger
retry_delay_secondsinteger
created_atstring (date-time)
updated_atstring (date-time)
json
{
  "id": 18,
  "name": "web_search",
  "name_ar": "بحث الويب",
  "method": "POST",
  "endpoint": "/search",
  "description": "Search the web and return the top results.",
  "parameters": {
    "query": {
      "type": "text",
      "label": "Query",
      "required": true
    },
    "max_results": {
      "type": "number",
      "default": 10
    }
  },
  "developed_by": "Developer",
  "owner": null,
  "owner_username": "",
  "is_tool": true,
  "is_long_running": false,
  "media_access": false,
  "model_capability": "none",
  "category": 3,
  "category_details": {
    "id": 3,
    "name": "research",
    "title": "Research",
    "color": "#0e6d92"
  },
  "compatible_apis_count": 4,
  "timeout_seconds": 60,
  "max_retries": 3,
  "retry_delay_seconds": 10,
  "created_at": "2026-01-10T08:00:00Z",
  "updated_at": "2026-08-01T08:00:00Z"
}

Response 403 — Not the owner.

json
{
  "error": "path is required"
}

Example

bash
curl -X PUT "https://api.example.com/microservices/apis/<id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"id":18,"name":"web_search","name_ar":"بحث الويب","method":"POST","endpoint":"/search","description":"Search the web and return the top results.","parameters":{"query":{"type":"text","label":"Query","required":true},"max_results":{"type":"number","default":10}},"developed_by":"Developer","owner":null,"owner_username":"","is_tool":true,"is_long_running":false,"media_access":false,"model_capability":"none","category":3,"category_details":{"id":3,"name":"research","title":"Research","color":"#0e6d92"},"compatible_apis_count":4,"timeout_seconds":60,"max_retries":3,"retry_delay_seconds":10,"created_at":"2026-01-10T08:00:00Z","updated_at":"2026-08-01T08:00:00Z"}'

DELETE /microservices/apis/{id}/

Delete a tool (owner)

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idintegeryes

Response 200 — Deleted.

FieldTypeDescription
messagestring
json
{
  "message": "OK"
}

Response 403 — Not the owner.

Example

bash
curl -X DELETE "https://api.example.com/microservices/apis/<id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/apis/{id}/test/

Call a tool directly

Sends the tool's test_parameters (or the body you provide) to the service and returns its raw response — the "Test" button in the tool editor.

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idintegeryes

Request body (application/json, optional)

Response 200 — The service's response body (JSON or text), always returned with status 200.

Response 500 — The service could not be reached.

Example

bash
curl -X POST "https://api.example.com/microservices/apis/<id>/test/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/categories/

Tool categories

Auth: Session token · In the app: Canvas → node palette groups

Response 200 — Active categories with the number of tools you can access in each.

Array of:

FieldTypeDescription
idinteger
namestring
titlestring
title_arstring, nullable
colorstring
iconstringSVG markup.
descriptionstring
description_arstring, nullable
is_activeboolean
apis_countinteger
created_atstring (date-time)
updated_atstring (date-time)

Example

bash
curl -X GET "https://api.example.com/microservices/categories/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

POST /microservices/categories/

Create a category

Auth: Session token

Request body (application/json)

FieldTypeRequiredDescription
idintegerno
namestringno
titlestringno
title_arstring, nullableno
colorstringno
iconstringnoSVG markup.
descriptionstringno
description_arstring, nullableno
is_activebooleanno
apis_countintegerno
created_atstring (date-time)no
updated_atstring (date-time)no

Response 201 — Created.

FieldTypeDescription
idinteger
namestring
titlestring
title_arstring, nullable
colorstring
iconstringSVG markup.
descriptionstring
description_arstring, nullable
is_activeboolean
apis_countinteger
created_atstring (date-time)
updated_atstring (date-time)

Example

bash
curl -X POST "https://api.example.com/microservices/categories/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

GET /microservices/categories/{id}/

Get a category

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idintegeryes

Response 200 — The category.

FieldTypeDescription
idinteger
namestring
titlestring
title_arstring, nullable
colorstring
iconstringSVG markup.
descriptionstring
description_arstring, nullable
is_activeboolean
apis_countinteger
created_atstring (date-time)
updated_atstring (date-time)

Example

bash
curl -X GET "https://api.example.com/microservices/categories/<id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

PUT /microservices/categories/{id}/

Update a category

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idintegeryes

Request body (application/json)

FieldTypeRequiredDescription
idintegerno
namestringno
titlestringno
title_arstring, nullableno
colorstringno
iconstringnoSVG markup.
descriptionstringno
description_arstring, nullableno
is_activebooleanno
apis_countintegerno
created_atstring (date-time)no
updated_atstring (date-time)no

Response 200 — Updated.

FieldTypeDescription
idinteger
namestring
titlestring
title_arstring, nullable
colorstring
iconstringSVG markup.
descriptionstring
description_arstring, nullable
is_activeboolean
apis_countinteger
created_atstring (date-time)
updated_atstring (date-time)

Example

bash
curl -X PUT "https://api.example.com/microservices/categories/<id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

DELETE /microservices/categories/{id}/

Deactivate a category

Auth: Session token

Path parameters

FieldTypeRequiredDescription
idintegeryes

Response 200 — Marked inactive.

FieldTypeDescription
messagestring
json
{
  "message": "OK"
}

Example

bash
curl -X DELETE "https://api.example.com/microservices/categories/<id>/" \
  -H "Authorization: Token $FINBLADE_TOKEN"

Finblade documentation