## Attach an asset to a canvas `client.Projects.Assets.AttachAsset(ctx, assetID, body) (*ProjectAssetAttachAssetResponse, error)` **post** `/projects/{projectId}/assets/{assetId}/attach` Attaches an existing ready asset to a project canvas as a static media node. Mutating public API requests support an optional Idempotency-Key header for client retries; duplicate keys within two hours return idempotency_duplicate. ### Parameters - `assetID string` Asset identifier - `body ProjectAssetAttachAssetParams` - `ProjectID param.Field[string]` Project identifier ### Returns - `type ProjectAssetAttachAssetResponse struct{…}` - `AssetID string` Asset identifier - `CanvasURL string` Project canvas URL - `NodeID string` Canvas node identifier - `ProjectID string` Project identifier ### 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"), ) response, err := client.Projects.Assets.AttachAsset( context.TODO(), "asset_abc123", flora.ProjectAssetAttachAssetParams{ ProjectID: "prj_abc123", }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", response.AssetID) } ``` #### Response ```json { "asset_id": "asset_abc123", "canvas_url": "https://example.com", "node_id": "node_abc123", "project_id": "prj_abc123" } ```