[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F76XNJRNB5CXNC27WWFHDR":3,"skill-same:01M6F76XNJRNB5CXNC27WWFHDR":83},{"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":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":60,"commitSha":61,"skillDirectory":62,"forksCount":63,"repositoryHtmlUrl":64,"repositoryHomepageUrl":65,"ownerHtmlUrl":66,"ownerBlogUrl":6,"ownerDescription":67,"updatedAt":68,"install":69,"resources":82},"01M6F76XNJRNB5CXNC27WWFHDR","apollo-rate-limits",null,"Implement Apollo.io rate limiting and backoff.\nUse when handling rate limits, implementing retry logic,\nor optimizing API request throughput.\nTrigger with phrases like \"apollo rate limit\", \"apollo 429\",\n\"apollo throttling\", \"apollo backoff\", \"apollo request limits\".","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fapollo-rate-limits\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"apollo rate limits","apollo","429","openclaw","backoff","retry","with","throughput","trigger","io","rate limiting","use","read","Bash","api","throttling","saas","code","implement","codex","2026-11-10 10:12:30",false,"---\nname: apollo-rate-limits\ndescription: |\n  Implement Apollo.io rate limiting and backoff.\n  Use when handling rate limits, implementing retry logic,\n  or optimizing API request throughput.\n  Trigger with phrases like \"apollo rate limit\", \"apollo 429\",\n  \"apollo throttling\", \"apollo backoff\", \"apollo request limits\".\nallowed-tools: Read, Grep, Bash(curl:*)\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ncompatible-with: claude-code, codex, openclaw\ntags: [saas, apollo, api]\n\n---\n# Apollo Rate Limits\n\n## Overview\nImplement robust rate limiting and backoff for the Apollo.io API. Apollo uses **fixed-window rate limiting** with per-endpoint limits. Unlike hourly quotas, Apollo limits are **per minute** with a burst limit per second. Exceeding them returns HTTP 429.\n\n## Prerequisites\n- Valid Apollo API key\n- Node.js 18+\n\n## Instructions\n\n### Step 1: Understand Apollo's Rate Limit Structure\nApollo's official rate limits (as of 2025):\n\n```\nEndpoint Category           | Limit\u002Fmin | Burst\u002Fsec | Notes\n----------------------------+-----------+-----------+-------------------------------\nPeople Search               | 100       | 10        | \u002Fmixed_people\u002Fapi_search (free)\nPeople Enrichment           | 100       | 10        | \u002Fpeople\u002Fmatch (1 credit each)\nBulk People Enrichment      | 10        | 2         | \u002Fpeople\u002Fbulk_match (up to 10\u002Fcall)\nOrganization Search         | 100       | 10        | \u002Fmixed_companies\u002Fsearch\nOrganization Enrichment     | 100       | 10        | \u002Forganizations\u002Fenrich\nContacts CRUD               | 100       | 10        | \u002Fcontacts\u002F*\nSequences                   | 100       | 10        | \u002Femailer_campaigns\u002F*\nDeals                       | 100       | 10        | \u002Fopportunities\u002F*\n```\n\nResponse headers on every successful call:\n- `x-rate-limit-limit` — max requests per window\n- `x-rate-limit-remaining` — requests remaining in current window\n- `retry-after` — seconds to wait (only on 429 responses)\n\n### Step 2: Build a Per-Endpoint Rate Limiter\n```typescript\n\u002F\u002F src\u002Fapollo\u002Frate-limiter.ts\nexport class SlidingWindowLimiter {\n  private timestamps: number[] = [];\n\n  constructor(\n    private maxRequests: number = 100,\n    private windowMs: number = 60_000,\n  ) {}\n\n  async acquire(): Promise\u003Cvoid> {\n    const now = Date.now();\n    \u002F\u002F Remove timestamps outside the window\n    this.timestamps = this.timestamps.filter((t) => now - t \u003C this.windowMs);\n\n    if (this.timestamps.length >= this.maxRequests) {\n      const oldestInWindow = this.timestamps[0];\n      const waitMs = this.windowMs - (now - oldestInWindow) + 100;\n      console.warn(`[RateLimit] At capacity (${this.maxRequests}\u002F${this.windowMs}ms). Waiting ${waitMs}ms`);\n      await new Promise((r) => setTimeout(r, waitMs));\n    }\n\n    this.timestamps.push(Date.now());\n  }\n\n  get remaining(): number {\n    const now = Date.now();\n    this.timestamps = this.timestamps.filter((t) => now - t \u003C this.windowMs);\n    return this.maxRequests - this.timestamps.length;\n  }\n}\n\n\u002F\u002F Create limiters per endpoint category\nexport const limiters = {\n  search: new SlidingWindowLimiter(100, 60_000),\n  enrichment: new SlidingWindowLimiter(100, 60_000),\n  bulkEnrichment: new SlidingWindowLimiter(10, 60_000),\n  contacts: new SlidingWindowLimiter(100, 60_000),\n  sequences: new SlidingWindowLimiter(100, 60_000),\n};\n```\n\n### Step 3: Exponential Backoff with Retry-After\n```typescript\n\u002F\u002F src\u002Fapollo\u002Fbackoff.ts\nexport async function withBackoff\u003CT>(\n  fn: () => Promise\u003CT>,\n  opts: { maxRetries?: number; baseMs?: number; maxMs?: number } = {},\n): Promise\u003CT> {\n  const { maxRetries = 5, baseMs = 1000, maxMs = 60_000 } = opts;\n\n  for (let attempt = 0; attempt \u003C= maxRetries; attempt++) {\n    try {\n      return await fn();\n    } catch (err: any) {\n      const status = err.response?.status;\n      if (status !== 429 && status \u003C 500) throw err;\n      if (attempt === maxRetries) throw err;\n\n      \u002F\u002F Prefer Retry-After header, fall back to exponential backoff\n      const retryAfter = err.response?.headers?.['retry-after'];\n      const delayMs = retryAfter\n        ? parseInt(retryAfter, 10) * 1000\n        : Math.min(baseMs * 2 ** attempt + Math.random() * 500, maxMs);\n\n      console.warn(`[Apollo] ${status} attempt ${attempt + 1}\u002F${maxRetries + 1}, retry in ${Math.round(delayMs \u002F 1000)}s`);\n      await new Promise((r) => setTimeout(r, delayMs));\n    }\n  }\n  throw new Error('Unreachable');\n}\n```\n\n### Step 4: Request Queue with Concurrency Control\n```typescript\n\u002F\u002F src\u002Fapollo\u002Fqueue.ts\nimport PQueue from 'p-queue';\nimport { limiters } from '.\u002Frate-limiter';\n\ntype EndpointCategory = keyof typeof limiters;\n\nconst queues: Record\u003CEndpointCategory, PQueue> = {\n  search: new PQueue({ concurrency: 5, intervalCap: 10, interval: 1000 }),\n  enrichment: new PQueue({ concurrency: 5, intervalCap: 10, interval: 1000 }),\n  bulkEnrichment: new PQueue({ concurrency: 2, intervalCap: 2, interval: 1000 }),\n  contacts: new PQueue({ concurrency: 5, intervalCap: 10, interval: 1000 }),\n  sequences: new PQueue({ concurrency: 3, intervalCap: 5, interval: 1000 }),\n};\n\nexport async function queuedRequest\u003CT>(\n  category: EndpointCategory,\n  fn: () => Promise\u003CT>,\n): Promise\u003CT> {\n  await limiters[category].acquire();\n  return queues[category].add(() => fn()) as Promise\u003CT>;\n}\n```\n\n### Step 5: Monitor Rate Limit Usage via Response Headers\n```typescript\n\u002F\u002F src\u002Fapollo\u002Frate-monitor.ts\nimport { AxiosInstance, AxiosResponse } from 'axios';\n\nexport function attachRateMonitor(client: AxiosInstance) {\n  client.interceptors.response.use((response: AxiosResponse) => {\n    const limit = response.headers['x-rate-limit-limit'];\n    const remaining = response.headers['x-rate-limit-remaining'];\n\n    if (limit && remaining) {\n      const pct = Math.round(((parseInt(limit) - parseInt(remaining)) \u002F parseInt(limit)) * 100);\n      if (pct >= 80) {\n        console.warn(`[Apollo] Rate limit ${pct}% used (${remaining}\u002F${limit} remaining) on ${response.config.url}`);\n      }\n    }\n    return response;\n  });\n}\n```\n\n## Output\n- Per-endpoint sliding window rate limiter matching Apollo's actual limits\n- Exponential backoff respecting `retry-after` headers\n- `PQueue`-based request queue with per-second burst control\n- Response header monitoring with 80% warning threshold\n\n## Error Handling\n| Scenario | Strategy |\n|----------|----------|\n| 429 with `retry-after` | Wait the specified seconds, then retry |\n| 429 without header | Exponential backoff: 1s, 2s, 4s, 8s, up to 60s |\n| Bulk enrichment limited | Use dedicated queue with 2\u002Fsec burst limit |\n| Near quota (>80%) | Log warning, defer non-critical requests |\n\n## Examples\n\n### Bulk Search with Rate Limiting\n```typescript\nimport { queuedRequest } from '.\u002Fapollo\u002Fqueue';\nimport { withBackoff } from '.\u002Fapollo\u002Fbackoff';\n\nconst domains = ['stripe.com', 'notion.so', 'linear.app', \u002F* ... *\u002F];\n\nconst results = await Promise.all(\n  domains.map((domain) =>\n    queuedRequest('search', () =>\n      withBackoff(() =>\n        client.post('\u002Fmixed_people\u002Fapi_search', {\n          q_organization_domains_list: [domain],\n          per_page: 25,\n        }),\n      ),\n    ),\n  ),\n);\nconsole.log(`Searched ${results.length} domains within rate limits`);\n```\n\n## Resources\n- [Apollo Rate Limits](https:\u002F\u002Fdocs.apollo.io\u002Freference\u002Frate-limits)\n- [API Usage Stats](https:\u002F\u002Fdocs.apollo.io\u002Freference\u002Fview-api-usage-stats)\n- [p-queue Library](https:\u002F\u002Fgithub.com\u002Fsindresorhus\u002Fp-queue)\n\n## Next Steps\nProceed to `apollo-security-basics` for API security best practices.\n\n","# Apollo Rate Limits\n\n## Overview\nImplement robust rate limiting and backoff for the Apollo.io API. Apollo uses **fixed-window rate limiting** with per-endpoint limits. Unlike hourly quotas, Apollo limits are **per minute** with a burst limit per second. Exceeding them returns HTTP 429.\n\n## Prerequisites\n- Valid Apollo API key\n- Node.js 18+\n\n## Instructions\n\n### Step 1: Understand Apollo's Rate Limit Structure\nApollo's official rate limits (as of 2025):\n\n```\nEndpoint Category           | Limit\u002Fmin | Burst\u002Fsec | Notes\n----------------------------+-----------+-----------+-------------------------------\nPeople Search               | 100       | 10        | \u002Fmixed_people\u002Fapi_search (free)\nPeople Enrichment           | 100       | 10        | \u002Fpeople\u002Fmatch (1 credit each)\nBulk People Enrichment      | 10        | 2         | \u002Fpeople\u002Fbulk_match (up to 10\u002Fcall)\nOrganization Search         | 100       | 10        | \u002Fmixed_companies\u002Fsearch\nOrganization Enrichment     | 100       | 10        | \u002Forganizations\u002Fenrich\nContacts CRUD               | 100       | 10        | \u002Fcontacts\u002F*\nSequences                   | 100       | 10        | \u002Femailer_campaigns\u002F*\nDeals                       | 100       | 10        | \u002Fopportunities\u002F*\n```\n\nResponse headers on every successful call:\n- `x-rate-limit-limit` — max requests per window\n- `x-rate-limit-remaining` — requests remaining in current window\n- `retry-after` — seconds to wait (only on 429 responses)\n\n### Step 2: Build a Per-Endpoint Rate Limiter\n```typescript\n\u002F\u002F src\u002Fapollo\u002Frate-limiter.ts\nexport class SlidingWindowLimiter {\n  private timestamps: number[] = [];\n\n  constructor(\n    private maxRequests: number = 100,\n    private windowMs: number = 60_000,\n  ) {}\n\n  async acquire(): Promise\u003Cvoid> {\n    const now = Date.now();\n    \u002F\u002F Remove timestamps outside the window\n    this.timestamps = this.timestamps.filter((t) => now - t \u003C this.windowMs);\n\n    if (this.timestamps.length >= this.maxRequests) {\n      const oldestInWindow = this.timestamps[0];\n      const waitMs = this.windowMs - (now - oldestInWindow) + 100;\n      console.warn(`[RateLimit] At capacity (${this.maxRequests}\u002F${this.windowMs}ms). Waiting ${waitMs}ms`);\n      await new Promise((r) => setTimeout(r, waitMs));\n    }\n\n    this.timestamps.push(Date.now());\n  }\n\n  get remaining(): number {\n    const now = Date.now();\n    this.timestamps = this.timestamps.filter((t) => now - t \u003C this.windowMs);\n    return this.maxRequests - this.timestamps.length;\n  }\n}\n\n\u002F\u002F Create limiters per endpoint category\nexport const limiters = {\n  search: new SlidingWindowLimiter(100, 60_000),\n  enrichment: new SlidingWindowLimiter(100, 60_000),\n  bulkEnrichment: new SlidingWindowLimiter(10, 60_000),\n  contacts: new SlidingWindowLimiter(100, 60_000),\n  sequences: new SlidingWindowLimiter(100, 60_000),\n};\n```\n\n### Step 3: Exponential Backoff with Retry-After\n```typescript\n\u002F\u002F src\u002Fapollo\u002Fbackoff.ts\nexport async function withBackoff\u003CT>(\n  fn: () => Promise\u003CT>,\n  opts: { maxRetries?: number; baseMs?: number; maxMs?: number } = {},\n): Promise\u003CT> {\n  const { maxRetries = 5, baseMs = 1000, maxMs = 60_000 } = opts;\n\n  for (let attempt = 0; attempt \u003C= maxRetries; attempt++) {\n    try {\n      return await fn();\n    } catch (err: any) {\n      const status = err.response?.status;\n      if (status !== 429 && status \u003C 500) throw err;\n      if (attempt === maxRetries) throw err;\n\n      \u002F\u002F Prefer Retry-After header, fall back to exponential backoff\n      const retryAfter = err.response?.headers?.['retry-after'];\n      const delayMs = retryAfter\n        ? parseInt(retryAfter, 10) * 1000\n        : Math.min(baseMs * 2 ** attempt + Math.random() * 500, maxMs);\n\n      console.warn(`[Apollo] ${status} attempt ${attempt + 1}\u002F${maxRetries + 1}, retry in ${Math.round(delayMs \u002F 1000)}s`);\n      await new Promise((r) => setTimeout(r, delayMs));\n    }\n  }\n  throw new Error('Unreachable');\n}\n```\n\n### Step 4: Request Queue with Concurrency Control\n```typescript\n\u002F\u002F src\u002Fapollo\u002Fqueue.ts\nimport PQueue from 'p-queue';\nimport { limiters } from '.\u002Frate-limiter';\n\ntype EndpointCategory = keyof typeof limiters;\n\nconst queues: Record\u003CEndpointCategory, PQueue> = {\n  search: new PQueue({ concurrency: 5, intervalCap: 10, interval: 1000 }),\n  enrichment: new PQueue({ concurrency: 5, intervalCap: 10, interval: 1000 }),\n  bulkEnrichment: new PQueue({ concurrency: 2, intervalCap: 2, interval: 1000 }),\n  contacts: new PQueue({ concurrency: 5, intervalCap: 10, interval: 1000 }),\n  sequences: new PQueue({ concurrency: 3, intervalCap: 5, interval: 1000 }),\n};\n\nexport async function queuedRequest\u003CT>(\n  category: EndpointCategory,\n  fn: () => Promise\u003CT>,\n): Promise\u003CT> {\n  await limiters[category].acquire();\n  return queues[category].add(() => fn()) as Promise\u003CT>;\n}\n```\n\n### Step 5: Monitor Rate Limit Usage via Response Headers\n```typescript\n\u002F\u002F src\u002Fapollo\u002Frate-monitor.ts\nimport { AxiosInstance, AxiosResponse } from 'axios';\n\nexport function attachRateMonitor(client: AxiosInstance) {\n  client.interceptors.response.use((response: AxiosResponse) => {\n    const limit = response.headers['x-rate-limit-limit'];\n    const remaining = response.headers['x-rate-limit-remaining'];\n\n    if (limit && remaining) {\n      const pct = Math.round(((parseInt(limit) - parseInt(remaining)) \u002F parseInt(limit)) * 100);\n      if (pct >= 80) {\n        console.warn(`[Apollo] Rate limit ${pct}% used (${remaining}\u002F${limit} remaining) on ${response.config.url}`);\n      }\n    }\n    return response;\n  });\n}\n```\n\n## Output\n- Per-endpoint sliding window rate limiter matching Apollo's actual limits\n- Exponential backoff respecting `retry-after` headers\n- `PQueue`-based request queue with per-second burst control\n- Response header monitoring with 80% warning threshold\n\n## Error Handling\n| Scenario | Strategy |\n|----------|----------|\n| 429 with `retry-after` | Wait the specified seconds, then retry |\n| 429 without header | Exponential backoff: 1s, 2s, 4s, 8s, up to 60s |\n| Bulk enrichment limited | Use dedicated queue with 2\u002Fsec burst limit |\n| Near quota (>80%) | Log warning, defer non-critical requests |\n\n## Examples\n\n### Bulk Search with Rate Limiting\n```typescript\nimport { queuedRequest } from '.\u002Fapollo\u002Fqueue';\nimport { withBackoff } from '.\u002Fapollo\u002Fbackoff';\n\nconst domains = ['stripe.com', 'notion.so', 'linear.app', \u002F* ... *\u002F];\n\nconst results = await Promise.all(\n  domains.map((domain) =>\n    queuedRequest('search', () =>\n      withBackoff(() =>\n        client.post('\u002Fmixed_people\u002Fapi_search', {\n          q_organization_domains_list: [domain],\n          per_page: 25,\n        }),\n      ),\n    ),\n  ),\n);\nconsole.log(`Searched ${results.length} domains within rate limits`);\n```\n\n## Resources\n- [Apollo Rate Limits](https:\u002F\u002Fdocs.apollo.io\u002Freference\u002Frate-limits)\n- [API Usage Stats](https:\u002F\u002Fdocs.apollo.io\u002Freference\u002Fview-api-usage-stats)\n- [p-queue Library](https:\u002F\u002Fgithub.com\u002Fsindresorhus\u002Fp-queue)\n\n## Next Steps\nProceed to `apollo-security-basics` for API security best practices.\n\n",{"name":5,"tags":54,"author":55,"license":15,"version":56,"description":57,"allowed-tools":58,"compatible-with":59},[45,30,43],"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Implement Apollo.io rate limiting and backoff.\nUse when handling rate limits, implementing retry logic,\nor optimizing API request throughput.\nTrigger with phrases like \"apollo rate limit\", \"apollo 429\",\n\"apollo throttling\", \"apollo backoff\", \"apollo request limits\".\n","Read, Grep, Bash(curl:*)","claude-code, codex, openclaw","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fapollo-rate-limits",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":70,"prompt":80,"zipAvailable":81},[71,74,77],{"tool":72,"command":73},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill apollo-rate-limits",{"tool":75,"command":76},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill apollo-rate-limits",{"tool":78,"command":79},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill apollo-rate-limits","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fapollo-rate-limits\u002FSKILL.md",true,[],[84,96,106,115,121,128],{"skillNo":85,"name":86,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":92,"publishedAt":49},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[89],{"categoryNo":90,"categoryName":91,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[93,94,95],"model","model hierarchy","model hierarchy skill",{"skillNo":97,"name":98,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":102,"publishedAt":49},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[101],{"categoryNo":90,"categoryName":91,"taxonomyType":21,"taxonomyTypeDesc":22},[103,104,105],"MCP","zoom","zoom mcp",{"skillNo":107,"name":108,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":49},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[112,113,114,104],"sdk","zoom apps sdk","apps",{"skillNo":116,"name":117,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":49},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[117],{"skillNo":122,"name":123,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":127,"publishedAt":49},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[126],{"categoryNo":90,"categoryName":91,"taxonomyType":21,"taxonomyTypeDesc":22},[123],{"skillNo":129,"name":130,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":49},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[130]]