Skip to main content
figma-data-handling Handle Figma API data correctly: comments, versions, user data, and privacy compliance.
Use when working with Figma comments API, version history,
or ensuring GDPR compliance for Figma user data.
Trigger with phrases like "figma data", "figma comments",
"figma versions", "figma GDPR", "figma user data".
설치로 이동 Skills Marketplace 커뮤니티가 만든 AI 스킬을 발견하고 탐색하세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/jeremylongshore/claude-code-plugins-plus-skills --skill figma-data-handling명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
Zip 다운로드 다운로드 중... 이 저장소의 다른 Skills Implement user sign-up and sign-in flows with Clerk.
Use when building authentication UI, customizing sign-in experience,
or implementing OAuth social login.
Trigger with phrases like "clerk sign-in", "clerk sign-up",
"clerk login flow", "clerk OAuth", "clerk social login".
Implement session management and middleware with Clerk.
Use when managing user sessions, configuring route protection,
or implementing token refresh and custom JWT templates.
Trigger with phrases like "clerk session", "clerk middleware",
"clerk route protection", "clerk token", "clerk JWT".
Configure enterprise SSO, role-based access control, and organization management.
Use when implementing SSO integration, configuring role-based permissions,
or setting up organization-level controls.
Trigger with phrases like "clerk SSO", "clerk RBAC",
"clerk enterprise", "clerk roles", "clerk permissions", "clerk organizations".
jeremylongshore
jeremylongshore/claude-code-plugins-plus-skills
GitHub 저장소 열기 name figma-data-handling description Handle Figma API data correctly: comments, versions, user data, and privacy compliance.
Use when working with Figma comments API, version history,
or ensuring GDPR compliance for Figma user data.
Trigger with phrases like "figma data", "figma comments",
"figma versions", "figma GDPR", "figma user data".
allowed-tools Read, Write, Edit version 1.6.0 license MIT author Jeremy Longshore <jeremy@intentsolutions.io> tags ["saas","figma"] compatibility Designed for Claude Code
Figma Data Handling
Overview
Work with Figma's data APIs: comments, version history, and user information. Handle sensitive data correctly with redaction and privacy compliance.
Prerequisites
FIGMA_PAT with appropriate scopes (file_comments:read/write, file_versions:read)
Understanding of GDPR/CCPA basics
Instructions
Step 1: Comments API
const PAT = process.env .FIGMA_PAT !;
const FILE_KEY = process.env .FIGMA_FILE_KEY !;
async function getComments (fileKey : string ) {
const res = await fetch (
`https://api.figma.com/v1/files/${fileKey} /comments` ,
{ headers : { 'X-Figma-Token' : PAT } }
);
const data = await res.json ();
return data.comments ;
}
async function getCommentsAsMarkdown (fileKey : string ) {
const res = (
,
{ : { : } }
);
( res. ()). ;
}
( ) {
: = { message };
(nodeId) {
body. = { : nodeId };
}
res = (
,
{
: ,
: {
: ,
: ,
},
: . (body),
}
);
res. ();
}
( ) {
(
,
{
: ,
: {
: ,
: ,
},
: . ({ emoji }),
}
). ( r. ());
}
await
fetch
`https://api.figma.com/v1/files/${fileKey} /comments?as_md=true`
headers
'X-Figma-Token'
PAT
return
await
json
comments
async
function
postComment
fileKey : string , message : string , nodeId ?: string
const
body
any
if
client_meta
node_id
const
await
fetch
`https://api.figma.com/v1/files/${fileKey} /comments`
method
'POST'
headers
'X-Figma-Token'
PAT
'Content-Type'
'application/json'
body
JSON
stringify
return
json
async
function
reactToComment
fileKey : string , commentId : string , emoji : string
return
fetch
`https://api.figma.com/v1/files/${fileKey} /comments/${commentId} /reactions`
method
'POST'
headers
'X-Figma-Token'
PAT
'Content-Type'
'application/json'
body
JSON
stringify
then
r =>
json
Step 2: Version History API
async function getVersionHistory (fileKey : string ) {
const res = await fetch (
`https://api.figma.com/v1/files/${fileKey} /versions` ,
{ headers : { 'X-Figma-Token' : PAT } }
);
const data = await res.json ();
return data.versions ;
}
async function getAllVersions (fileKey : string ) {
const versions : any [] = [];
let url : string | null = `https://api.figma.com/v1/files/${fileKey} /versions` ;
while (url) {
const res = await fetch (url, { headers : { 'X-Figma-Token' : PAT } });
const data = await res.json ();
versions.push (...data.versions );
url = data.pagination ?.next_page
? `https://api.figma.com/v1/files/${fileKey} /versions?before=${data.pagination.next_page} `
: null ;
}
return versions;
}
Step 3: User Data and Privacy
interface FigmaUser {
id : string ;
handle : string ;
img_url : string ;
email : string ;
}
function redactFigmaUser (user : FigmaUser ): Omit <FigmaUser , 'email' > & { email : string } {
return {
...user,
email : '[REDACTED]' ,
img_url : '[REDACTED]' ,
};
}
interface DataClassification {
field : string ;
sensitivity : 'public' | 'internal' | 'pii' ;
handling : string ;
}
const figmaDataClassification : DataClassification [] = [
{ field : 'user.email' , sensitivity : 'pii' , handling : 'Encrypt at rest, redact in logs' },
{ field : 'user.handle' , sensitivity : 'internal' , handling : 'Do not expose to unauthorized users' },
{ field : 'user.img_url' , sensitivity : 'pii' , handling : 'Do not cache without consent' },
{ field : 'file.name' , sensitivity : 'internal' , handling : 'Standard handling' },
{ field : 'comment.message' , sensitivity : 'internal' , handling : 'May contain PII -- scan before storing' },
{ field : 'PAT token' , sensitivity : 'pii' , handling : 'Never log, never store in code' },
];
Step 4: Data Retention
interface CachedFigmaData {
data : any ;
fetchedAt : Date ;
expiresAt : Date ;
}
function createCacheEntry (data : any , ttlMs : number ): CachedFigmaData {
const now = new Date ();
return {
data,
fetchedAt : now,
expiresAt : new Date (now.getTime () + ttlMs),
};
}
async function cleanupExpiredData (db : any ) {
const now = new Date ();
const deleted = await db.figmaCache .deleteMany ({
expiresAt : { $lt : now },
});
console .log (`Cleaned up ${deleted.count} expired Figma cache entries` );
}
Step 5: Safe Logging
const REDACT_FIELDS = ['email' , 'img_url' , 'access_token' , 'refresh_token' ];
function safeFigmaLog (label : string , data : any ) {
const safe = JSON .parse (JSON .stringify (data));
function redact (obj : any ) {
for (const key of Object .keys (obj)) {
if (REDACT_FIELDS .includes (key)) {
obj[key] = '[REDACTED]' ;
} else if (typeof obj[key] === 'object' && obj[key] !== null ) {
redact (obj[key]);
}
}
}
redact (safe);
console .log (`[figma] ${label} :` , JSON .stringify (safe));
}
Output
Comments fetched and posted via REST API
Version history retrieved with pagination
PII redacted before logging and storage
Data retention policies applied
Error Handling Error Cause Solution 403 on comments Missing file_comments:read scope Regenerate PAT with scope Empty version history New file with no saved versions Create a named version in Figma first PII in logs Missing redaction Apply safeFigmaLog wrapper Stale image URLs URLs older than 30 days Re-export images; do not cache URLs long-term
Examples Pull the latest comments as Markdown and post a reaction (Step 1 Comments API):
curl -s -H "X-Figma-Token: ${FIGMA_PAT} " \
"https://api.figma.com/v1/files/${FIGMA_FILE_KEY} /comments?as_md=true" \
| jq -r '.comments[0] | "\(.user.handle): \(.message)"'
Walk version history with pagination (Step 2):
curl -s -H "X-Figma-Token: ${FIGMA_PAT} " \
"https://api.figma.com/v1/files/${FIGMA_FILE_KEY} /versions" \
| jq '{versions: [.versions[] | {id, created_at, label}], next: .pagination.next_page}'
PII rules for what you may persist from these payloads (user handles, avatars, emails): references/user-data-and-privacy.md and references/safe-logging.md.
Resources
Next Steps For enterprise access control, see figma-enterprise-rbac.