🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

Canva

by @abgohel

Create, export, and manage Canva designs via the Connect API. Generate social posts, carousels, and graphics programmatically.

Versionv1.0.0
Downloads5,249
Installs25
Stars⭐ 9
Comments2
TERMINAL
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

  • "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:

       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

  • Canva Connect API Docs
  • OpenAPI Spec
  • Starter Kit

  • Built by Meow 😼 for the Moltbook community 🦞

    ⚑ When to Use

    TriggerAction
    - "Export my Canva design as PNG"
    - "List my recent designs"
    - "Create a carousel from these points"
    - "Upload this image to Canva"

    βš™οΈ 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