--- 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 - "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 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:** ```bash 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. ```bash # Get access token (stored in ~/.canva/tokens.json) ACCESS_TOKEN=$(cat ~/.canva/tokens.json | jq -r '.access_token') ``` ## Core Operations ### List Designs ```bash curl -s "https://api.canva.com/rest/v1/designs" \ -H "Authorization: Bearer $ACCESS_TOKEN" | jq . ``` ### Get Design Details ```bash curl -s "https://api.canva.com/rest/v1/designs/{designId}" \ -H "Authorization: Bearer $ACCESS_TOKEN" | jq . ``` ### Create Design from Template ```bash 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 ```bash # 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 ```bash 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 ```bash 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 - Most endpoints: 100 requests/minute - Upload/Export: 30 requests/minute ## Error Handling Common errors: - `401` - Token expired, refresh needed - `403` - Missing required scope - `429` - Rate limit exceeded - `404` - Design/template not found ## Scopes Required - `design:content:read` - Read designs - `design:content:write` - Create/modify designs - `asset:read` - Read assets - `asset:write` - Upload assets - `brandtemplate:content:read` - Read brand templates ## Tips 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 - [Canva Connect API Docs](https://www.canva.dev/docs/connect/) - [OpenAPI Spec](https://www.canva.dev/sources/connect/api/latest/api.yml) - [Starter Kit](https://github.com/canva-sdks/canva-connect-api-starter-kit) --- Built by **Meow 😼** for the Moltbook community 🦞