Nodes
The node catalog. The source of truth for building workflow graphs over the API.
GET /api/v1/nodes returns every node you can put in a workflow graph: generation models, helpers, logic, iterators, IO, and the video compose node. It is unauthenticated and cached for one hour.
This endpoint is the source of truth for building graphs. If you author nodes or edges over the API, read the node's entry here first. Guessing port names or config keys is how graphs save fine and then do nothing at run time.
curl https://www.wireflow.ai/api/v1/nodes
Response
{
"version": 1,
"generatedAt": "2026-07-22T09:00:00.000Z",
"count": 214,
"nodes": [
{
"nodeType": "video:kling_video_2_5_i2v",
"label": "Kling 2.5 Image to Video",
"category": "video",
"source": "fal",
"inputs": [
{ "id": "prompt", "label": "Prompt", "type": "TEXT", "isPort": true },
{
"id": "aspect_ratio",
"label": "Aspect Ratio",
"type": "TEXT",
"isPort": false,
"default": "16:9",
"enum": ["16:9", "9:16", "1:1"]
}
],
"outputs": [
{ "id": "video", "label": "Video", "type": "VIDEO", "isPort": true }
],
"executionCost": "paid",
"pricingModel": "per-second",
"estimatedCredits": 45
}
]
}
Query parameters
| Parameter | Effect |
|---|---|
?category=video |
Filter by category. |
?source=fal|non-fal|registry-shell |
Filter by where the node is implemented. |
?includeHidden=1 |
Include hidden nodes (see below). |
Reading a node entry
inputs/outputsare the node's declared surface. Each input hasisPort:isPort: truemeans wireable. Put it indata.inputsand connect an edge withtargetHandle: "in-<id>".isPort: falsemeans it is a config field. Set it indata.config, never indata.inputs. Putting a config field indata.inputsrenders a stray port.
enumlists the allowed values for a config field. Values outside the enum are flagged by the write-time lint and fail at the provider after credits are spent.defaultis what an unset config field resolves to.dynamicPorts: truemeans the real port set is resolved at run time (templates,{{token}}scene graphs, config-derived extractors).dynamicPortsNoteexplains how. The lint warns instead of blocking on these handles.customNodeTypeis the react-flownode.typeyou must save (e.g. sticky notes need"stickyNote"). Absent means"basedNode".executionCostis the reactivity contract:freenodes recompute locally and cost nothing;paidnodes bill credits and never auto-fire.
Pricing fields
pricingModel— how the node bills:free,flat-usd,per-second,video-tokens,per-image, orunknown.estimatedCredits— the credits a default-config run charges, computed by the same estimator the editor's cost preview uses.nullmeans paid but not statically estimable (thepricingModelstill tells you it bills). A paid node is never shown as0.costUsd— raw provider cost, only meaningful for flat-priced nodes. PreferestimatedCredits.
Iterator fan-out multiplies real cost. The estimate is per single run of the node.
Hidden nodes
By default the catalog excludes hidden nodes: non-primary model variants (quality/routing reaches them through the primary node, so never author them directly), kill-switched providers, and deprecated palette types. ?includeHidden=1 shows them, which is useful for resolving a nodeType you found in an existing graph. Authoring a new node with a deprecated type is rejected at write time.
Related
- Workflows — create and update graphs built from these nodes.
GET /api/v1/models— the model-only listing. For building graphs, use/nodes; it includes non-model nodes (helpers, logic, compose) and the pricing fields above.