[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EGG7WCKT6PXAP6RAEB4HB0":3,"skill-same:01M6EGG7WCKT6PXAP6RAEB4HB0":51},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":20,"frontMatter":21,"refName":22,"commitSha":23,"skillDirectory":24,"forksCount":25,"repositoryHtmlUrl":26,"repositoryHomepageUrl":27,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6EGG7WCKT6PXAP6RAEB4HB0","unkey",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Funkey\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"# Unkey — API Key Management\n\nYou are an expert in Unkey, the open-source API key management platform. You help developers create, validate, and manage API keys with built-in rate limiting, usage tracking, temporary keys, key rotation, and per-key permissions — providing the complete API authentication layer for developer platforms, SaaS APIs, and internal services without building custom key infrastructure.\n\n## Core Capabilities\n\n### Key Management\n\n```typescript\nimport { Unkey } from \"@unkey\u002Fapi\";\n\nconst unkey = new Unkey({ rootKey: process.env.UNKEY_ROOT_KEY! });\n\n\u002F\u002F Create API key for a customer\nconst { result } = await unkey.keys.create({\n  apiId: process.env.UNKEY_API_ID!,\n  prefix: \"sk_live\",                       \u002F\u002F Key prefix for identification\n  name: \"Acme Corp Production Key\",\n  ownerId: \"customer-42\",                  \u002F\u002F Link to your user\n  meta: {                                  \u002F\u002F Custom metadata\n    plan: \"pro\",\n    team: \"engineering\",\n  },\n  roles: [\"api.read\", \"api.write\"],        \u002F\u002F RBAC permissions\n  ratelimit: {\n    type: \"fast\",\n    limit: 100,                            \u002F\u002F 100 requests\n    duration: 60000,                       \u002F\u002F Per minute\n  },\n  remaining: 10000,                        \u002F\u002F Total usage limit (optional)\n  expires: Date.now() + 30 * 24 * 60 * 60 * 1000,  \u002F\u002F 30 days (optional)\n});\n\nconsole.log(result.key);                   \u002F\u002F sk_live_abc123... (show once!)\nconsole.log(result.keyId);                 \u002F\u002F key_xxx (for management)\n```\n\n### Key Verification (in your API)\n\n```typescript\nimport { verifyKey } from \"@unkey\u002Fapi\";\n\n\u002F\u002F Middleware — verify API key on every request\nasync function authMiddleware(req: Request) {\n  const key = req.headers.get(\"Authorization\")?.replace(\"Bearer \", \"\");\n  if (!key) return new Response(\"Missing API key\", { status: 401 });\n\n  const { result, error } = await verifyKey({\n    key,\n    apiId: process.env.UNKEY_API_ID!,\n  });\n\n  if (error || !result.valid) {\n    return new Response(JSON.stringify({\n      error: \"Invalid API key\",\n      code: result?.code,                  \u002F\u002F \"NOT_FOUND\" | \"RATE_LIMITED\" | \"USAGE_EXCEEDED\" | \"EXPIRED\"\n    }), { status: result?.code === \"RATE_LIMITED\" ? 429 : 403 });\n  }\n\n  \u002F\u002F Key is valid — access metadata\n  const { ownerId, meta, roles, remaining, ratelimit } = result;\n  console.log(`Customer: ${ownerId}, Plan: ${meta.plan}, Remaining: ${remaining}`);\n\n  \u002F\u002F Check permissions\n  if (!roles.includes(\"api.write\") && req.method !== \"GET\") {\n    return new Response(\"Insufficient permissions\", { status: 403 });\n  }\n\n  \u002F\u002F Rate limit info in response headers\n  return {\n    ownerId,\n    meta,\n    headers: {\n      \"X-RateLimit-Limit\": String(ratelimit?.limit),\n      \"X-RateLimit-Remaining\": String(ratelimit?.remaining),\n      \"X-RateLimit-Reset\": String(ratelimit?.reset),\n    },\n  };\n}\n```\n\n### Key Lifecycle\n\n```typescript\n\u002F\u002F Update key (change limits, roles)\nawait unkey.keys.update({\n  keyId: \"key_xxx\",\n  ratelimit: { type: \"fast\", limit: 500, duration: 60000 },  \u002F\u002F Upgrade limit\n  roles: [\"api.read\", \"api.write\", \"api.admin\"],\n  meta: { plan: \"enterprise\" },\n});\n\n\u002F\u002F Revoke key\nawait unkey.keys.delete({ keyId: \"key_xxx\" });\n\n\u002F\u002F List keys for a customer\nconst { result: keys } = await unkey.apis.listKeys({\n  apiId: process.env.UNKEY_API_ID!,\n  ownerId: \"customer-42\",\n});\n\n\u002F\u002F Usage analytics\nconst { result: verifications } = await unkey.keys.getVerifications({\n  keyId: \"key_xxx\",\n  start: Date.now() - 7 * 24 * 60 * 60 * 1000,  \u002F\u002F Last 7 days\n  end: Date.now(),\n  granularity: \"day\",\n});\n```\n\n## Installation\n\n```bash\nnpm install @unkey\u002Fapi\n```\n\n## Best Practices\n\n1. **Prefix keys** — Use `sk_live_`, `sk_test_` prefixes; identifies key type at a glance\n2. **Rate limiting built-in** — Set per-key rate limits at creation; Unkey enforces at verify time\n3. **Usage limits** — Set `remaining` for prepaid\u002Fquota models; key auto-invalidates when exhausted\n4. **RBAC roles** — Assign roles to keys; check in your middleware; scope access per endpoint\n5. **Key rotation** — Create new key, update client, revoke old; zero-downtime rotation\n6. **Metadata** — Store plan, team, environment in `meta`; use for analytics and feature flags\n7. **Expiring keys** — Set `expires` for trial keys, temporary access; auto-expire without cron\n8. **Self-hostable** — Run Unkey on your own infrastructure for data sovereignty; open-source\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Funkey",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":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill unkey",{"tool":37,"command":38},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill unkey",{"tool":40,"command":41},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill unkey","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Funkey\u002FSKILL.md",true,[45],{"path":46,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":49,"sourceHtmlUrl":50},"DESIGN.md","REFERENCE","参考文档",1371,"https:\u002F\u002Fgithub.com\u002FTorchiaHub\u002FSkills\u002Fblob\u002Fmaster\u002F01-Inbox\u002Fdownloads\u002Fbergside-design-skills\u002F20260516T145411Z\u002Fsource\u002Fskills\u002Fenergetic\u002FDESIGN.md",[52,66,76,85,91,98],{"skillNo":53,"name":54,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":55,"categories":56,"keywords":62,"publishedAt":18},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[57],{"categoryNo":58,"categoryName":59,"taxonomyType":60,"taxonomyTypeDesc":61},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[63,64,65],"model","model hierarchy","model hierarchy skill",{"skillNo":67,"name":68,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":72,"publishedAt":18},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[71],{"categoryNo":58,"categoryName":59,"taxonomyType":60,"taxonomyTypeDesc":61},[73,74,75],"MCP","zoom","zoom mcp",{"skillNo":77,"name":78,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":18},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[82,83,84,74],"sdk","zoom apps sdk","apps",{"skillNo":86,"name":87,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":18},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[87],{"skillNo":92,"name":93,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":97,"publishedAt":18},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[96],{"categoryNo":58,"categoryName":59,"taxonomyType":60,"taxonomyTypeDesc":61},[93],{"skillNo":99,"name":100,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":18},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[100]]