Skip to content

Content Import Pipeline

Bulk import content into Canva designs using the Connect API.

Overview

The Connect API's asset upload and design import endpoints enable programmatic content ingestion.

Asset Upload Flow

javascript
// 1. Create upload job
const uploadJob = await fetch('https://api.canva.com/rest/v1/assets/upload', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${accessToken}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'my-asset.jpg',
    asset_type: 'image',
  }),
});

const { job_id } = await uploadJob.json();

// 2. Upload the file to the provided URL
// (Canva returns a pre-signed URL for direct upload)

// 3. Poll for completion
let asset;
while (!asset) {
  await sleep(1000);
  const statusRes = await fetch(
    `https://api.canva.com/rest/v1/assets/upload/${job_id}`,
    { headers: { 'Authorization': `Bearer ${accessToken}` } }
  );
  const status = await statusRes.json();
  if (status.status === 'success') {
    asset = status.asset;
  }
}

console.log('Asset ID:', asset.id);

Design Import Flow

Import an existing file (PDF, PPTX, etc.) as a Canva design:

javascript
const importJob = await fetch('https://api.canva.com/rest/v1/designs/import', {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${accessToken}` },
  // multipart form with the file
});

// Poll until complete, then use design_id

Batch Processing

For large volumes, implement a queue:

  1. Upload assets in parallel (up to 10 concurrent)
  2. Track job IDs
  3. Poll in batches
  4. Handle failures with retry logic
  5. Log all operations for auditing

Canva Developer Documentation SOP Site