Endpoint Tiers
Not all endpoints are required. Here they are organized by priority:Tier 1: Minimum Viable Backend
These 5 endpoints are the bare minimum to get FlowDrop working:Tier 2: Full Editor Experience
These endpoints enable the complete sidebar, categories, and port validation:Tier 3: Advanced Features
These enable playground, execution, and interrupts:The OpenAPI spec is the authoritative contract. The Tier 1–2 shapes are
documented in full below, the Tier 3 shapes under Advanced endpoint
formats. For the exhaustive schema, see the
OpenAPI specification.
Base URL Configuration
All paths above are relative to a base URL you configure:Request & Response Formats
GET /health
FlowDrop calls this to verify the backend is reachable.
Response:
GET /nodes
Returns all available node types. FlowDrop uses this to populate the sidebar.
Query parameters:
category(optional) — filter by categorysearch(optional) — search name/descriptionlimit(optional, default: 100)offset(optional, default: 0)
NodeMetadata:
id(required) — unique identifiername(required) — display nametype— node visual type:workflowNode,simple,square,tool,gateway,terminal,idea,notecategory— sidebar group:inputs,outputs,models,processing,logic,tools, etc.icon— Iconify icon ID (e.g.,mdi:text-box-outline)inputs/outputs— port definitions withid,name,type,dataTypeconfigSchema— JSON Schema defining the configuration form
POST /workflows
Creates a new workflow. FlowDrop sends the full workflow JSON.
Request body:
PUT /workflows/:id
Updates an existing workflow. Same request body format as POST.
GET /workflows/:id
Returns a single workflow by ID. Same response format as POST response.
GET /categories
Returns category definitions for the node sidebar.
Response:
GET /port-config
Returns data type definitions and compatibility rules for port connections.
Response:
Advanced endpoint formats (Tier 3)
These power execution, the interactive playground, and human-in-the-loop interrupts. They use the same{ "success": true, "data": ... } envelope as
Tier 1–2 unless noted.
POST /workflows/:id/execute
Starts a run. The body is optional.
Request:
202 Accepted):
GET /executions/:id
Poll for execution status using the execution_id returned above.
This endpoint returns the status object directly — no
success/data
envelope. It is the one exception to the response wrapper.status is one of pending, running, completed, failed, cancelled,
paused, interrupted. The playground’s isTerminalStatus and
shouldStopPolling callbacks key off these values.
POST /workflows/:id/playground/sessions
Create an isolated test session for a workflow. The body is optional.
Request:
201):
status is one of idle, running, awaiting_input, completed, failed.
POST /playground/sessions/:sid/messages
Send a user message — this triggers a run. The message is created with status
pending and processed asynchronously; poll the messages endpoint to track it.
Request:
200):
409 if the previous message in the session is still processing —
messages are handled in sequence.
GET /playground/sessions/:sid/messages
Poll for new messages. Supports since, latest, and before query parameters
for pagination.
Response:
role is user, assistant, system, or log. sessionStatus tells the
poller when to stop.
GET /interrupts/:id
Fetch a pending human-in-the-loop interrupt.
Response:
type is confirmation, choice, text, form, or review; status is
pending, resolved, or cancelled.
POST /interrupts/:id
Resolve an interrupt by submitting the user’s response. The value type depends
on the interrupt type.
Request:
Response: the updated interrupt (same shape as
GET /interrupts/:id, now
with status: "resolved").
GET /system/config
Public runtime configuration the editor reads on mount.
Response:
CORS Configuration
FlowDrop runs in the browser, so your backend must allow cross-origin requests if served from a different domain:Error Response Format
When an operation fails, return a consistent error format:200— success201— created400— bad request (validation error)401— unauthorized (triggersonApiErrorand auth provider’sonUnauthorized)404— not found500— server error
Static vs. Dynamic Node Serving
For simple use cases, you can serve node metadata as static JSON:Verify your backend (conformance checklist)
FlowDrop exercises your API in a predictable order on mount. Run these requests against your base URL to confirm the contract before wiring up the editor — they mirror exactly what the editor does. Replace theBASE value with your own.
-
GET /healthreturns200with{ "status": "ok" } - Every response uses the
{ "success": true, "data": ... }envelope (the one exception isGET /executions/:id) -
GET /nodesdata items include at leastid,name,type, andcategory - Workflow
metadatauses the exact field namesschemaVersion,createdAt,updatedAt(notcreated_at/updated_at) -
POST /workflowsreturns201and echoes a server-assignedid - Errors return the correct HTTP status (
404missing,401unauthorized) with{ "success": false, "error": ... } - CORS allows your frontend origin if the backend runs on a different domain
Next Steps
- Backend: Express.js — get a working backend in 15 minutes
- Framework Integration — connect FlowDrop to your backend
- API Overview — complete module and endpoint reference
- OpenAPI Specification — full API contract