[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M78XT9ZP3CWHYVBMV0RAYXEY":3,"skill-same:01M78XT9ZP3CWHYVBMV0RAYXEY":56},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":33,"commitSha":34,"skillDirectory":35,"forksCount":36,"repositoryHtmlUrl":37,"repositoryHomepageUrl":6,"ownerHtmlUrl":38,"ownerBlogUrl":39,"ownerDescription":40,"updatedAt":41,"install":42,"resources":55},"01M78XT9ZP3CWHYVBMV0RAYXEY","canva-cost-tuning",null,"Optimize Canva Connect API usage costs through efficient API patterns and monitoring.\nUse when analyzing Canva API usage, reducing unnecessary calls,\nor implementing usage monitoring and budget tracking.\nTrigger with phrases like \"canva cost\", \"canva usage\",\n\"reduce canva calls\", \"canva API efficiency\", \"canva budget\".","jukeyman\u002Fjukeyman-skills","jukeyman","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F142960420?v=4","01M78FR4Y3DHMMCBCC0GXXNB3F","RICK JEFFERSON","01M78FR4Z8RVQRAD31Y5J7V6EB",1,"MIT","https:\u002F\u002Fgithub.com\u002Fjukeyman\u002Fjukeyman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fsaas-packs--canva-pack--canva-cost-tuning\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: canva-cost-tuning\ndescription: |\n  Optimize Canva Connect API usage costs through efficient API patterns and monitoring.\n  Use when analyzing Canva API usage, reducing unnecessary calls,\n  or implementing usage monitoring and budget tracking.\n  Trigger with phrases like \"canva cost\", \"canva usage\",\n  \"reduce canva calls\", \"canva API efficiency\", \"canva budget\".\nallowed-tools: Read, Grep\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ntags: [saas, design, canva]\ncompatible-with: claude-code\n---\n\n# Canva Cost Tuning\n\n## Overview\n\nOptimize Canva Connect API usage. While the Connect API itself is free to call, rate limits constrain throughput. Canva Enterprise (required for autofill) has per-seat licensing costs. Optimize by reducing unnecessary calls, caching effectively, and batching operations.\n\n## Canva Pricing Model\n\n| Tier | Cost | Connect API Access | Autofill API | Brand Templates |\n|------|------|-------------------|--------------|-----------------|\n| Canva Free | $0\u002Fuser | Yes | No | No |\n| Canva Pro | $15\u002Fuser\u002Fmo | Yes | No | No |\n| Canva Teams | $10\u002Fuser\u002Fmo (5+) | Yes | No | Limited |\n| Canva Enterprise | Custom | Yes | Yes | Yes |\n\n**Key insight:** The REST API is free — costs come from Canva subscriptions. Autofill and brand template APIs require Enterprise.\n\n## API Call Reduction Strategies\n\n### Cache Design Metadata\n\n```typescript\n\u002F\u002F Design metadata rarely changes — cache aggressively\n\u002F\u002F Save: ~100 GET \u002Fdesigns\u002F{id} calls\u002Fmin per user\nconst designMetadata = await cachedCanvaCall(\n  `design:${designId}`,\n  () => canvaAPI(`\u002Fdesigns\u002F${designId}`, token),\n  300 \u002F\u002F 5 min TTL\n);\n```\n\n### Avoid Redundant Exports\n\n```typescript\n\u002F\u002F Track exported designs to prevent duplicate exports\nclass ExportTracker {\n  private exportedDesigns = new Map\u003Cstring, { urls: string[]; expiresAt: number }>();\n\n  async exportIfNeeded(designId: string, format: object, token: string): Promise\u003Cstring[]> {\n    const cached = this.exportedDesigns.get(designId);\n    \u002F\u002F Export URLs valid for 24 hours — reuse if still valid\n    if (cached && Date.now() \u003C cached.expiresAt) {\n      return cached.urls;\n    }\n\n    const { job } = await canvaAPI('\u002Fexports', token, {\n      method: 'POST',\n      body: JSON.stringify({ design_id: designId, format }),\n    });\n    const urls = await pollExport(job.id, token);\n\n    this.exportedDesigns.set(designId, {\n      urls,\n      expiresAt: Date.now() + 23 * 60 * 60 * 1000, \u002F\u002F 23 hours (1h buffer)\n    });\n\n    return urls;\n  }\n}\n```\n\n### Pagination with Early Exit\n\n```typescript\n\u002F\u002F Stop listing when you find what you need\nasync function findDesignByTitle(title: string, token: string): Promise\u003Cany | null> {\n  let continuation: string | undefined;\n\n  do {\n    const params = new URLSearchParams({\n      query: title,  \u002F\u002F Use server-side search instead of client filtering\n      limit: '25',\n      ...(continuation && { continuation }),\n    });\n\n    const data = await canvaAPI(`\u002Fdesigns?${params}`, token);\n    const match = data.items.find((d: any) => d.title === title);\n    if (match) return match; \u002F\u002F Early exit — don't fetch remaining pages\n\n    continuation = data.continuation;\n  } while (continuation);\n\n  return null;\n}\n```\n\n## Usage Monitoring\n\n```typescript\nclass CanvaUsageTracker {\n  private calls: Map\u003Cstring, number> = new Map();\n\n  track(endpoint: string): void {\n    const key = `${new Date().toISOString().slice(0, 13)}:${endpoint}`; \u002F\u002F Hourly bucket\n    this.calls.set(key, (this.calls.get(key) || 0) + 1);\n  }\n\n  report(): { endpoint: string; callsPerHour: number }[] {\n    const hourly: Record\u003Cstring, number> = {};\n    for (const [key, count] of this.calls) {\n      const endpoint = key.split(':').slice(1).join(':');\n      hourly[endpoint] = (hourly[endpoint] || 0) + count;\n    }\n    return Object.entries(hourly)\n      .map(([endpoint, callsPerHour]) => ({ endpoint, callsPerHour }))\n      .sort((a, b) => b.callsPerHour - a.callsPerHour);\n  }\n}\n```\n\n## Optimization Checklist\n\n- [ ] Design metadata cached (5+ min TTL)\n- [ ] Brand template list cached (1+ hour TTL)\n- [ ] Export URLs reused within 24-hour window\n- [ ] Pagination uses `query` parameter for server-side search\n- [ ] Thumbnail URLs refreshed only when displayed (15-min expiry)\n- [ ] Asset uploads deduplicated (don't re-upload same file)\n- [ ] Autofill results cached by template+data hash\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Rate limits hit frequently | Too many calls | Add caching layer |\n| Export quota exceeded | Duplicate exports | Track and reuse URLs |\n| Autofill not available | Not Enterprise tier | Upgrade Canva plan |\n| Slow list queries | No search filter | Use `query` parameter |\n\n## Resources\n\n- [Canva Pricing](https:\u002F\u002Fwww.canva.com\u002Fpricing\u002F)\n- [Canva Enterprise](https:\u002F\u002Fwww.canva.com\u002Fenterprise\u002F)\n- [API Rate Limits](https:\u002F\u002Fwww.canva.dev\u002Fdocs\u002Fconnect\u002Fapi-requests-responses\u002F)\n\n## Next Steps\n\nFor architecture patterns, see `canva-reference-architecture`.\n","# Canva Cost Tuning\n\n## Overview\n\nOptimize Canva Connect API usage. While the Connect API itself is free to call, rate limits constrain throughput. Canva Enterprise (required for autofill) has per-seat licensing costs. Optimize by reducing unnecessary calls, caching effectively, and batching operations.\n\n## Canva Pricing Model\n\n| Tier | Cost | Connect API Access | Autofill API | Brand Templates |\n|------|------|-------------------|--------------|-----------------|\n| Canva Free | $0\u002Fuser | Yes | No | No |\n| Canva Pro | $15\u002Fuser\u002Fmo | Yes | No | No |\n| Canva Teams | $10\u002Fuser\u002Fmo (5+) | Yes | No | Limited |\n| Canva Enterprise | Custom | Yes | Yes | Yes |\n\n**Key insight:** The REST API is free — costs come from Canva subscriptions. Autofill and brand template APIs require Enterprise.\n\n## API Call Reduction Strategies\n\n### Cache Design Metadata\n\n```typescript\n\u002F\u002F Design metadata rarely changes — cache aggressively\n\u002F\u002F Save: ~100 GET \u002Fdesigns\u002F{id} calls\u002Fmin per user\nconst designMetadata = await cachedCanvaCall(\n  `design:${designId}`,\n  () => canvaAPI(`\u002Fdesigns\u002F${designId}`, token),\n  300 \u002F\u002F 5 min TTL\n);\n```\n\n### Avoid Redundant Exports\n\n```typescript\n\u002F\u002F Track exported designs to prevent duplicate exports\nclass ExportTracker {\n  private exportedDesigns = new Map\u003Cstring, { urls: string[]; expiresAt: number }>();\n\n  async exportIfNeeded(designId: string, format: object, token: string): Promise\u003Cstring[]> {\n    const cached = this.exportedDesigns.get(designId);\n    \u002F\u002F Export URLs valid for 24 hours — reuse if still valid\n    if (cached && Date.now() \u003C cached.expiresAt) {\n      return cached.urls;\n    }\n\n    const { job } = await canvaAPI('\u002Fexports', token, {\n      method: 'POST',\n      body: JSON.stringify({ design_id: designId, format }),\n    });\n    const urls = await pollExport(job.id, token);\n\n    this.exportedDesigns.set(designId, {\n      urls,\n      expiresAt: Date.now() + 23 * 60 * 60 * 1000, \u002F\u002F 23 hours (1h buffer)\n    });\n\n    return urls;\n  }\n}\n```\n\n### Pagination with Early Exit\n\n```typescript\n\u002F\u002F Stop listing when you find what you need\nasync function findDesignByTitle(title: string, token: string): Promise\u003Cany | null> {\n  let continuation: string | undefined;\n\n  do {\n    const params = new URLSearchParams({\n      query: title,  \u002F\u002F Use server-side search instead of client filtering\n      limit: '25',\n      ...(continuation && { continuation }),\n    });\n\n    const data = await canvaAPI(`\u002Fdesigns?${params}`, token);\n    const match = data.items.find((d: any) => d.title === title);\n    if (match) return match; \u002F\u002F Early exit — don't fetch remaining pages\n\n    continuation = data.continuation;\n  } while (continuation);\n\n  return null;\n}\n```\n\n## Usage Monitoring\n\n```typescript\nclass CanvaUsageTracker {\n  private calls: Map\u003Cstring, number> = new Map();\n\n  track(endpoint: string): void {\n    const key = `${new Date().toISOString().slice(0, 13)}:${endpoint}`; \u002F\u002F Hourly bucket\n    this.calls.set(key, (this.calls.get(key) || 0) + 1);\n  }\n\n  report(): { endpoint: string; callsPerHour: number }[] {\n    const hourly: Record\u003Cstring, number> = {};\n    for (const [key, count] of this.calls) {\n      const endpoint = key.split(':').slice(1).join(':');\n      hourly[endpoint] = (hourly[endpoint] || 0) + count;\n    }\n    return Object.entries(hourly)\n      .map(([endpoint, callsPerHour]) => ({ endpoint, callsPerHour }))\n      .sort((a, b) => b.callsPerHour - a.callsPerHour);\n  }\n}\n```\n\n## Optimization Checklist\n\n- [ ] Design metadata cached (5+ min TTL)\n- [ ] Brand template list cached (1+ hour TTL)\n- [ ] Export URLs reused within 24-hour window\n- [ ] Pagination uses `query` parameter for server-side search\n- [ ] Thumbnail URLs refreshed only when displayed (15-min expiry)\n- [ ] Asset uploads deduplicated (don't re-upload same file)\n- [ ] Autofill results cached by template+data hash\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Rate limits hit frequently | Too many calls | Add caching layer |\n| Export quota exceeded | Duplicate exports | Track and reuse URLs |\n| Autofill not available | Not Enterprise tier | Upgrade Canva plan |\n| Slow list queries | No search filter | Use `query` parameter |\n\n## Resources\n\n- [Canva Pricing](https:\u002F\u002Fwww.canva.com\u002Fpricing\u002F)\n- [Canva Enterprise](https:\u002F\u002Fwww.canva.com\u002Fenterprise\u002F)\n- [API Rate Limits](https:\u002F\u002Fwww.canva.dev\u002Fdocs\u002Fconnect\u002Fapi-requests-responses\u002F)\n\n## Next Steps\n\nFor architecture patterns, see `canva-reference-architecture`.\n",{"name":5,"tags":24,"author":28,"license":15,"version":29,"description":30,"allowed-tools":31,"compatible-with":32},[25,26,27],"saas","design","canva","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Optimize Canva Connect API usage costs through efficient API patterns and monitoring.\nUse when analyzing Canva API usage, reducing unnecessary calls,\nor implementing usage monitoring and budget tracking.\nTrigger with phrases like \"canva cost\", \"canva usage\",\n\"reduce canva calls\", \"canva API efficiency\", \"canva budget\".\n","Read, Grep","claude-code","main","99825ad3f3bcc6597ddcc7294a14e6e922f2b67b","skills\u002Fsaas-packs--canva-pack--canva-cost-tuning",0,"https:\u002F\u002Fgithub.com\u002Fjukeyman\u002Fjukeyman-skills","https:\u002F\u002Fgithub.com\u002Fjukeyman","https:\u002F\u002FRJBUSINESSSOLUTIONS.ORG","Credit and Finance Expert | Developer\r\n\r\nI'm Rick Jefferson, a seasoned credit and finance expert with over a decade of experience in financial literacy,","2026-07-13 07:03:29",{"source":8,"skillName":5,"commands":43,"prompt":53,"zipAvailable":54},[44,47,50],{"tool":45,"command":46},"npx","npx skills add jukeyman\u002Fjukeyman-skills --skill canva-cost-tuning",{"tool":48,"command":49},"bunx","bunx skills add jukeyman\u002Fjukeyman-skills --skill canva-cost-tuning",{"tool":51,"command":52},"pnpm","pnpm dlx skills add jukeyman\u002Fjukeyman-skills --skill canva-cost-tuning","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjukeyman\u002Fjukeyman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fsaas-packs--canva-pack--canva-cost-tuning\u002FSKILL.md",true,[],[57,64,71,78,85,93],{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":63,"publishedAt":19},"01M79ANS2SM329NEP5ZCX106RR","zustand-store-creator","Create zustand store creator operations. Auto-activating skill for Frontend Development.\nTriggers on: zustand store creator, zustand store creator\nPart of the Frontend Development skill category. Use when working with zustand store creator functionality. Trigger with phrases like \"zustand store creator\", \"zustand creator\", \"zustand\".","https:\u002F\u002Fgithub.com\u002Fjukeyman\u002Fjukeyman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzustand-store-creator\u002FSKILL.md",[],[],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":19},"01M79AMZKP4YDEZ7EHG1Y7PP74","zero-trust-config-helper","Configure with zero trust config helper operations. Auto-activating skill for Security Advanced.\nTriggers on: zero trust config helper, zero trust config helper\nPart of the Security Advanced skill category. Use when configuring systems or services. Trigger with phrases like \"zero trust config helper\", \"zero helper\", \"zero\".","https:\u002F\u002Fgithub.com\u002Fjukeyman\u002Fjukeyman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzero-trust-config-helper\u002FSKILL.md",[],[],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":19},"01M79AMJSBCEJQNBTYNAHYN5HM","zapier-integration-helper","Assist with zapier integration helper operations. Auto-activating skill for Business Automation.\nTriggers on: zapier integration helper, zapier integration helper\nPart of the Business Automation skill category. Use when working with APIs or building integrations. Trigger with phrases like \"zapier integration helper\", \"zapier helper\", \"zapier\".","https:\u002F\u002Fgithub.com\u002Fjukeyman\u002Fjukeyman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzapier-integration-helper\u002FSKILL.md",[],[],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":19},"01M79AHJZGVMARS13VFQYRR1MP","yaml-config-validator","Validate yaml config validator operations. Auto-activating skill for DevOps Basics.\nTriggers on: yaml config validator, yaml config validator\nPart of the DevOps Basics skill category. Use when configuring systems or services. Trigger with phrases like \"yaml config validator\", \"yaml validator\", \"yaml\".","https:\u002F\u002Fgithub.com\u002Fjukeyman\u002Fjukeyman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fyaml-config-validator\u002FSKILL.md",[],[],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":89,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":19},"01M79AHGDZRN0020RDQSQDPAM8","xvary-stock-research","Thesis-driven equity analysis from public SEC EDGAR and market data; \u002Fanalyze, \u002Fscore, \u002Fcompare workflows with bundled Python tools (Claude Code, Cursor, Codex).","https:\u002F\u002Fgithub.com\u002Fjukeyman\u002Fjukeyman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fxvary-stock-research\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjukeyman\u002Fjukeyman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fxvary-stock-research\u002FSKILL.md",[],[],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":19},"01M79AHCYJ9FV9RMHQ24HDRN33","xss-vulnerability-scanner","Scan xss vulnerability scanner operations. Auto-activating skill for Security Fundamentals.\nTriggers on: xss vulnerability scanner, xss vulnerability scanner\nPart of the Security Fundamentals skill category. Use when working with xss vulnerability scanner functionality. Trigger with phrases like \"xss vulnerability scanner\", \"xss scanner\", \"xss\".","https:\u002F\u002Fgithub.com\u002Fjukeyman\u002Fjukeyman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fxss-vulnerability-scanner\u002FSKILL.md",[],[]]