---
title: "Get a canvas action"
method: GET
path: "/projects/{projectId}/actions/{nodeId}"
tags: ["Canvas"]
---

# Get a canvas action

`GET /projects/{projectId}/actions/{nodeId}`

## Request

- Base URL: `https://app.flora.ai/api/v1`
- URL: `https://app.flora.ai/api/v1/projects/{projectId}/actions/{nodeId}`
- Auth: HTTP bearer

Describes one canvas action node: its declared inputs, outputs and parameter controls (for a custom action, parsed from its code), the parameter values stored on the node, and the nodes wired into it.

## Path parameters

- `projectId` string, required: Project identifier
- `nodeId` string, required: Canvas action node identifier: the persisted short id (n7) or the node UUID

## Response `200`

Canvas action.

- object
  - `project_id` string, required: Project identifier
  - `node_id` string, required: Canvas action node UUID
  - `short_id` string, nullable, required: Persisted short id (n7) of the node, when settled
  - `action_id` 'color-grade-image-browser' | 'overlay-image-browser' | 'draw-image-browser' | 'pixel-remover-image-browser' | 'magic-eraser-image-browser' | 'crop-image-browser' | 'scene-3d-image-browser' | 'blur-image-browser' | 'change-image-ar-browser' | 'rotate-image-browser' | 'color-filter-image-browser' | 'color-tint-image-browser' | 'filter-color-image-browser' | 'duplicate-image-browser' | 'side-by-side-composite-browser' | 'add-shape-to-image-browser' | 'add-text-to-image-browser' | 'qr-code-generator-browser' | 'resize-image-browser' | 'shader-effect-browser' | 'split-text-browser' | 'find-and-replace-text-browser' | 'concat-text-browser' | 'ken-burns-video' | 'stitch-videos' | 'split-video' | 'extract-video-frames' | 'color-grade-video' | 'video-to-frame-grid' | 'boomerang-video' | 'reverse-video' | 'video-to-long-exposure' | 'video-effect' | 'color-filter-video' | 'speed-up-video' | 'slow-down-video' | 'duplicate-video' | 'greenscreen-video' | 'resize-video' | 'change-video-ar' | 'split-audio-from-video' | 'merge-audio-into-video', nullable, required: Action identifier
  - `custom` boolean, required: True when the node runs its own code rather than a prebuilt action
  - `name` string, required: Action name
  - `description` string, required: Action description
  - `language` 'javascript' | 'python', required: Action source language
  - `runtime` 'node' | 'python' | 'browser', required: Where the action executes: a server sandbox (node, python) or the browser runtime (browser), which a host can also run live
  - `has_preview` boolean, required: True when the code is a browser-runtime module exporting `preview`, so a host can mount it live and re-render edits without a run
  - `code` string, nullable, required: The action's source. For a browser-runtime action, mount it in the FLORA action runtime frame for a live preview; a run replays the same code on the server.
  - `tool_state` unknown
  - `charged_cost` number, required: Cost per execution in USD
  - `locked` boolean, required: True when the node is locked and cannot be run or edited
  - `inputs` object[], required: Action input slots
    - `name` string, required: Action input or output name
    - `type` 'image' | 'video' | 'text' | 'audio' | 'model3d', required: Action input or output media type
    - `dynamic` boolean: Deprecated alias for `multiple: true`. Mirrors `multiple` for back-compat.
    - `optional` boolean: Whether the slot allows zero connections in single-input mode. Ignored when `multiple` is the object form (use `min: 0` there instead).
    - `multiple` union: Many-connections form. `true` is unbounded shorthand; the object form sets explicit min/max bounds.
      - unknown
      - object
        - `min` integer
        - `max` integer
  - `outputs` object[], required: Action output slots
    - `name` string, required: Action input or output name
    - `type` 'image' | 'video' | 'text' | 'audio' | 'model3d', required: Action input or output media type
    - `dynamic` boolean: Deprecated alias for `multiple: true`. Mirrors `multiple` for back-compat.
    - `optional` boolean: Whether the slot allows zero connections in single-input mode. Ignored when `multiple` is the object form (use `min: 0` there instead).
    - `multiple` union: Many-connections form. `true` is unbounded shorthand; the object form sets explicit min/max bounds.
      - unknown
      - object
        - `min` integer
        - `max` integer
  - `params` object[], required: Action parameters (snake_case keys)
    - `key` string, required: Action parameter key
    - `type` string, required: Action parameter control type
    - `label` string: Action parameter label
    - `info_tooltip` string: Action parameter description
    - `default_value` unknown
    - `available_values` object[]: Allowed parameter values
      - `value` string, required
      - `label` string, required
      - `description` string
    - `min_number_value` number: Lowest accepted number
    - `max_number_value` number: Highest accepted number
    - `number_step` number: Step between accepted numbers
    - `placeholder` string: Placeholder shown in an empty text control
    - `max_count` integer: For colorList controls: how many colors the value may hold
    - `visible_if` object[]: Conditions under which a control is shown, all of which must hold. Keys are the snake_case keys of this same params list.
      - `key` string, required: Key of the parameter this condition reads
      - `equals` union: Show this parameter only when the other parameter equals this value
        - string
        - number
        - boolean
      - `not_equals` union: Show this parameter only when the other parameter differs from this value
        - string
        - number
        - boolean
    - `point2d_min` object: Per-axis minimum for point2d values
      - `x` number: Bound on the x axis
      - `y` number: Bound on the y axis
      - `z` number: Bound on the z axis (point3d only)
    - `point2d_max` object: Per-axis maximum for point2d values
      - `x` number: Bound on the x axis
      - `y` number: Bound on the y axis
      - `z` number: Bound on the z axis (point3d only)
    - `point2d_step` object: Per-axis step for point2d values
      - `x` number: Bound on the x axis
      - `y` number: Bound on the y axis
      - `z` number: Bound on the z axis (point3d only)
    - `point3d_min` object: Per-axis minimum for point3d values
      - `x` number: Bound on the x axis
      - `y` number: Bound on the y axis
      - `z` number: Bound on the z axis (point3d only)
    - `point3d_max` object: Per-axis maximum for point3d values
      - `x` number: Bound on the x axis
      - `y` number: Bound on the y axis
      - `z` number: Bound on the z axis (point3d only)
    - `point3d_step` object: Per-axis step for point3d values
      - `x` number: Bound on the x axis
      - `y` number: Bound on the y axis
      - `z` number: Bound on the z axis (point3d only)
  - `param_values` object, required: Parameter values stored on the node, keyed like params[].key; defaults apply for missing keys
  - `connected_inputs` object[], required: Nodes wired into this action, in edge order
    - `node_id` string, required: Short id (n7) or UUID of the connected node
    - `label` string, nullable, required: Connected node label
    - `type` 'image' | 'video' | 'text' | 'audio' | 'model3d', nullable, required: Media type the connected node currently supplies, null until it has an output
    - `url` string, nullable, required: Current output URL of the connected node
    - `text` string, nullable, required: Current text output of the connected node
  - `canvas_url` string, uri, required: Project canvas URL

## Other responses

- `400`: 400
- `401`: 401
- `402`: 402
- `403`: 403
- `404`: 404
- `409`: 409
- `429`: 429
- `500`: 500
- `503`: 503

## Changes

- **2026-10-28** `a8351619f225`: 9 warning
  - added the new `not_configured` enum value to the `error/code` response property for the response status `400`
  - added the new `not_configured` enum value to the `error/code` response property for the response status `401`
  - added the new `not_configured` enum value to the `error/code` response property for the response status `402`
  - added the new `not_configured` enum value to the `error/code` response property for the response status `403`
  - …5 more
- **2026-10-16** `e54130373b10`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/florafauna-ai/apis/flora-ai-api/changes/projects/:projectId/actions/:nodeId/get.md)

---

[API](https://skmtc.dev/florafauna-ai/apis/flora-ai-api.md) - [All operations](https://skmtc.dev/florafauna-ai/apis/flora-ai-api/llms.txt) - [OpenAPI document](https://skmtc.dev/florafauna-ai/apis/flora-ai-api/revisions/87cfe2c4ac29?raw)
