Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deep debugging for Figma API issues: network analysis, response inspection, and support escalation. Use when standard troubleshooting fails, diagnosing intermittent failures, or preparing detailed evidence for Figma support. Trigger with phrases like "figma hard bug", "figma mystery error", "figma deep debug", "figma intermittent failure", "figma support ticket".
.claude/skills/jeremylongshore-figma-advanced-troubleshooting/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 156% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 171% | 0% |
Deep debugging techniques for complex Figma REST API issues that resist standard error handling: intermittent failures, unexpected response shapes, rate limit edge cases, and large file timeouts.
curl with verbose mode for network inspectionbash# Full HTTP request/response trace for a Figma API call curl -v -H "X-Figma-Token: ${FIGMA_PAT}" \ "https://api.figma.com/v1/files/${FIGMA_FILE_KEY}?depth=1" 2>&1 \ | tee figma-debug-trace.txt # Extract key diagnostic info: # - TLS version and cipher # - Response status and headers # - Timing breakdown curl -w " DNS: %{time_namelookup}s Connect: %{time_connect}s TLS: %{time_appconnect}s TTFB: %{time_starttransfer}s Total: %{time_total}s Size: %{size_download} bytes Status: %{http_code} " -s -o /dev/null \ -H "X-Figma-Token: ${FIGMA_PAT}" \ "https://api.figma.com/v1/files/${FIGMA_FILE_KEY}?depth=1"
typescript// Figma API responses can be unexpectedly shaped when: // - File is empty or newly created // - Nodes have been deleted between requests // - Plugin data is corrupted function validateFileResponse(data: any): string[] { const issues: string[] = []; if (!data.document) issues.push('Missing document root'); if (!data.document?.children?.length) issues.push('Document has no pages'); if (typeof data.name !== 'string') issues.push('Missing file name'); if (!data.version) issues.push('Missing version field'); // Check for null nodes (deleted between list and fetch) if (data.nodes) { for (const [id, node] of Object.entries(data.nodes)) { if (node === null) issues.push(`Null node: ${id} (deleted or invisible)`); } } // Check images response for null renders if (data.images) { for (const [id, url] of Object.entries(data.images)) { if (url === null) issues.push(`Image render failed for node: ${id}`); } } return issues; }
typescript// Problem: Figma rate limits are per-user, per-minute, but the exact // limit is not published and varies by plan tier and seat type. // Diagnostic: measure your actual limit by counting successful requests async function measureRateLimit(token: string): Promise<{ requestsMade: number; firstRateLimitAt: number | null; retryAfter: number | null; }> { let count = 0; let rateLimitAt: number | null = null; let retryAfter: number | null = null; // Make requests until rate limited (use a read-only endpoint) while (count < 200) { const res = await fetch('https://api.figma.com/v1/me', { headers: { 'X-Figma-Token': token }, }); if (res.status === 429) { rateLimitAt = count; retryAfter = parseInt(res.headers.get('Retry-After') || '0'); break; } count++; // Small delay to avoid instant burst await new Promise(r => setTimeout(r, 100)); } return { requestsMade: count, firstRateLimitAt: rateLimitAt, retryAfter }; }
typescript// Large Figma files (1000+ components) can cause: // - Response timeouts (>30s) // - Memory issues (100+ MB JSON) // - Rate limits from repeated retries // Strategy: chunk the file by page async function fetchLargeFileSafely(fileKey: string, token: string) { // 1. Get file metadata with depth=1 (just pages, not children) const meta = await fetch( `https://api.figma.com/v1/files/${fileKey}?depth=1`, { headers: { 'X-Figma-Token': token } } ).then(r => r.json()); console.log(`File: ${meta.name}, Pages: ${meta.document.children.length}`); // 2. Fetch each page's content individually const results = []; for (const page of meta.document.children) { console.log(`Fetching page: ${page.name} (${page.id})`); const pageData = await fetch( `https://api.figma.com/v1/files/${fileKey}/nodes?ids=${page.id}`, { headers: { 'X-Figma-Token': token } } ).then(r => r.json()); results.push({ pageId: page.id, pageName: page.name, data: pageData }); // Respect rate limits between page fetches await new Promise(r => setTimeout(r, 500)); } return results; }
markdown## Figma API Support Request **Account email:** [your-email] **Plan tier:** [Starter/Professional/Organization/Enterprise] **Endpoint:** [e.g., GET /v1/files/:key] **File key:** [file key, not sensitive] ### Issue Description [1-2 sentences describing the problem] ### Reproduction Steps 1. Call `GET https://api.figma.com/v1/files/FILE_KEY?depth=1` 2. Observe: [expected vs actual behavior] ### Diagnostic Data - HTTP status: [status code] - Response headers: [relevant headers, especially rate limit] - Response time: [from curl timing] - Frequency: [every time / intermittent / specific conditions] ### Request/Response (redacted)
curl -v -H "X-Figma-Token: REDACTED]" \ "https://api.figma.com/v1/files/FILE_KEY?depth=1"
HTTP/2 status] x-figma-rate-limit-type: value] retry-after: value]
### Environment
- Node.js: [version]
- OS: [os]
- Region: [your server region]
- Behind proxy: [yes/no]| Issue | Diagnostic | Solution | |-------|-----------|----------| | Intermittent 500s | Track frequency and timing | Log every request; report pattern to Figma | | Slow responses | curl timing breakdown | Check if DNS/TLS is the bottleneck | | Null image renders | Validate node visibility | Check node opacity and visibility in Figma | | Memory crash | Large file JSON | Use depth=1 + per-page /nodes calls |
A sync that "randomly fails" — verbose inspection (Step 1) shows it's not random:
bashcurl -sv -H "X-Figma-Token: ${FIGMA_PAT}" \ "https://api.figma.com/v1/files/${FIGMA_FILE_KEY}?depth=1" 2>&1 \ | /usr/bin/grep -E '^< (HTTP|retry-after|x-)'
text< HTTP/2 429 < retry-after: 47
The failures cluster at the top of each hour — a cron thundering herd, not flakiness. Fix per Step 3 (jitter + honor Retry-After).
A "works for small files, breaks for the design system" report is usually payload size — Step 4:
bashcurl -s -o /dev/null -w '%{size_download}\n' -H "X-Figma-Token: ${FIGMA_PAT}" \ "https://api.figma.com/v1/files/${FIGMA_FILE_KEY}" # 48731210 ← 48 MB full tree; switch to ?depth=1 + /nodes?ids=
Escalation packet for Figma support: references/support-escalation-template.md.
For load testing, see figma-load-scale.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 25,325 | 14,706 | -42% | 1 | 1 | 0% | 3,901 | 4,769 | +22% | 0 | 0 | — |
case-02 | fail→pass | 22,712 | 10,584 | -53% | 1 | 1 | 0% | 3,405 | 4,183 | +23% | 0 | 0 | — |
case-03 | pass→pass | 7,825 | 6,529 | -17% | 1 | 1 | 0% | 1,238 | 3,353 | +171% | 0 | 0 | — |
case-04 | pass→pass | 19,477 | 15,547 | -20% | 1 | 1 | 0% | 3,158 | 4,704 | +49% | 0 | 0 | — |
case-05 | pass→pass | 16,080 | 12,166 | -24% | 1 | 1 | 0% | 3,157 | 4,025 | +27% | 0 | 0 | — |
case-06 | pass→pass | 13,914 | 7,151 | -49% | 1 | 1 | 0% | 2,968 | 3,722 | +25% | 0 | 0 | — |
case-07 | pass→pass | 9,284 | 4,302 | -54% | 1 | 1 | 0% | 1,226 | 2,982 | +143% | 0 | 0 | — |
case-08 | fail→pass | 26,771 | 19,451 | -27% | 1 | 1 | 0% | 4,319 | 5,909 | +37% | 0 | 0 | — |
case-09 | pass→pass | 18,464 | 20,866 | +13% | 1 | 1 | 0% | 3,077 | 5,689 | +85% | 0 | 0 | — |
case-10 | pass→pass | 15,317 | 15,558 | +2% | 1 | 1 | 0% | 2,662 | 4,686 | +76% | 0 | 0 | — |
case-11 | pass→pass | 16,068 | 13,229 | -18% | 1 | 1 | 0% | 2,318 | 4,236 | +83% | 0 | 0 | — |
case-12 | pass→pass | 15,621 | 8,747 | -44% | 1 | 1 | 0% | 2,287 | 3,784 | +65% | 0 | 0 | — |
case-13 | pass→pass | 15,293 | 7,922 | -48% | 1 | 1 | 0% | 2,183 | 3,460 | +58% | 0 | 0 | — |
case-14 | fail→fail | 19,297 | 20,155 | +4% | 1 | 1 | 0% | 2,753 | 5,274 | +92% | 0 | 0 | — |
case-15 | pass→pass | 8,422 | 10,535 | +25% | 1 | 1 | 0% | 1,535 | 3,789 | +147% | 0 | 0 | — |
case-16 | fail→pass | 8,339 | 7,786 | -7% | 1 | 1 | 0% | 1,408 | 3,599 | +156% | 0 | 0 | — |
case-17 | fail→pass | 16,412 | 16,548 | +1% | 1 | 1 | 0% | 3,346 | 4,903 | +47% | 0 | 0 | — |
case-18 | pass→pass | 17,297 | 3,794 | -78% | 1 | 1 | 0% | 2,680 | 2,718 | +1% | 0 | 0 | — |
case-19 | pass→pass | 9,297 | 6,858 | -26% | 1 | 1 | 0% | 1,503 | 2,642 | +76% | 0 | 0 | — |
case-20 | pass→pass | 11,799 | 8,020 | -32% | 1 | 1 | 0% | 1,920 | 3,668 | +91% | 0 | 0 | — |
case-21 | pass→pass | 15,387 | 12,554 | -18% | 1 | 1 | 0% | 3,051 | 4,826 | +58% | 0 | 0 | — |
case-22 | pass→pass | 8,456 | 9,793 | +16% | 1 | 1 | 0% | 1,651 | 3,638 | +120% | 0 | 0 | — |
case-23 | pass→pass | 12,795 | 12,080 | -6% | 1 | 1 | 0% | 2,434 | 4,442 | +82% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +17 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.