## List project canvas nodes `client.Projects.ListNodes(ctx, projectID, query) (*CanvasNodesCursorPage[ProjectListNodesResponse], error)` **get** `/projects/{projectId}/nodes` Returns sanitized visible media nodes on a project canvas. The response omits raw graph documents, Liveblocks internals, raw Convex IDs, and unbounded node data blobs. ### Parameters - `projectID string` Project identifier - `query ProjectListNodesParams` - `Cursor param.Field[string]` Opaque cursor for fetching the next page - `Limit param.Field[int64]` Maximum number of results to return ### Returns - `type ProjectListNodesResponse struct{…}` - `NodeID string` Canvas node identifier - `Type ProjectListNodesResponseType` Canvas node media type - `const ProjectListNodesResponseTypeImage ProjectListNodesResponseType = "image"` - `const ProjectListNodesResponseTypeVideo ProjectListNodesResponseType = "video"` - `const ProjectListNodesResponseTypeAudio ProjectListNodesResponseType = "audio"` - `const ProjectListNodesResponseTypeText ProjectListNodesResponseType = "text"` - `AssetID string` Asset identifier - `Height int64` - `Label string` Canvas node label - `URL string` Canvas node output URL or text content - `Width int64` ### Example ```go package main import ( "context" "fmt" "github.com/florafauna-ai/flora-go" "github.com/florafauna-ai/flora-go/option" ) func main() { client := flora.NewClient( option.WithAPIKey("My API Key"), ) page, err := client.Projects.ListNodes( context.TODO(), "prj_abc123", flora.ProjectListNodesParams{ }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", page) } ``` #### Response ```json { "canvas_url": "https://example.com", "meta": { "next_cursor": "eyJvZmZzZXQiOjIwfQ", "total_estimate": 0 }, "nodes": [ { "node_id": "node_abc123", "type": "image", "asset_id": "asset_abc123", "height": 0, "label": "Logo", "url": "https://media.flora.ai/output.png", "width": 0 } ], "project_id": "prj_abc123" } ```