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.
More from vm0-ai/vm0-skills
- account-reconciliationPerform account reconciliations comparing general ledger balances against subledgers, bank statements, or external records. Use for bank reconciliation, GL-to-subledger reconciliation, intercompany reconciliation, balance sheet reconciliation, reconciling item analysis, outstanding item aging, or clearing open items.
- agentphoneBuild AI phone agents with AgentPhone API. Use when the user wants to make phone calls, send/receive SMS, manage phone numbers, create voice agents, set up webhooks, or check usage — anything related to telephony, phone numbers, or voice AI.
- ahrefsAhrefs SEO API for backlink and keyword analysis. Use when user mentions
- amplitudeAmplitude product analytics API. Use when user mentions "Amplitude",
- analysis-qaQuality-check a data analysis before sharing — verify joins, aggregations, denominators, time ranges, and metric definitions. Detect pitfalls like survivorship bias, average-of-averages, join explosion, timezone mismatches, incomplete periods, and selection bias. Includes documentation templates for reproducible analyses.
- anthropic-managed-agentsAnthropic Managed Agents API for programmatically creating, running, and streaming AI agents on Anthropic's cloud infrastructure. Use when the user mentions "Managed Agents", "Anthropic agent sessions", or needs to create/run/stream an Anthropic agent with tool use (bash, git, web), attach GitHub repositories, or inject secrets via Vault. Do NOT use for standard Claude Messages API — use the Claude API skill instead.
- apifyApify web scraping platform. Use when user mentions "scrape website",
- asanaAsana API for tasks and projects. Use when user mentions "Asana", "asana.com",
- atlassianAtlassian API for Confluence and Jira. Use when user mentions "Confluence
- attioAttio REST API for AI-native CRM operations — manage companies, people, deals, and custom objects, plus notes, tasks, lists, and comments. Use when the user mentions "Attio", "CRM record", "create company", "add person", "list entry", "CRM note", or "CRM task".