Bulk-generating Canva design variants from a template via the Design API
Automate social media variants from one Canva template using OAuth, asynchronous job polling, and exact placeholder mapping—plus rate-limit and storage caveats.
27 Aug 2025, 02:00 UTC

The problem: one template, too many manual copies
A marketing team needs the same event graphic in ten languages and three aspect ratios. In the Canva editor, that means duplicating a master design, swapping text placeholders, and exporting each file by hand. It is slow, and a single missed placeholder ships the wrong brand message.
The useful takeaway: Canva's Design API can generate those variants programmatically from a single template, but the work is asynchronous. Your application submits a bulk job, receives a job ID, and polls a status endpoint until the designs are ready to export.
How bulk generation fits the API
Canva's Design API authenticates with OAuth 2.0. Your application requests an access token with the design:content:write scope, which permits creating and updating designs on behalf of a Canva user. OAuth 2.0 is an authorization framework that lets an app act for a user without handling their password.
A bulk create request sends a template ID and a set of variable mappings. Each variable name must match a placeholder in the master template exactly. The API returns a job ID rather than finished designs, because large batches are processed asynchronously. Asynchronous means the server works in the background while your client checks back for results.
Worked example: submit and poll a bulk job
Before running anything, register an OAuth application in the Canva Developer Portal and confirm that your account tier supports the bulk endpoints. You will need an access token and a template ID.
Example request structure; endpoint paths and field names vary by API version, so verify against the current reference:
POST /bulk-designs
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
{
"template_id": "TEMPLATE_ID",
"variables": [
{ "name": "headline", "value": "Summer Sale" },
{ "name": "price", "value": "$19" }
]
}
Where to run: a terminal, script, or CI runner with network access to Canva's API. Required permissions: the OAuth token must belong to a user who can access the template. Expected check: an accepted response containing a job ID. Relevant risk: HTTP 429 means you have hit a rate limit; pause and retry with exponential backoff instead of hammering the endpoint.
Next, poll the job status endpoint using the returned job ID:
GET /bulk-designs/JOB_ID
Authorization: Bearer ACCESS_TOKEN
Continue polling until the status reaches completed or failed. When complete, use the returned design IDs to export assets in PNG, JPG, PDF, or MP4, depending on the design type.
Limitations and diagnostic checks
- Exact placeholder matching: a mismapped or missing variable can cause silent defaults or job failure. Compare your variable names against the template's placeholder list before submitting.
- Asynchronous timing: completion is not instantaneous. Build a polling loop with a maximum timeout and do not assume results within seconds.
- Rate limits: exceeding an endpoint's limit returns HTTP 429. Limits vary by endpoint and account tier, so check current headers in the API reference.
- Storage consumption: generated designs count toward the connected Canva user's design and storage limits.
Rollback
Bulk creation changes state by writing designs to a user's account. If a batch produces the wrong variants, delete the unwanted designs through the Canva UI or the Design API delete endpoint before they consume quotas.
Verify before production
- Register an OAuth application in the Canva Developer Portal and request the
design:content:writescope. - Submit one bulk create request with a valid template ID and capture the job ID.
- Poll the status endpoint until
completedorfailed, then export one asset to confirm format and quality. - Review current rate-limit headers, pagination behavior, and supported export formats in the API reference.
Bulk template generation is practical when your variant count makes manual duplication expensive. Start with a single template and a small variable set, confirm the polling flow, and only then scale to larger batches.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.