Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when writing code or instructions that call the Figma API (fetching files, nodes, or images, or choosing OAuth scopes): apply Figma's real authentication header, endpoint paths, query parameters, and current scope identifiers — which cheaper models get wrong by default.
.claude/skills/figma-rest-api-conventions/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 3 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.6-flashbest | +52% | +80% | 0% | 23 | 54d ago |
| gemini-3.5-flash | pending re-run | — | |||
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | — | — |
| case-09 | ✗→✓ | ▲ Improved | — | — |
| case-16 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-20 | ✗→✓ | ▲ Improved | — | — |
Emit Figma's real, current API surface whenever code or instructions call it: the correct auth header, host, versioned path, endpoints, query parameters, and OAuth scope identifiers. Apply this any time a task reads a file/nodes/images or selects scopes for an integration.
X-Figma-Token request header.Authorization: Bearer — that header carries an OAuth 2.0access token only. A PAT placed there is rejected with 403.
figd_.api.figma.com, and everydocumented endpoint lives under the /v1 path (e.g. https://api.figma.com/v1/...).
GET /v1/files/:file_key. By default this returns the entiredocument tree. To bound the payload, pass the depth query parameter — a positive integer — e.g. ?depth=1 returns only the top level (pages), ?depth=2 one more level down.
GET /v1/files/:file_key/nodes with a required ids queryparameter (comma-separated node IDs). Use this instead of downloading the full file when only certain nodes are needed. The IDs go in the query string, never in path segments.
GET /v1/images/:file_key with an ids query parameter naming thenodes to render (optional format, scale control the output). There is no /v1/files/:key/images path.
resource:action, joined by a singlecolon. The ones the base most often needs:
file_content:read — read a file's contents (document, nodes, editor type).file_comments:read / file_comments:write — read / post comments.file_variables:read / file_variables:write — read / write variables.file_versions:read — read version history.file_dev_resources:read — read dev resources.projects:read, webhooks:read / webhooks:write.files:read is deprecated — never request it for a new integration; usefile_content:read for file-content read access.
curl -H "Authorization: Bearer $FIGTOK" https://api.figma.com/v1/files/ZZ9curl -H "X-Figma-Token: $FIGTOK" https://api.figma.com/v1/files/ZZ9GET /v1/files/ZZ9 (returns the full tree, then discard most of it)GET /v1/files/ZZ9?depth=1GET /v1/files/ZZ9 then walk the JSON to find 9:1 and 9:7GET /v1/files/ZZ9/nodes?ids=9:1,9:7GET /v1/files/ZZ9/images/9:1GET /v1/images/ZZ9?ids=9:1&format=pngfiles:readfile_content:read (files:read is deprecated)file:read / read:files / files.readfile_content:readAuthorization: Bearer;a PAT always uses X-Figma-Token. Do not mix them.
depth is get-file only. The nodes endpoint already returns a bounded subtree perrequested id, so depth applies to GET /v1/files/:key, not to /nodes.
ids is required on both /nodes and /images. Omitting it is an error, not"return everything."
api.figma.com replaced by api.figma-gov.com; thepaths, headers, and scopes are otherwise identical.
figd_; tokens issued nowalways carry it, so a leak scanner should anchor on figd_.
X-Figma-Token. DON'T send a PAT in Authorization: Bearer.Authorization: Bearer for an OAuth 2.0 access token. DON'T use it for a PAT.file_content:read to read file contents. DON'T request the deprecated files:read.resource:action with a colon. DON'T use file.read,read/files, or read_files.
depth to bound a large get-file response. DON'T pull the whole tree to keep a slice./v1/files/:key/nodes?ids=. DON'T invent /v1/nodes/:id./v1/images/:key?ids=. DON'T use /v1/files/:key/images.Authorization: Bearer for a personal access token (that header is OAuth-only).file:read, read:files, files.read, read_files — instead ofthe real file_content:read.
files:read scope./v1 from the path or using a wrong host.depth or hitting the nodes endpoint./nodes/9:1) instead of the ids query parameter.X-Figma-Token; OAuth token in Authorization: Bearer.api.figma.com, every path under /v1.depth (positive integer).GET /v1/files/:key/nodes?ids=....GET /v1/images/:key?ids=....file_content:read, not the deprecated files:read.resource:action with a colon.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
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 +52 percentage points is the difference between those two pass rates over the 23 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.5-flash | verified | 7/9/2026 | +33% |
Other measured skills in the registry, with their headline benchmark lift.