@canva/n8n-nodes-canva 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +151 -142
  2. package/dist/nodes/Canva/Canva.node.js +150 -148
  3. package/dist/nodes/Canva/Canva.node.js.map +1 -1
  4. package/dist/nodes/Canva/GenericFunctions.js +44 -4
  5. package/dist/nodes/Canva/GenericFunctions.js.map +1 -1
  6. package/dist/nodes/Canva/resources/asset/index.js +1 -1
  7. package/dist/nodes/Canva/resources/asset/index.js.map +1 -1
  8. package/dist/nodes/Canva/resources/design/index.js +2 -4
  9. package/dist/nodes/Canva/resources/design/index.js.map +1 -1
  10. package/dist/nodes/Canva/resources/designImport/createImageImport.js +43 -0
  11. package/dist/nodes/Canva/resources/designImport/createImageImport.js.map +1 -0
  12. package/dist/nodes/Canva/resources/designImport/createImageImportCreditsNotice.js +13 -0
  13. package/dist/nodes/Canva/resources/designImport/createImageImportCreditsNotice.js.map +1 -0
  14. package/dist/nodes/Canva/resources/designImport/createImageImportPreviewNotice.js +13 -0
  15. package/dist/nodes/Canva/resources/designImport/createImageImportPreviewNotice.js.map +1 -0
  16. package/dist/nodes/Canva/resources/designImport/index.js +12 -0
  17. package/dist/nodes/Canva/resources/designImport/index.js.map +1 -1
  18. package/dist/nodes/Canva/resources/generation/creditsNotice.js +13 -0
  19. package/dist/nodes/Canva/resources/generation/creditsNotice.js.map +1 -0
  20. package/dist/nodes/Canva/resources/generation/generateDesign.js +63 -0
  21. package/dist/nodes/Canva/resources/generation/generateDesign.js.map +1 -0
  22. package/dist/nodes/Canva/resources/generation/generateImage.js +92 -0
  23. package/dist/nodes/Canva/resources/generation/generateImage.js.map +1 -0
  24. package/dist/nodes/Canva/resources/generation/index.js +39 -0
  25. package/dist/nodes/Canva/resources/generation/index.js.map +1 -0
  26. package/dist/nodes/Canva/resources/generation/previewNotice.js +13 -0
  27. package/dist/nodes/Canva/resources/generation/previewNotice.js.map +1 -0
  28. package/dist/nodes/Canva/resources/imageTransformation/creditsNotice.js +13 -0
  29. package/dist/nodes/Canva/resources/imageTransformation/creditsNotice.js.map +1 -0
  30. package/dist/nodes/Canva/resources/imageTransformation/index.js +33 -0
  31. package/dist/nodes/Canva/resources/imageTransformation/index.js.map +1 -0
  32. package/dist/nodes/Canva/resources/imageTransformation/premiumNotice.js +13 -0
  33. package/dist/nodes/Canva/resources/imageTransformation/premiumNotice.js.map +1 -0
  34. package/dist/nodes/Canva/resources/imageTransformation/previewNotice.js +13 -0
  35. package/dist/nodes/Canva/resources/imageTransformation/previewNotice.js.map +1 -0
  36. package/dist/nodes/Canva/resources/imageTransformation/removeBackground.js +51 -0
  37. package/dist/nodes/Canva/resources/imageTransformation/removeBackground.js.map +1 -0
  38. package/dist/package.json +10 -2
  39. package/package.json +10 -2
  40. package/dist/nodes/Canva/resources/design/getDatasetPreviewNotice.js +0 -13
  41. package/dist/nodes/Canva/resources/design/getDatasetPreviewNotice.js.map +0 -1
  42. package/dist/tsconfig.tsbuildinfo +0 -1
package/README.md CHANGED
@@ -2,217 +2,226 @@
2
2
 
3
3
  ![Banner](./.github/assets/github-banner.jpg)
4
4
 
5
- An n8n community node for connecting Canva to n8n using the [Canva Connect API](https://www.canva.dev/docs/connect/). Create and export designs, bulk-generate from brand templates, manage assets and folders, import external files, and connect Canva to the rest of your stack.
5
+ Use Canva in your n8n workflows. Create, autofill, and export designs, manage your assets and folders, and use Canva's AI to generate designs and images, remove backgrounds, or turn flat images into editable designs.
6
+
7
+ This node uses the [Canva REST APIs](https://www.canva.dev/docs/apps/rest-apis/) (formerly the Connect API).
6
8
 
7
9
  - [Installation](#installation)
8
- - [Running n8n locally](#running-n8n-locally)
9
10
  - [Credentials](#credentials)
10
11
  - [Operations](#operations)
11
- - [Usage notes](#usage-notes)
12
+ - [Good to know](#good-to-know)
13
+ - [Run it locally](#run-it-locally)
12
14
  - [Resources](#resources)
13
15
 
14
16
  ## Installation
15
17
 
16
- > This section is for people who already have an n8n instance running (cloud or self-hosted). If you want to test this node on your own machine first, see [Running n8n locally](#running-n8n-locally) below.
17
-
18
- Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation.
19
-
20
- ## Running n8n locally
21
-
22
- > This section is for developers who want to run and test this node locally.
23
-
24
- **Prerequisites:** Node.js 24+, npm.
25
-
26
- 1. Install dependencies and start n8n in dev mode:
27
-
28
- ```bash
29
- npm install
30
- npm run dev
31
- ```
32
-
33
- This builds the node, links it to a local n8n instance, and starts n8n at [http://127.0.0.1:5678](http://127.0.0.1:5678) with hot reload enabled. The **Canva** node will appear in the node picker under _Community Nodes_.
34
-
35
- 2. Follow the [Credentials](#credentials) section below to connect your Canva account.
36
-
37
- > **Note:** When running locally, use `http://127.0.0.1:5678/rest/oauth2-credential/callback` as the redirect URI in the Canva Developer Portal. Canva does not accept `localhost` — you must use the IP address.
38
-
39
- ### Troubleshooting
40
-
41
- #### `npm run dev` fails with `EACCES: permission denied, rename ...` inside `~/.npm/_cacache`
42
-
43
- `npm run dev` starts n8n via `npx n8n@latest`, which downloads n8n through your machine's shared npm cache (`~/.npm`). If that cache contains files owned by another user — usually root, left behind by running npm with `sudo` at some point — the download fails with `EACCES`/`EEXIST` rename errors. Reclaim ownership of the cache and retry:
44
-
45
- ```bash
46
- sudo chown -R $(id -u):$(id -g) ~/.npm
47
- npm run dev
48
- ```
18
+ Follow n8n's guide to [installing community nodes](https://docs.n8n.io/integrations/community-nodes/installation-and-management), using the package name `@canva/n8n-nodes-canva`.
49
19
 
50
20
  ## Credentials
51
21
 
52
- This node uses **OAuth2 with PKCE** to authenticate with Canva.
53
-
54
- ### 1. Create a Canva integration
22
+ To connect n8n to Canva, you create an app in the Canva Developer Portal, then paste its details into n8n. It takes about five minutes.
55
23
 
56
- Go to the [Canva Developer Portal](https://www.canva.com/developers/integrations/connect-api) and create a new private integration. After creation, the integration's settings page will automatically open.
24
+ ### 1. Create an app in the Canva Developer Portal
57
25
 
58
- - In the **Credentials** section, click on **Generate secret** to generate a new secret.
59
- - Copy and paste both the **Client ID** and **Client secret** to a secure file.
60
- - In the **Authentication** tab, add the **OAuth Redirect URL** shown in the n8n credential dialog to the **URL 1** field of the **Authorized redirects**:
61
- - **n8n Cloud:** `https://oauth.n8n.cloud/oauth2/callback`
62
- - **Self-hosted n8n:** `https://your-n8n-instance.com/rest/oauth2-credential/callback`
63
- - **Local n8n:** `http://127.0.0.1:5678/rest/oauth2-credential/callback`
26
+ 1. Go to [**Your apps**](https://www.canva.com/developers/apps) in the Canva Developer Portal and create a new app. Choose **Private** if your team is on Canva Enterprise (the app stays inside your team), or **Public** otherwise. You can't change this later.
27
+ 2. Open **Outside Canva** and click **Start integrating**.
28
+ 3. On **Outside Canva → Configuration**:
29
+ - Turn on **Canva REST APIs**.
30
+ - Under **Credentials**, copy the **Client ID**, then click **Generate secret** and copy the secret too. Canva only shows the secret once, so keep it somewhere safe.
31
+ - Under **Scopes**, turn on all of these:
32
+ - `asset`: Read and Write
33
+ - `brandtemplate:content`: Read and Write
34
+ - `brandtemplate:meta`: Read
35
+ - `comment`: Read and Write
36
+ - `design:content`: Read and Write
37
+ - `design:meta`: Read
38
+ - `folder`: Read and Write
39
+ - `profile`: Read
64
40
 
65
- - In the **Scopes** tab, enable the following scopes:
41
+ The node asks for all of them when you connect, and Canva refuses the connection if any are missing.
66
42
 
67
- | Scope | Used by |
68
- | ---------------------------------------------------------------------------------------- | ------------------------------------------------- |
69
- | `asset:read` / `asset:write` | Asset resource |
70
- | `brandtemplate:content:read` / `brandtemplate:content:write` / `brandtemplate:meta:read` | Brand Template resource |
71
- | `comment:read` / `comment:write` | Comment resource (Preview) |
72
- | `design:content:read` / `design:content:write` / `design:meta:read` | Design, Autofill, Export, Merge, Resize resources |
73
- | `folder:read` / `folder:write` | Folder resource |
74
- | `profile:read` | User resource |
43
+ 4. On **Outside Canva → Redirect URLs**, paste n8n's redirect URL into **URL 1**. You'll find it in the n8n credential screen (step 2 below). It usually looks like this:
44
+ - **n8n Cloud:** `https://oauth.n8n.cloud/oauth2/callback`
45
+ - **Self-hosted n8n:** `https://your-n8n-instance.com/rest/oauth2-credential/callback`
46
+ - **n8n on your computer:** `http://127.0.0.1:5678/rest/oauth2-credential/callback` (Canva doesn't accept `localhost`, so use `127.0.0.1`)
75
47
 
76
- Your integration's **Scopes** settings should look like this:
48
+ ### 2. Connect it in n8n
77
49
 
78
- <!-- markdownlint-disable-next-line MD033 -->
79
- <img src="./.github/assets/app-scopes.png" alt="Your app's scopes" width="50%" />
50
+ 1. In n8n, go to **Credentials → New** and pick **Canva OAuth2 API**.
51
+ 2. Paste the **Client ID** and **Client secret** from step 1.
52
+ 3. Click **Connect my account** and approve access in Canva.
80
53
 
81
- ### 2. Add your integration's credentials to the Canva node in n8n
54
+ ## Operations
82
55
 
83
- 1. In n8n, open **Credentials → New → Canva OAuth2 API**.
84
- 2. Enter the **Client ID** and **Client secret** that you saved earlier.
85
- 3. Click **Connect my account** and complete the OAuth flow.
56
+ A few labels you'll see below:
86
57
 
87
- ## Operations
58
+ - _(Preview)_: uses one of Canva's preview APIs. See [Preview APIs](#preview-apis).
59
+ - 💎: needs a paid Canva plan, such as Canva Pro.
60
+ - ✨: uses the Canva user's AI credits. See [AI credits](#ai-credits).
88
61
 
89
62
  ### Asset
90
63
 
91
- | Operation | Description |
92
- | --------------------------- | ----------------------------------------------------------------- |
93
- | Delete | Delete an asset |
94
- | Get | Get metadata for an asset |
95
- | Update | Update an asset's name or tags |
96
- | Upload From URL _(Preview)_ | Upload an asset from a public URL and wait for completion (async) |
64
+ | Operation | What it does |
65
+ | --------------------------- | ------------------------------------------ |
66
+ | Delete | Delete an asset |
67
+ | Get | Get an asset's details |
68
+ | Update | Rename an asset or change its tags |
69
+ | Upload From URL _(Preview)_ | Upload an image or video from a public URL |
97
70
 
98
71
  ### Autofill
99
72
 
100
- > 💎 The Autofill API can only be used on behalf of users on a Canva Pro plan or above.
73
+ > 💎 Needs a Canva Pro plan or above.
101
74
 
102
- | Operation | Description |
103
- | --------- | ----------------------------------------------------------------------------- |
104
- | Create | Populate a brand template with data and wait for the resulting design (async) |
75
+ | Operation | What it does |
76
+ | --------- | --------------------------------------------------------- |
77
+ | Create | Fill a brand template with your data to make a new design |
105
78
 
106
79
  ### Brand Template
107
80
 
108
- > 💎 The Brand Template APIs require a Canva plan with premium features (such as Canva Pro).
81
+ > 💎 Needs a Canva plan with premium features, such as Canva Pro.
109
82
 
110
- | Operation | Description |
111
- | ------------------- | ----------------------------------------------- |
112
- | Get | Get metadata for a brand template |
113
- | Get Dataset | Get the autofill dataset for a brand template |
114
- | Get Many | Get many brand templates accessible to the user |
115
- | Publish _(Preview)_ | Publish a design as a brand template |
83
+ | Operation | What it does |
84
+ | ------------------- | --------------------------------------------------- |
85
+ | Get | Get a brand template's details |
86
+ | Get Dataset | Get the fields you can autofill in a brand template |
87
+ | Get Many | List the brand templates you can use |
88
+ | Publish _(Preview)_ | Publish a design as a brand template |
116
89
 
117
90
  ### Comment _(Preview API)_
118
91
 
119
- > ⚠️ All Comment operations use a Preview API that may have unannounced breaking changes and cannot be used in public integrations submitted for Canva review.
120
-
121
- | Operation | Description |
122
- | ------------- | ------------------------------------------ |
123
- | Create Reply | Reply to a comment thread on a design |
124
- | Create Thread | Create a new comment thread on a design |
125
- | Get Reply | Get a specific reply from a comment thread |
126
- | Get Thread | Get metadata for a comment thread |
127
- | List Replies | List all replies in a comment thread |
92
+ | Operation | What it does |
93
+ | ------------- | ---------------------------------- |
94
+ | Create Reply | Reply to a comment thread |
95
+ | Create Thread | Start a comment thread on a design |
96
+ | Get Reply | Get one reply from a thread |
97
+ | Get Thread | Get a comment thread |
98
+ | List Replies | List the replies in a thread |
128
99
 
129
100
  ### Design
130
101
 
131
- | Operation | Description |
132
- | ----------------------- | --------------------------------------------- |
133
- | Create | Create a new design |
134
- | Get | Get metadata for a design |
135
- | Get Dataset _(Preview)_ | Get the autofill dataset for a design |
136
- | Get Export Formats | Get the available export formats for a design |
137
- | Get Many | Get many designs from the user's projects |
138
- | Get Pages _(Preview)_ | Get metadata for pages in a design |
102
+ | Operation | What it does |
103
+ | --------------------- | ----------------------------------------------------- |
104
+ | Create | Create a blank design, optionally with an image in it |
105
+ | Get | Get a design's details |
106
+ | Get Dataset | Get the fields you can autofill in a design |
107
+ | Get Export Formats | See which file formats a design can be exported to |
108
+ | Get Many | List your designs |
109
+ | Get Pages _(Preview)_ | Get details about each page in a design |
139
110
 
140
111
  ### Design Import
141
112
 
142
- | Operation | Description |
143
- | --------------- | ---------------------------------------------------------------------------------------------- |
144
- | Import From URL | Import an external file (e.g. PPTX, PDF) into Canva from a URL and wait for completion (async) |
113
+ | Operation | What it does |
114
+ | ----------------------------- | ------------------------------------------------------------------- |
115
+ | Import From Image _(Preview)_ | ✨ Turn a flat image into an editable design with Magic Layers |
116
+ | Import From URL | Import a file from a public URL, such as a PPTX or PDF, as a design |
145
117
 
146
118
  ### Export
147
119
 
148
- | Operation | Description |
149
- | ------------- | ---------------------------------------------------------------------- |
150
- | Export Design | Export a design to a file format and wait for the download URL (async) |
120
+ | Operation | What it does |
121
+ | ------------- | ------------------------------------------------------------------------------------ |
122
+ | Export Design | Export a design as a PDF, PNG, JPG, GIF, MP4, PPTX, and more, and get download links |
151
123
 
152
124
  ### Folder
153
125
 
154
- | Operation | Description |
155
- | ---------- | ----------------------------------------------------- |
156
- | Create | Create a new folder |
157
- | Delete | Delete a folder |
158
- | Get | Get metadata for a folder |
159
- | List Items | List items inside a folder |
160
- | Move Item | Move a design, asset, or folder to a different folder |
161
- | Update | Rename a folder |
126
+ | Operation | What it does |
127
+ | ---------- | ------------------------------------------------- |
128
+ | Create | Create a folder |
129
+ | Delete | Delete a folder |
130
+ | Get | Get a folder's details |
131
+ | List Items | List what's in a folder |
132
+ | Move Item | Move a design, image, or folder to another folder |
133
+ | Update | Rename a folder |
162
134
 
163
- ### Merge _(Preview API)_
135
+ ### Generation _(Preview API)_
136
+
137
+ | Operation | What it does |
138
+ | --------------- | ---------------------------------------------------------- |
139
+ | Generate Design | ✨ Create a presentation or Canva doc from a written brief |
140
+ | Generate Image | ✨ Create an image from a text prompt |
164
141
 
165
- > ⚠️ All Merge operations use a Preview API that may have unannounced breaking changes and cannot be used in public integrations submitted for Canva review.
142
+ ### Image Transformation _(Preview API)_
166
143
 
167
- | Operation | Description |
168
- | ---------------- | ----------------------------------------------------------------------------------- |
169
- | Create Merge Job | Merge design pages by applying page operations to create or modify a design (async) |
144
+ > 💎 Needs a Canva plan with premium features, such as Canva Pro.
145
+
146
+ | Operation | What it does |
147
+ | ----------------- | ----------------------------------------------------------------- |
148
+ | Remove Background | ✨ Remove the background from an image and save it as a new image |
149
+
150
+ ### Merge _(Preview API)_
151
+
152
+ | Operation | What it does |
153
+ | ---------------- | -------------------------------------------------------------------------------- |
154
+ | Create Merge Job | Combine pages from other designs into a new one, or rearrange an existing design |
170
155
 
171
156
  ### Resize
172
157
 
173
- > 💎 The Resize API requires a Canva plan with premium features (such as Canva Pro). Users on the Canva Free plan have access to a limited trial.
158
+ > 💎 Needs a Canva plan with premium features, such as Canva Pro. Canva Free users get a limited trial.
174
159
 
175
- | Operation | Description |
176
- | ----------------- | --------------------------------------------------------------------------------- |
177
- | Create Resize Job | Create a resized copy of a design in new dimensions or a different format (async) |
160
+ | Operation | What it does |
161
+ | ----------------- | ------------------------------------- |
162
+ | Create Resize Job | Make a copy of a design in a new size |
178
163
 
179
164
  ### User
180
165
 
181
- | Operation | Description |
182
- | ---------------- | -------------------------------------------------------------- |
183
- | Get Capabilities | Get the API capabilities available to the current user account |
184
- | Get Me | Get the User ID and Team ID of the authenticated user |
185
- | Get Profile | Get the display name of the authenticated user |
166
+ | Operation | What it does |
167
+ | ---------------- | --------------------------------------------------- |
168
+ | Get Capabilities | See which Canva features the connected user can use |
169
+ | Get Me | Get the connected user's ID and team ID |
170
+ | Get Profile | Get the connected user's display name |
186
171
 
187
- ## Usage notes
172
+ ## Good to know
188
173
 
189
- ### Async operations
174
+ ### Waiting for Canva to finish
190
175
 
191
- Several operations — **Asset Upload From URL**, **Autofill**, **Design Import**, **Export**, **Merge**, and **Resize** — create background jobs in Canva. This node automatically polls for completion and returns the final result once the job succeeds.
176
+ Some operations start a job in Canva and wait for it to finish: Upload From URL, Autofill, both imports, Export, Merge, Resize, and all the AI features. While it waits, the node checks every few seconds (**Poll Interval**) and gives up after a while (**Max Wait**, 60 to 300 seconds by default, depending on the operation). Big jobs, like long presentations, can take a couple of minutes.
192
177
 
193
- You can tune polling behaviour with two optional parameters available on each async operation:
178
+ If a job fails, the error tells you Canva's reason, such as a prompt that didn't pass Canva's safety checks.
194
179
 
195
- - **Poll Interval** (default 2–3 s depending on the operation) — how often to check for job completion
196
- - **Max Wait** (default 60 s, or 120 s for Design Import) — maximum time to wait before throwing a timeout error
180
+ ### When Canva is busy, or a quota runs out
197
181
 
198
- If a job fails, the node throws an error with the Canva error details.
182
+ If Canva says it's getting too many requests, the node waits and tries again, up to three times. If the user has run out of AI credits, or used up their free autofill or resize trial, waiting won't help, so the node stops straight away and says so.
199
183
 
200
184
  ### Preview APIs
201
185
 
202
- Operations marked _(Preview)_ use endpoints that are still in preview on the Canva platform. They may change without notice and **cannot be used in integrations submitted to Canva's public integration review**. Use them only for internal or development workflows.
186
+ Operations marked _(Preview)_ use Canva APIs that are still in preview. They can change without notice, and apps that use them can't be submitted for Canva's public review. They're great for internal workflows and experiments.
187
+
188
+ ### AI credits
189
+
190
+ **Import From Image**, **Generate Design**, **Generate Image**, and **Remove Background** use the Canva user's AI credits every time they run. Checking on a running job is free.
191
+
192
+ Not every account can use every AI feature. **User → Get Capabilities** lists what the connected user can do, for example `image_to_design_imports` (Magic Layers), `background_removal`, and `design_generation`.
193
+
194
+ ### Tips
203
195
 
204
- ### Moving items
196
+ - **Autofill:** run **Brand Template → Get Dataset** first. Your data's field names need to match the template's fields.
197
+ - **Import From Image (Magic Layers):** works best on flat graphics like posters, flyers, and social posts. Upload the image first with **Asset → Upload From URL**, then use its ID: `{{ $json.job.asset.id }}`. Magic Layers must be allowed in your team's Canva settings.
198
+ - **Remove Background:** saves the result as a new image and leaves the original as it is. The new image's ID is at `job.result.asset.id`.
199
+ - **Generate Design:** the more your brief says about the topic, audience, wording, tone, and look, the better the result. For presentations, you can also plan the slides with **Outline**, using Canva's format: `{"sections": [{"title": "…", "description": "…", "points": ["…"]}]}` (up to 100 slides). Leave `sections` empty to let Canva decide. If an earlier node gives you just a list of slides, use `{{ { "sections": $json.slides } }}`. Open the new design from `job.result.design.urls.edit_url` (the link works for 30 days).
200
+ - **Generate Image:** leave **Model** on **Auto** unless you need a specific one. Images are saved to the user's Uploads by default, so you can use `job.result.image.asset.id` in **Design → Create** or **Autofill**. The download link at `job.result.image.url` works for 24 hours. To pass the file to another node, download it with an **HTTP Request** node.
201
+ - **Move Item:** use `root` as the **To Folder ID** to move something to the top level of your Projects.
205
202
 
206
- The **Folder → Move Item** operation accepts any item ID (design, asset, or folder). To move an item to the top-level Projects folder, use `root` as the **To Folder ID**.
203
+ ## Run it locally
207
204
 
208
- ### Autofill dataset format
205
+ For developers who want to work on this node.
209
206
 
210
- The **Autofill → Create** operation requires a `data` object whose keys must match the dataset fields returned by **Brand Template → Get Dataset**. Use the Get Dataset operation first to discover the correct field names.
207
+ You'll need Node.js 24.15 or later and npm. Then run:
208
+
209
+ ```bash
210
+ npm install
211
+ npm run dev
212
+ ```
213
+
214
+ This builds the node and starts n8n at [http://127.0.0.1:5678](http://127.0.0.1:5678) with the Canva node loaded and hot reload turned on. When you set up your Canva app, use `http://127.0.0.1:5678/rest/oauth2-credential/callback` as the redirect URL.
215
+
216
+ **If `npm run dev` fails with `EACCES: permission denied, rename ...` in `~/.npm/_cacache`:** your npm cache has files owned by another user, usually left behind by running npm with `sudo`. Take ownership of the cache, then try again:
217
+
218
+ ```bash
219
+ sudo chown -R $(id -u):$(id -g) ~/.npm
220
+ ```
211
221
 
212
222
  ## Resources
213
223
 
214
- - [Ready-to-import example workflows](./examples/)
215
- - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
216
- - [Canva Connect API reference](https://www.canva.dev/docs/connect/api-reference/)
217
- - [Canva Developer Portal](https://www.canva.com/developers)
218
- - [Canva Developer Documentation](https://www.canva.dev/)
224
+ - [Example workflows](./examples/), ready to import
225
+ - [Canva REST APIs](https://www.canva.dev/docs/apps/rest-apis/) and the [REST API reference](https://www.canva.dev/docs/apps/reference/)
226
+ - [Canva Developer Portal](https://www.canva.com/developers/apps)
227
+ - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes)