# Canva Templates Scraper (`automation-lab/canva-templates-scraper`) Actor

Extract Canva template URLs, titles, preview images, creators, colors, fonts, dimensions, and rank data for design trend research.

- **URL**: https://apify.com/automation-lab/canva-templates-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Marketing
- **Stats:** 4 total users, 1 monthly users, 91.7% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $5.74 / 1,000 item extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Canva Templates Scraper

Extract Canva template search results, template URLs, titles, preview images, creators, colors, fonts, dimensions, and ranking metadata from public Canva template pages.

Use this Apify Actor to monitor Canva design niches, build inspiration catalogs, compare template trends, or enrich content planning workflows with structured template data.

### What does Canva Templates Scraper do?

Canva Templates Scraper turns Canva template search and category pages into a clean dataset.

It can start from search keywords such as `instagram post`, direct Canva template search URLs, category URLs, or individual public template URLs.

For fast list monitoring, it saves template URL, title, preview image, free label, source query, and rank.

For richer research, enable detail enrichment to open each template page and collect description, creator, dimensions, color palette, fonts, and breadcrumbs when Canva displays them.

### Who is it for?

- 🎨 Designers researching what Canva users see in a niche.
- 📣 Content marketers planning social media creative calendars.
- 🛒 Template sellers monitoring competitor styles and ranking movement.
- 📊 Trend researchers tracking colors, fonts, topics, and formats over time.
- 🧑‍💻 Data teams building internal design inspiration databases.

### Why use this actor?

Canva template pages are highly visual and hard to compare manually at scale.

This actor collects repeatable records so you can sort, export, deduplicate, and monitor templates across many topics.

It also records the source URL and rank, which is useful for recurring monitoring runs and before/after comparisons.

### Data you can extract

| Field | Description |
| --- | --- |
| `templateId` | Canva template identifier parsed from the URL. |
| `templateUrl` | Canonical public Canva template URL. |
| `title` | Template title from search cards or detail pages. |
| `description` | Template meta description when detail enrichment is enabled. |
| `previewImageUrl` | Preview image URL. |
| `creatorName` | Canva creator name when visible on the detail page. |
| `templateType` | Template format, such as Instagram Post. |
| `dimensions` | Pixel dimensions, such as 1080 × 1350 px. |
| `colors` | Visible hex color palette values. |
| `fonts` | Font names visible in the design details section. |
| `breadcrumbs` | Canva category breadcrumb trail. |
| `isFree` | Whether Canva labels the card as free. |
| `rank` | Position within the source page. |
| `sourceUrl` | URL that produced the item. |
| `sourceQuery` | Keyword source, if the item came from a keyword. |
| `scrapedAt` | ISO timestamp for the extraction. |

### How much does it cost to scrape Canva templates?

The actor uses pay-per-event pricing.

There is a small start fee per run and a per-template charge for each saved dataset item.

Current pricing is:

- Start event: `$0.07` per run.
- Template item event: tiered, with BRONZE at `$0.0095705` per saved template.

Large enriched runs cost more in proxy bandwidth because the actor opens each template detail page.

For cheaper trend monitoring, keep `includeDetails` disabled and collect details only for a shortlisted set of templates.

### Input options

#### `keywords`

Search phrases to query in Canva templates.

Example:

```json
["instagram post", "wedding invitation", "real estate flyer"]
```

#### `startUrls`

Direct Canva URLs to scrape.

Example:

```json
[{ "url": "https://www.canva.com/templates/search/instagram-post/" }]
```

#### `maxItems`

Total output cap across all sources.

Use a small value while testing.

#### `maxItemsPerSource`

Caps records per keyword or URL.

This keeps one broad query from consuming the whole run.

#### `includeDetails`

When enabled, the actor visits each template detail page to collect description, creator, colors, fonts, dimensions, and breadcrumbs.

#### `proxyConfiguration`

Canva frequently challenges datacenter traffic.

The default input uses Apify Residential proxy in the US for reliability.

### Example input

```json
{
  "keywords": ["instagram post"],
  "maxItems": 25,
  "maxItemsPerSource": 25,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

### Example enriched input

```json
{
  "keywords": ["wedding invitation"],
  "maxItems": 10,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

### Example output

```json
{
  "templateId": "EAGukbmI6EI",
  "templateUrl": "https://www.canva.com/templates/EAGukbmI6EI-beige-neutral-polaroid-collage-happy-birthday-instagram-post/",
  "title": "Beige Neutral Polaroid Collage Happy Birthday Instagram Post",
  "description": "Use this customizable Beige Neutral Polaroid Collage Happy Birthday Instagram Post template and find more professional designs from Canva.",
  "previewImageUrl": "https://template.canva.com/EAGukbmI6EI/1/0/1280w-zVDrNGoPRTo.jpg",
  "creatorName": "NassyArt",
  "templateType": "Instagram Post (4:5)",
  "dimensions": "1080 × 1350 px",
  "colors": ["#1d1c19", "#d5d3d0"],
  "fonts": ["Angella White"],
  "rank": 1,
  "sourceQuery": "instagram post"
}
```

### How to scrape Canva template search results

1. Add one or more Canva template keywords.
2. Keep `maxItems` small for the first test run.
3. Leave `includeDetails` off for fast rank monitoring.
4. Enable detail enrichment only when you need creator, colors, fonts, and dimensions.
5. Export the dataset as JSON, CSV, Excel, or via API.

### Tips for better results

- Use specific search phrases such as `minimalist resume`, `restaurant menu`, or `real estate instagram post`.
- Run the same keywords weekly to compare ranking changes.
- Use `maxItemsPerSource` when mixing broad and narrow keywords.
- Prefer list-only runs for large monitoring jobs.
- Use enriched runs for small research samples.

### Integrations

- Send results to Google Sheets for editorial planning.
- Store datasets in a BI warehouse to track visual trends.
- Use webhooks to alert when new top-ranked templates appear.
- Combine with content calendar tools to shortlist creative directions.
- Feed preview image URLs into internal inspiration boards.

### API usage: Node.js

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/canva-templates-scraper').call({
  keywords: ['instagram post'],
  maxItems: 25,
  includeDetails: false,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage: Python

```python
from apify_client import ApifyClient

client = ApifyClient('APIFY_TOKEN')
run = client.actor('automation-lab/canva-templates-scraper').call(run_input={
    'keywords': ['instagram post'],
    'maxItems': 25,
    'includeDetails': False,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### API usage: cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/automation-lab~canva-templates-scraper/runs?token=APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"keywords":["instagram post"],"maxItems":25,"includeDetails":false}'
```

### MCP usage

Use the Apify MCP server with this actor exposed as a tool:

```bash
https://mcp.apify.com/?tools=automation-lab/canva-templates-scraper
```

#### Claude Code

Add the hosted MCP endpoint over HTTP:

```bash
claude mcp add --transport http canva-templates-scraper "https://mcp.apify.com/?tools=automation-lab/canva-templates-scraper"
```

#### Claude Desktop, Cursor, and VS Code

Add this configuration to Claude Desktop's MCP settings, Cursor's MCP settings, or VS Code's MCP configuration:

```json
{
  "mcpServers": {
    "apify-canva-templates": {
      "url": "https://mcp.apify.com/?tools=automation-lab/canva-templates-scraper",
      "headers": {
        "Authorization": "Bearer ${APIFY_TOKEN}"
      }
    }
  }
}
```

Example prompts:

- "Scrape the top Canva templates for restaurant menu and summarize the most common colors."
- "Run Canva Templates Scraper for wedding invitation and return the first 20 preview URLs."
- "Compare two Canva template keywords and show which titles overlap."

### Anti-bot and proxy notes

Canva uses Cloudflare and may show a challenge page to automated traffic.

The actor detects common challenge markers and fails clearly rather than returning empty data.

Residential proxy is recommended and is enabled in the default input.

If a run fails with an anti-bot message, retry later, reduce `maxItems`, or try a different proxy country.

### Limitations

- Canva page layouts can change without notice.
- Detail enrichment is slower than list scraping.
- Some metadata, such as fonts or colors, appears only on detail pages.
- `isFree` is based on visible Canva labels and may be null when Canva does not expose the value.
- This actor does not log in to Canva or access private designs.

### Legality

This actor extracts publicly available Canva template page information.

You are responsible for using the data in compliance with Canva terms, copyright rules, privacy laws, and your own use case.

Do not use the actor to access private, paid, or account-only content that you are not authorized to view.

### Troubleshooting

#### Why did the run fail with a challenge message?

Canva served an anti-bot or Cloudflare page.

Use Apify Residential proxy, keep inputs smaller, and retry after a short delay.

#### Why are colors and fonts empty?

Colors and fonts are detail-page fields.

Enable `includeDetails` and use a smaller `maxItems` value.

#### Why did I get fewer items than requested?

A source page may have fewer visible template cards, may load slowly, or may have been blocked before the requested count was reached.

### Related scrapers

Related Automation Labs actors that can support nearby workflows:

- https://apify.com/automation-lab/pinterest-scraper for social creative inspiration.
- https://apify.com/automation-lab/google-shopping-scraper for product trend research.
- https://apify.com/automation-lab/website-change-monitor for recurring page monitoring.

### FAQ

#### Can it scrape my private Canva designs?

No. This actor is for public Canva template pages only.

#### Does it download template files?

No. It extracts metadata and preview URLs from public pages.

#### Can I monitor rankings over time?

Yes. Schedule recurring runs with the same keywords and compare `rank`, `templateUrl`, and `scrapedAt`.

#### Should I enable detail enrichment?

Enable it when you need creator, dimensions, colors, fonts, or descriptions.

Keep it disabled for cheaper high-volume rank monitoring.

### Changelog

- `0.1` Initial private build for keyword, URL, list, and optional detail extraction.

# Actor input Schema

## `keywords` (type: `array`):

Search phrases to look up in Canva templates. Each keyword is converted to a Canva template search URL.

## `startUrls` (type: `array`):

Optional Canva template search/category/template URLs, for example https://www.canva.com/templates/search/instagram-post/.

## `maxItems` (type: `integer`):

Maximum number of Canva templates to save across all sources.

## `maxItemsPerSource` (type: `integer`):

Caps how many templates are saved from each keyword or start URL.

## `includeDetails` (type: `boolean`):

Open each template detail page to extract description, creator, colors, fonts, dimensions, and breadcrumbs. This is slower and uses more proxy bandwidth.

## `proxyConfiguration` (type: `object`):

Canva usually blocks datacenter traffic. Residential proxy is enabled by default for reliable extraction.

## Actor input object example

```json
{
  "keywords": [
    "instagram post",
    "wedding invitation"
  ],
  "startUrls": [
    {
      "url": "https://www.canva.com/templates/search/instagram-post/"
    }
  ],
  "maxItems": 20,
  "maxItemsPerSource": 20,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "instagram post",
        "wedding invitation"
    ],
    "startUrls": [
        {
            "url": "https://www.canva.com/templates/search/instagram-post/"
        }
    ],
    "maxItems": 20,
    "maxItemsPerSource": 20,
    "includeDetails": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/canva-templates-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": [
        "instagram post",
        "wedding invitation",
    ],
    "startUrls": [{ "url": "https://www.canva.com/templates/search/instagram-post/" }],
    "maxItems": 20,
    "maxItemsPerSource": 20,
    "includeDetails": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/canva-templates-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "instagram post",
    "wedding invitation"
  ],
  "startUrls": [
    {
      "url": "https://www.canva.com/templates/search/instagram-post/"
    }
  ],
  "maxItems": 20,
  "maxItemsPerSource": 20,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call automation-lab/canva-templates-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/canva-templates-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kXhQGFOa5ePlWJWjf/builds/GhiO4MIajq1eBQjd1/openapi.json
