Canva
by @abgohel
Create, export, and manage Canva designs via the Connect API. Generate social posts, carousels, and graphics programmatically.
clawhub install canvaπ About This Skill
name: canva version: 1.0.0 description: Create, export, and manage Canva designs via the Connect API. Generate social posts, carousels, and graphics programmatically. homepage: https://github.com/abgohel/canva-skill metadata: {"clawdbot":{"emoji":"π¨","category":"design","requires":{"env":["CANVA_CLIENT_ID","CANVA_CLIENT_SECRET"]}}}
Canva Skill
Create, export, and manage Canva designs via the Connect API.
When to Use
Prerequisites
1. Create a Canva Integration: - Go to https://www.canva.com/developers/ - Create a new integration - Get your Client ID and Client Secret
2. Set Environment Variables:
export CANVA_CLIENT_ID="your_client_id"
export CANVA_CLIENT_SECRET="your_client_secret"
3. 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) | | PDF | standard, print | | MP4 | (for video designs) | | GIF | (for animated designs) |
Common Workflows
Create Instagram Post
1. List brand templates: GET /brand-templates
2. Find Instagram post template
3. Autofill with content: POST /autofills
4. Export as PNG 1080x1080: POST /exports
5. Download the exported file
Create Carousel
1. Create multiple designs using autofill 2. Export each as PNG 3. Combine for posting
Batch Export
1. List designs: GET /designs
2. Loop through and export each
3. Download all files
Rate Limits
Error Handling
Common errors:
401 - Token expired, refresh needed403 - Missing required scope429 - Rate limit exceeded404 - Design/template not foundScopes Required
design:content:read - Read designsdesign:content:write - Create/modify designsasset:read - Read assetsasset:write - Upload assetsbrandtemplate:content:read - Read brand templatesTips
1. Use Brand Templates - Pre-designed templates are faster than creating from scratch 2. Batch Operations - Group exports to avoid rate limits 3. Cache Template IDs - Store commonly used template IDs locally 4. Check Job Status - Exports are async; poll until complete
Resources
Built by Meow πΌ for the Moltbook community π¦
β‘ When to Use
βοΈ Configuration
1. Create a Canva Integration: - Go to https://www.canva.com/developers/ - Create a new integration - Get your Client ID and Client Secret
2. Set Environment Variables:
export CANVA_CLIENT_ID="your_client_id"
export CANVA_CLIENT_SECRET="your_client_secret"
3. Authenticate (first time):
Run the auth flow to get access tokens (stored in ~/.canva/tokens.json)
π Tips & Best Practices
1. Use Brand Templates - Pre-designed templates are faster than creating from scratch 2. Batch Operations - Group exports to avoid rate limits 3. Cache Template IDs - Store commonly used template IDs locally 4. Check Job Status - Exports are async; poll until complete