HTTP API
Workflows
Fetch a workflow's live-draft embed payload.
Get a workflow
GET /api/v1/workflows/:idReturns the workflow's current saved graph and texture assets — the live draft, not a published version. The id is the capability; no authentication is required.
curl https://fluorite.studio/api/v1/workflows/<id>Response
{
"id": "…",
"name": "My workflow",
"schemaVersion": 1,
"updatedAt": "2026-08-26T12:00:00.000Z",
"graph": {
"nodes": [{ "id": "…", "type": "registryNode", "data": {} }],
"edges": [
{
"id": "…",
"source": "…",
"sourceHandle": null,
"target": "…",
"targetHandle": "color"
}
]
},
"assets": [{ "id": "textures/…", "url": "https://…/api/get-texture?path=…" }]
}| Field | Type | Description |
|---|---|---|
id | string | Workflow id |
name | string | Workflow name |
schemaVersion | 1 | The frozen wire-schema version; clients refuse unknown versions |
updatedAt | string | ISO timestamp of the last save; the ETag derives from it |
graph.nodes | array | { id, type?, data } per node |
graph.edges | array | { id, source, sourceHandle?, target, targetHandle? } per edge |
assets | array | { id, url } per texture — absolute URLs served via the proxy |
Conditional requests
Responses carry an ETag. Replay it as If-None-Match to get a bodyless
304 Not Modified when the workflow hasn't been saved since:
curl -H 'If-None-Match: "1724666400000"' \
https://fluorite.studio/api/v1/workflows/<id>Errors
| Status | Meaning |
|---|---|
404 | No workflow with that id |
413 | Workflow too large (more than 2000 nodes) |
422 | The stored graph is malformed |