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 / outputs are the node's declared surface. Each input has isPort:
    • isPort: true means wireable. Put it in data.inputs and connect an edge with targetHandle: "in-<id>".
    • isPort: false means it is a config field. Set it in data.config, never in data.inputs. Putting a config field in data.inputs renders a stray port.
  • enum lists 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.
  • default is what an unset config field resolves to.
  • dynamicPorts: true means the real port set is resolved at run time (templates, {{token}} scene graphs, config-derived extractors). dynamicPortsNote explains how. The lint warns instead of blocking on these handles.
  • customNodeType is the react-flow node.type you must save (e.g. sticky notes need "stickyNote"). Absent means "basedNode".
  • executionCost is the reactivity contract: free nodes recompute locally and cost nothing; paid nodes bill credits and never auto-fire.

Pricing fields

  • pricingModel — how the node bills: free, flat-usd, per-second, video-tokens, per-image, or unknown.
  • estimatedCredits — the credits a default-config run charges, computed by the same estimator the editor's cost preview uses. null means paid but not statically estimable (the pricingModel still tells you it bills). A paid node is never shown as 0.
  • costUsd — raw provider cost, only meaningful for flat-priced nodes. Prefer estimatedCredits.

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.

  • 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.

© 2026 Wireflow. All rights reserved.

Nodes | Wireflow Docs