canva
$
npx mdskill add vm0-ai/vm0-skills/canvaCreate professional designs instantly using the Canva API.
- Generates marketing materials, social graphics, and custom templates.
- Requires a valid Canva API token for authentication.
- Executes requests based on design creation or template queries.
- Returns design metadata, URLs, and visual assets directly.
SKILL.md
.github/skills/canvaView on GitHub ↗
---
name: canva
description: Canva API for design creation. Use when user mentions "Canva", "create
design", "Canva template", or asks about design graphics.
---
## Troubleshooting
If requests fail, run `zero doctor check-connector --env-name CANVA_TOKEN` or `zero doctor check-connector --url https://api.canva.com/rest/v1/users/me/profile --method GET`
## How to Use
All examples below assume you have `CANVA_TOKEN` set.
Base URL: `https://api.canva.com/rest/v1`
### 1. Get Current User Profile
Get your user profile information:
```bash
curl -s "https://api.canva.com/rest/v1/users/me/profile" --header "Authorization: Bearer $CANVA_TOKEN" | jq '.profile'
```
### 2. List Designs
List designs in your account:
```bash
curl -s "https://api.canva.com/rest/v1/designs?limit=20" --header "Authorization: Bearer $CANVA_TOKEN" | jq '.items[] | {id, title, created_at, updated_at}'
```
To search designs by query:
```bash
curl -s "https://api.canva.com/rest/v1/designs?query=marketing&limit=10" --header "Authorization: Bearer $CANVA_TOKEN" | jq '.items[] | {id, title}'
```
Save a design ID from the results for use in subsequent commands.
### 3. Get Design Details
Get metadata for a specific design. Replace `<design-id>` with an actual design ID:
```bash
curl -s "https://api.canva.com/rest/v1/designs/<design-id>" --header "Authorization: Bearer $CANVA_TOKEN" | jq '.design | {id, title, owner, urls, created_at, updated_at, page_count}'
```
### 4. Create a New Design
Create a new document:
Write to `/tmp/canva_request.json`:
```json
{
"design_type": {
"type": "preset",
"name": "doc"
},
"title": "My New Document"
}
```
Then run:
```bash
curl -s -X POST "https://api.canva.com/rest/v1/designs" --header "Authorization: Bearer $CANVA_TOKEN" --header "Content-Type: application/json" -d @/tmp/canva_request.json | jq '.design | {id, title, urls}'
```
**Preset names:** `doc`, `presentation`, `whiteboard`
To create a design with custom dimensions (in pixels, 40-8000):
Write to `/tmp/canva_request.json`:
```json
{
"design_type": {
"type": "custom",
"width": 1080,
"height": 1080
},
"title": "Instagram Post"
}
```
Then run:
```bash
curl -s -X POST "https://api.canva.com/rest/v1/designs" --header "Authorization: Bearer $CANVA_TOKEN" --header "Content-Type: application/json" -d @/tmp/canva_request.json | jq '.design | {id, title, urls}'
```
### 5. Export Design as PDF
Export a design as PDF. Replace `<design-id>` with an actual design ID:
Write to `/tmp/canva_request.json`:
```json
{
"design_id": "<design-id>",
"format": {
"type": "pdf",
"size": "a4"
}
}
```
Then run:
```bash
curl -s -X POST "https://api.canva.com/rest/v1/exports" --header "Authorization: Bearer $CANVA_TOKEN" --header "Content-Type: application/json" -d @/tmp/canva_request.json | jq '{id: .job.id, status: .job.status}'
```
Then poll for completion. Replace `<export-id>` with the job ID from above:
```bash
curl -s "https://api.canva.com/rest/v1/exports/<export-id>" --header "Authorization: Bearer $CANVA_TOKEN" | jq '{status: .job.status, urls: .job.urls}'
```
When status is `success`, download URLs are valid for 24 hours.
### 6. Export Design as PNG
Export a design as PNG. Replace `<design-id>` with an actual design ID:
Write to `/tmp/canva_request.json`:
```json
{
"design_id": "<design-id>",
"format": {
"type": "png",
"width": 1024,
"transparent_background": true
}
}
```
Then run:
```bash
curl -s -X POST "https://api.canva.com/rest/v1/exports" --header "Authorization: Bearer $CANVA_TOKEN" --header "Content-Type: application/json" -d @/tmp/canva_request.json | jq '{id: .job.id, status: .job.status}'
```
Poll with the same export status endpoint as above.
### 7. List Design Pages
Get all pages of a design. Replace `<design-id>` with an actual design ID:
```bash
curl -s "https://api.canva.com/rest/v1/designs/<design-id>/pages" --header "Authorization: Bearer $CANVA_TOKEN" | jq '.items[] | {index: .index, title: .title, width: .width, height: .height}'
```
### 8. Create a Folder
Create a new folder to organize designs:
Write to `/tmp/canva_request.json`:
```json
{
"name": "Marketing Assets",
"parent_folder_id": "root"
}
```
Then run:
```bash
curl -s -X POST "https://api.canva.com/rest/v1/folders" --header "Authorization: Bearer $CANVA_TOKEN" --header "Content-Type: application/json" -d @/tmp/canva_request.json | jq '.folder | {id, name}'
```
### 9. List Folder Items
List items in a folder. Replace `<folder-id>` with an actual folder ID:
```bash
curl -s "https://api.canva.com/rest/v1/folders/<folder-id>/items?limit=20" --header "Authorization: Bearer $CANVA_TOKEN" | jq '.items[] | {type, id: .design.id // .folder.id, name: .design.title // .folder.name}'
```
### 10. Move Item to Folder
Move a design or folder to another folder. Replace `<item-id>` and `<target-folder-id>`:
Write to `/tmp/canva_request.json`:
```json
{
"item_id": "<item-id>",
"to": {
"folder_id": "<target-folder-id>"
}
}
```
Then run:
```bash
curl -s -X POST "https://api.canva.com/rest/v1/folders/move" --header "Authorization: Bearer $CANVA_TOKEN" --header "Content-Type: application/json" -d @/tmp/canva_request.json
```
### 11. Get Asset Details
Get metadata for an uploaded asset. Replace `<asset-id>` with an actual asset ID:
```bash
curl -s "https://api.canva.com/rest/v1/assets/<asset-id>" --header "Authorization: Bearer $CANVA_TOKEN" | jq '.asset | {id, name, tags, created_at, updated_at, thumbnail}'
```
### 12. Update Asset
Update an asset's name and tags. Replace `<asset-id>` with an actual asset ID:
Write to `/tmp/canva_request.json`:
```json
{
"name": "Updated Logo",
"tags": ["logo", "brand", "2025"]
}
```
Then run:
```bash
curl -s -X PATCH "https://api.canva.com/rest/v1/assets/<asset-id>" --header "Authorization: Bearer $CANVA_TOKEN" --header "Content-Type: application/json" -d @/tmp/canva_request.json | jq '.asset | {id, name, tags}'
```
### 13. Delete Asset
Delete an asset (moves to trash). Replace `<asset-id>` with an actual asset ID:
```bash
curl -s -X DELETE "https://api.canva.com/rest/v1/assets/<asset-id>" --header "Authorization: Bearer $CANVA_TOKEN"
```
### 14. Create Comment Thread
Add a comment to a design. Replace `<design-id>`:
Write to `/tmp/canva_request.json`:
```json
{
"message": "Can we adjust the colors here to match the brand guidelines?",
"attached_to": {
"type": "design"
}
}
```
Then run:
```bash
curl -s -X POST "https://api.canva.com/rest/v1/designs/<design-id>/comments" --header "Authorization: Bearer $CANVA_TOKEN" --header "Content-Type: application/json" -d @/tmp/canva_request.json | jq '.thread | {id, message}'
```
### 15. Reply to Comment Thread
Reply to an existing comment thread. Replace `<design-id>` and `<thread-id>`:
Write to `/tmp/canva_request.json`:
```json
{
"message": "Updated the colors. Please review."
}
```
Then run:
```bash
curl -s -X POST "https://api.canva.com/rest/v1/designs/<design-id>/comments/<thread-id>/replies" --header "Authorization: Bearer $CANVA_TOKEN" --header "Content-Type: application/json" -d @/tmp/canva_request.json | jq '.reply | {id, message}'
```
### 16. List Brand Templates
List available brand templates (requires Canva Enterprise):
```bash
curl -s "https://api.canva.com/rest/v1/brand-templates?limit=20" --header "Authorization: Bearer $CANVA_TOKEN" | jq '.items[] | {id, title, created_at}'
```
## Guidelines
- **Async jobs**: Export, import, upload, autofill, and resize operations are asynchronous. Start the job with POST, then poll the status with GET using the returned job ID until `status` is `success` or `failed`.
- **Pagination**: List endpoints return a `continuation` token. Pass it as a query parameter to get the next page of results.
- **Design URLs**: The `urls.edit_url` and `urls.view_url` fields in design responses are valid for 30 days.
- **Export URLs**: Download URLs from export jobs are valid for 24 hours.
- **Custom dimensions**: Width and height must be between 40 and 8000 pixels.
- **Asset uploads**: For binary file uploads, use `Content-Type: application/octet-stream` with an `Asset-Upload-Metadata` header containing base64-encoded name.
- **Rate limits**: Read endpoints: ~100 req/user. Write endpoints: ~20-30 req/user. Export polling: ~120 req/user.