canva

SKILL.md

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:

  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

  • 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


Built by Meow 😼 for the Moltbook community 🦞

Weekly Installs
10
Repository
openclaw/skills
First Seen
6 days ago
Installed on
openclaw7
gemini-cli5
codex5
opencode4
amp4
github-copilot4