Skills canva
Create, export, and manage Canva designs via the Connect API. Generate social posts, carousels, and graphics programmatically.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/abgohel/canva" ~/.claude/skills/openclaw-skills-canva && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/abgohel/canva" ~/.openclaw/skills/openclaw-skills-canva && rm -rf "$T"
manifest:
skills/abgohel/canva/SKILL.mdsource content
Canva Skill
Create, export, and manage Canva designs via the Connect API.
When to Use
- "Create an Instagram post about [topic]"
- "Export my Canva design as PNG"
- "List my recent designs"
- "Create a carousel from these points"
- "Upload this image to Canva"
Prerequisites
-
Create a Canva Integration:
- Go to https://www.canva.com/developers/
- Create a new integration
- Get your Client ID and Client Secret
-
Set Environment Variables:
export CANVA_CLIENT_ID="your_client_id" export CANVA_CLIENT_SECRET="your_client_secret" -
Authenticate (first time): Run the auth flow to get access tokens (stored in
)~/.canva/tokens.json
API Base URL
https://api.canva.com/rest/v1
Authentication
Canva uses OAuth 2.0. The skill handles token refresh automatically.
# Get access token (stored in ~/.canva/tokens.json) ACCESS_TOKEN=$(cat ~/.canva/tokens.json | jq -r '.access_token')
Core Operations
List Designs
curl -s "https://api.canva.com/rest/v1/designs" \ -H "Authorization: Bearer $ACCESS_TOKEN" | jq .
Get Design Details
curl -s "https://api.canva.com/rest/v1/designs/{designId}" \ -H "Authorization: Bearer $ACCESS_TOKEN" | jq .
Create Design from Template
curl -X POST "https://api.canva.com/rest/v1/autofills" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "brand_template_id": "TEMPLATE_ID", "data": { "title": {"type": "text", "text": "Your Title"}, "body": {"type": "text", "text": "Your body text"} } }'
Export Design
# Start export job curl -X POST "https://api.canva.com/rest/v1/exports" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "design_id": "DESIGN_ID", "format": {"type": "png", "width": 1080, "height": 1080} }' # Check export status curl -s "https://api.canva.com/rest/v1/exports/{jobId}" \ -H "Authorization: Bearer $ACCESS_TOKEN" | jq .
Upload Asset
curl -X POST "https://api.canva.com/rest/v1/asset-uploads" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/octet-stream" \ -H 'Asset-Upload-Metadata: {"name": "my-image.png"}' \ --data-binary @image.png
List Brand Templates
curl -s "https://api.canva.com/rest/v1/brand-templates" \ -H "Authorization: Bearer $ACCESS_TOKEN" | jq .
Export Formats
| Format | Options |
|---|---|
| PNG | width, height, lossless |
| JPG | width, height, quality (1-100) |
| standard, print | |
| MP4 | (for video designs) |
| GIF | (for animated designs) |
Common Workflows
Create Instagram Post
- List brand templates:
GET /brand-templates - Find Instagram post template
- Autofill with content:
POST /autofills - Export as PNG 1080x1080:
POST /exports - Download the exported file
Create Carousel
- Create multiple designs using autofill
- Export each as PNG
- Combine for posting
Batch Export
- List designs:
GET /designs - Loop through and export each
- Download all files
Rate Limits
- Most endpoints: 100 requests/minute
- Upload/Export: 30 requests/minute
Error Handling
Common errors:
- Token expired, refresh needed401
- Missing required scope403
- Rate limit exceeded429
- Design/template not found404
Scopes Required
- Read designsdesign:content:read
- Create/modify designsdesign:content:write
- Read assetsasset:read
- Upload assetsasset:write
- Read brand templatesbrandtemplate:content:read
Tips
- Use Brand Templates - Pre-designed templates are faster than creating from scratch
- Batch Operations - Group exports to avoid rate limits
- Cache Template IDs - Store commonly used template IDs locally
- Check Job Status - Exports are async; poll until complete
Resources
Built by Meow 😼 for the Moltbook community 🦞