canva-advanced-troubleshooting
Apply Canva Connect API advanced debugging for hard-to-diagnose issues. Use when standard troubleshooting fails, investigating intermittent failures, or preparing evidence bundles for Canva developer support. Trigger with phrases like "canva hard bug", "canva mystery error", "canva impossible to debug", "difficult canva issue", "canva deep debug".
Best use case
canva-advanced-troubleshooting is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Apply Canva Connect API advanced debugging for hard-to-diagnose issues. Use when standard troubleshooting fails, investigating intermittent failures, or preparing evidence bundles for Canva developer support. Trigger with phrases like "canva hard bug", "canva mystery error", "canva impossible to debug", "difficult canva issue", "canva deep debug".
Teams using canva-advanced-troubleshooting should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/canva-advanced-troubleshooting/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How canva-advanced-troubleshooting Compares
| Feature / Agent | canva-advanced-troubleshooting | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Apply Canva Connect API advanced debugging for hard-to-diagnose issues. Use when standard troubleshooting fails, investigating intermittent failures, or preparing evidence bundles for Canva developer support. Trigger with phrases like "canva hard bug", "canva mystery error", "canva impossible to debug", "difficult canva issue", "canva deep debug".
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
Related Guides
AI Agents for Coding
Browse AI agent skills for coding, debugging, testing, refactoring, code review, and developer workflows across Claude, Cursor, and Codex.
Cursor vs Codex for AI Workflows
Compare Cursor and Codex for AI coding workflows, repository assistance, debugging, refactoring, and reusable developer skills.
Best AI Skills for Claude
Explore the best AI skills for Claude and Claude Code across coding, research, workflow automation, documentation, and agent operations.
SKILL.md Source
# Canva Advanced Troubleshooting
## Overview
Deep debugging for complex Canva Connect API issues — intermittent 5xx errors, stuck export jobs, OAuth token rotation failures, rate limit edge cases, and webhook delivery gaps.
## Systematic Layer Testing
```typescript
interface LayerTest {
layer: string;
test: () => Promise<{ pass: boolean; details: string; durationMs: number }>;
}
async function diagnoseCanvaIssue(token: string): Promise<void> {
const layers: LayerTest[] = [
{
layer: 'DNS',
test: async () => {
const start = Date.now();
try {
const { address } = await import('dns/promises').then(dns => dns.lookup('api.canva.com'));
return { pass: true, details: `Resolved to ${address}`, durationMs: Date.now() - start };
} catch (e: any) {
return { pass: false, details: e.message, durationMs: Date.now() - start };
}
},
},
{
layer: 'TLS',
test: async () => {
const start = Date.now();
try {
const res = await fetch('https://api.canva.com/rest/v1/users/me', {
method: 'HEAD',
signal: AbortSignal.timeout(5000),
});
return { pass: true, details: `TLS OK, HTTP ${res.status}`, durationMs: Date.now() - start };
} catch (e: any) {
return { pass: false, details: e.message, durationMs: Date.now() - start };
}
},
},
{
layer: 'Auth',
test: async () => {
const start = Date.now();
const res = await fetch('https://api.canva.com/rest/v1/users/me', {
headers: { 'Authorization': `Bearer ${token}` },
});
return {
pass: res.status === 200,
details: `HTTP ${res.status}${res.status === 401 ? ' — token expired' : ''}`,
durationMs: Date.now() - start,
};
},
},
{
layer: 'Scope: design:meta:read',
test: async () => {
const start = Date.now();
const res = await fetch('https://api.canva.com/rest/v1/designs?limit=1', {
headers: { 'Authorization': `Bearer ${token}` },
});
return {
pass: res.status === 200,
details: res.status === 403 ? 'Scope not granted' : `HTTP ${res.status}`,
durationMs: Date.now() - start,
};
},
},
{
layer: 'Scope: design:content:write',
test: async () => {
const start = Date.now();
const res = await fetch('https://api.canva.com/rest/v1/designs', {
method: 'POST',
headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ design_type: { type: 'custom', width: 100, height: 100 }, title: 'Diag Test' }),
});
return {
pass: res.status === 200,
details: res.status === 403 ? 'Scope not granted' : `HTTP ${res.status}`,
durationMs: Date.now() - start,
};
},
},
];
console.log('=== Canva Connect API Layer Diagnostics ===\n');
for (const { layer, test } of layers) {
const result = await test();
const icon = result.pass ? 'PASS' : 'FAIL';
console.log(`[${icon}] ${layer}: ${result.details} (${result.durationMs}ms)`);
if (!result.pass) {
console.log(` ^ First failure — layers below may fail due to this.\n`);
break;
}
}
}
```
## Export Job Debugging
```typescript
// Debug stuck or failed export jobs
async function debugExportJob(exportId: string, token: string): Promise<void> {
console.log(`\n=== Export Job Debug: ${exportId} ===`);
const startTime = Date.now();
let pollCount = 0;
while (Date.now() - startTime < 120000) { // 2 min max
pollCount++;
const res = await fetch(`https://api.canva.com/rest/v1/exports/${exportId}`, {
headers: { 'Authorization': `Bearer ${token}` },
});
const data = await res.json();
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
console.log(`[${elapsed}s] Poll #${pollCount}: status=${data.job.status}`);
if (data.job.status === 'success') {
console.log(`URLs (valid 24h): ${data.job.urls.length} files`);
data.job.urls.forEach((url: string, i: number) => console.log(` ${i + 1}. ${url.substring(0, 80)}...`));
return;
}
if (data.job.status === 'failed') {
console.error(`FAILED: ${data.job.error?.code} — ${data.job.error?.message}`);
console.error('Common causes:');
if (data.job.error?.code === 'license_required') {
console.error(' -> Design contains premium elements. User needs Canva Pro.');
} else if (data.job.error?.code === 'internal_failure') {
console.error(' -> Canva server error. Retry after a delay.');
}
return;
}
await new Promise(r => setTimeout(r, 3000));
}
console.error('Export timed out after 2 minutes. Possible causes:');
console.error(' - Very large or complex design');
console.error(' - Canva export service under load');
console.error(' - Video/animation exports take longer');
}
```
## Token Lifecycle Debugging
```typescript
async function debugTokenLifecycle(
clientId: string,
clientSecret: string,
refreshToken: string
): Promise<void> {
console.log('\n=== Token Lifecycle Debug ===');
// 1. Try to refresh
const basicAuth = Buffer.from(`${clientId}:${clientSecret}`).toString('base64');
const res = await fetch('https://api.canva.com/rest/v1/oauth/token', {
method: 'POST',
headers: {
'Authorization': `Basic ${basicAuth}`,
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams({
grant_type: 'refresh_token',
refresh_token: refreshToken,
}),
});
if (res.ok) {
const data = await res.json();
console.log(`[PASS] Token refresh successful`);
console.log(` Access token length: ${data.access_token.length} chars`);
console.log(` Expires in: ${data.expires_in} seconds (${(data.expires_in / 3600).toFixed(1)} hours)`);
console.log(` New refresh token: ${data.refresh_token ? 'YES (store this!)' : 'NO'}`);
} else {
const error = await res.json();
console.log(`[FAIL] Token refresh failed: ${error.error}`);
console.log(` Description: ${error.error_description}`);
console.log('');
console.log('Common causes:');
console.log(' - Refresh token already used (single-use)');
console.log(' - User revoked access to your integration');
console.log(' - Client credentials changed');
console.log(' - Integration was deleted');
console.log('');
console.log('Resolution: User must re-authorize via OAuth flow');
}
}
```
## Network-Level Debug
```bash
#!/bin/bash
# Capture low-level Canva API interaction
echo "=== Network Debug ==="
# DNS resolution time
echo -n "DNS: "
dig api.canva.com +short +time=5 | tail -1
# TCP + TLS timing
echo "Connection timing:"
curl -w "DNS: %{time_namelookup}s\nTCP: %{time_connect}s\nTLS: %{time_appconnect}s\nTotal: %{time_total}s\n" \
-o /dev/null -s \
-H "Authorization: Bearer $CANVA_ACCESS_TOKEN" \
"https://api.canva.com/rest/v1/users/me"
# HTTP/2 multiplexing check
echo -n "Protocol: "
curl -sI -H "Authorization: Bearer $CANVA_ACCESS_TOKEN" \
"https://api.canva.com/rest/v1/users/me" | grep -i "^http/"
```
## Support Escalation Template
```markdown
## Canva Developer Support Request
**Integration ID:** [from Canva dashboard]
**Severity:** P[1-4]
**Timestamp:** [ISO 8601 when issue first observed]
### Issue Summary
[1-2 sentence description]
### Steps to Reproduce
1. Call POST /v1/exports with design_id: DAVxxx
2. Poll GET /v1/exports/{jobId}
3. Job stays in_progress for > 5 minutes then returns internal_failure
### Expected vs Actual
- Expected: Export completes within 30s
- Actual: Fails with internal_failure after 5 minutes
### Evidence
- Layer diagnostics output (attached)
- Export job ID: EXPxxx
- Response body: { "job": { "status": "failed", "error": { ... } } }
### Environment
- Node.js 20.x
- Region: us-east-1
- Traffic: ~50 exports/hour
```
## Error Handling
| Issue | Cause | Solution |
|-------|-------|----------|
| Intermittent 5xx | Canva backend issue | Retry with backoff, file support ticket |
| Export stuck in_progress | Large design or server load | Increase timeout to 120s |
| Token refresh fails | Refresh token already used | Store new refresh token every time |
| Webhook not arriving | URL unreachable from Canva | Check HTTPS, firewall, ngrok |
## Resources
- [Canva API Reference](https://www.canva.dev/docs/connect/api-reference/)
- [Canva Changelog](https://www.canva.dev/docs/connect/changelog/)
- [Canva Developer Community](https://community.canva.dev/)
## Next Steps
For load testing, see `canva-load-scale`.Related Skills
windsurf-advanced-troubleshooting
Advanced Windsurf debugging for hard-to-diagnose IDE, Cascade, and indexing issues. Use when standard troubleshooting fails, Cascade produces consistently wrong output, or investigating deep configuration problems. Trigger with phrases like "windsurf deep debug", "windsurf mystery error", "windsurf impossible to fix", "cascade keeps failing", "windsurf advanced debug".
vercel-advanced-troubleshooting
Advanced debugging for hard-to-diagnose Vercel issues including cold starts, edge errors, and function tracing. Use when standard troubleshooting fails, investigating intermittent failures, or preparing evidence for Vercel support escalation. Trigger with phrases like "vercel hard bug", "vercel mystery error", "vercel intermittent failure", "difficult vercel issue", "vercel deep debug".
supabase-advanced-troubleshooting
Deep Supabase diagnostics: pg_stat_statements for slow queries, lock debugging with pg_locks, connection leak detection, RLS policy conflicts, Edge Function cold starts, and Realtime connection drop analysis. Use when standard troubleshooting fails, investigating performance regressions, debugging race conditions, or building evidence for Supabase support escalation. Trigger: "supabase deep debug", "supabase slow query", "supabase lock contention", "supabase connection leak", "supabase RLS conflict", "supabase cold start".
snowflake-advanced-troubleshooting
Apply advanced Snowflake debugging with query profiling, spill analysis, lock contention, and performance deep-dives using ACCOUNT_USAGE views. Use when standard troubleshooting fails, investigating slow queries, or diagnosing warehouse performance issues. Trigger with phrases like "snowflake hard bug", "snowflake slow query debug", "snowflake query profile", "snowflake spilling", "snowflake deep debug".
shopify-advanced-troubleshooting
Debug complex Shopify API issues using cost analysis, request tracing, webhook delivery inspection, and GraphQL introspection. Trigger with phrases like "shopify hard bug", "shopify mystery error", "shopify deep debug", "difficult shopify issue", "shopify intermittent failure".
sentry-advanced-troubleshooting
Advanced Sentry troubleshooting for complex SDK issues, silent event drops, source map failures, distributed tracing gaps, and SDK conflicts. Use when events silently disappear, source maps fail to resolve, traces break across service boundaries, or the SDK conflicts with other libraries like OpenTelemetry or winston. Trigger with phrases like "sentry events missing", "sentry source maps broken", "sentry debug", "sentry not capturing errors", "sentry tracing gaps", "sentry memory leak", "sentry sdk conflict".
salesforce-advanced-troubleshooting
Apply Salesforce advanced debugging with debug logs, SOQL query plans, and EventLogFile analysis. Use when standard troubleshooting fails, investigating SOQL performance issues, or analyzing Apex governor limit violations. Trigger with phrases like "salesforce hard bug", "salesforce debug log", "salesforce governor limit", "salesforce query plan", "salesforce deep debug", "SOQL slow".
retellai-advanced-troubleshooting
Retell AI advanced troubleshooting — AI voice agent and phone call automation. Use when working with Retell AI for voice agents, phone calls, or telephony. Trigger with phrases like "retell advanced troubleshooting", "retellai-advanced-troubleshooting", "voice agent".
replit-advanced-troubleshooting
Debug hard Replit issues: container lifecycle, Nix build failures, deployment crashes, and memory leaks. Use when standard troubleshooting fails, investigating intermittent failures, or diagnosing complex Replit platform behavior. Trigger with phrases like "replit hard bug", "replit mystery error", "replit impossible to debug", "replit intermittent", "replit deep debug".
perplexity-advanced-troubleshooting
Apply advanced debugging techniques for hard-to-diagnose Perplexity Sonar API issues. Use when standard troubleshooting fails, investigating inconsistent citations, or preparing evidence for support escalation. Trigger with phrases like "perplexity hard bug", "perplexity mystery error", "perplexity inconsistent results", "difficult perplexity issue", "perplexity deep debug".
notion-advanced-troubleshooting
Deep debugging for Notion API: response inspection, permission chain tracing, property type mismatches, pagination edge cases, and block nesting limits. Use when standard troubleshooting fails or investigating intermittent errors. Trigger with phrases like "notion deep debug", "notion permission trace", "notion property mismatch", "notion pagination bug", "notion nesting limit".
hubspot-advanced-troubleshooting
Debug complex HubSpot API issues with systematic isolation and evidence collection. Use when standard troubleshooting fails, investigating intermittent CRM errors, or preparing evidence bundles for HubSpot support escalation. Trigger with phrases like "hubspot hard bug", "hubspot mystery error", "hubspot intermittent failure", "hubspot deep debug", "hubspot support ticket".