[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M73GHR9HTXP1SXV6GF4KSA5D":3,"skill-same:01M73GHR9HTXP1SXV6GF4KSA5D":51},{"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":27,"commitSha":28,"skillDirectory":29,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":32,"ownerHtmlUrl":33,"ownerBlogUrl":34,"ownerDescription":35,"updatedAt":36,"install":37,"resources":50},"01M73GHR9HTXP1SXV6GF4KSA5D","venice--venice-api-keys",null,"Manage Venice API keys. Covers GET\u002FPOST\u002FPATCH\u002FDELETE \u002Fapi_keys, GET \u002Fapi_keys\u002F{id}, GET \u002Fapi_keys\u002Frate_limits, GET \u002Fapi_keys\u002Frate_limits\u002Flog, the two-step \u002Fapi_keys\u002Fgenerate_web3_key wallet flow, INFERENCE vs ADMIN key types, and per-key consumption limits (USD \u002F DIEM).","Horonomos-laps\u002FYana-AI","Horonomos-laps","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F355299122?v=4","01M76B3QPXE88ET2SQPDPVATZT"," Horonomos-laps","01M72ZQRJPCYPSSWT4D00VJR2A",13,"MIT","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fvenice--venice-api-keys\u002FSKILL.md",[],[],"2026-11-11 15:11:14",false,"---\nname: venice--venice-api-keys\ndescription: >-\n  Manage Venice API keys. Covers GET\u002FPOST\u002FPATCH\u002FDELETE \u002Fapi_keys, GET \u002Fapi_keys\u002F{id}, GET \u002Fapi_keys\u002Frate_limits, GET \u002Fapi_keys\u002Frate_limits\u002Flog, the two-step \u002Fapi_keys\u002Fgenerate_web3_key wallet flow, INFERENCE vs ADMIN key types, and per-key consumption limits (USD \u002F DIEM).\norigin: \"github.com\u002Fveniceai\u002Fskills (skill: venice-api-keys)\"\nlicense: MIT\nversion: \"1.0.0\"\ncompatibility: \"yana-ai >= 0.14.0\"\n---\n\n# Venice API Keys\n\nAdmin endpoints for managing Bearer API keys. You need an **ADMIN** key (or parent session) to call these. For wallet-only auth, use [`venice-auth`](..\u002Fvenice-auth\u002FSKILL.md) \u002F [`venice-x402`](..\u002Fvenice-x402\u002FSKILL.md) instead.\n\n| Endpoint | Purpose |\n|---|---|\n| `GET \u002Fapi_keys` | List your keys (masked). |\n| `POST \u002Fapi_keys` | Create a new key. Response contains the **only copy of the secret**. |\n| `PATCH \u002Fapi_keys` | Update `description`, `expiresAt`, `consumptionLimit`. |\n| `DELETE \u002Fapi_keys?id=...` | Revoke a key. |\n| `GET \u002Fapi_keys\u002F{id}` | Full details for one key (usage, limits, expiration). |\n| `GET \u002Fapi_keys\u002Frate_limits` | Balances + per-model rate-limit tiers for the current key. |\n| `GET \u002Fapi_keys\u002Frate_limits\u002Flog` | Last 50 rate-limit breaches. |\n| `GET \u002Fapi_keys\u002Fgenerate_web3_key` | Get a SIWE-style token to sign with a wallet. |\n| `POST \u002Fapi_keys\u002Fgenerate_web3_key` | Authenticate a wallet (holds sVVV) and mint a classic API key. |\n\nLimits: key creation is capped at **20 requests\u002Fminute** and **500 active keys per user**.\n\n## Key types\n\n| Type | Can call |\n|---|---|\n| `INFERENCE` | Inference endpoints plus any route that only requires authentication — e.g. `\u002Fchat\u002F*`, `\u002Fimage\u002F*`, `\u002Faudio\u002F*`, `\u002Fvideo\u002F*`, `\u002Fembeddings`, `\u002Faugment\u002F*`, `\u002Fcrypto\u002Frpc`, `\u002Fcharacters`, `\u002Fapi_keys\u002Frate_limits*`, `\u002Fsupport-bot`. Rejected from admin routes listed below with `401`. |\n| `ADMIN` | Everything an `INFERENCE` key can do, plus admin-only routes: `POST\u002FPATCH\u002FDELETE \u002Fapi_keys`, `GET \u002Fapi_keys` (list), `GET \u002Fapi_keys\u002F{id}`, `GET \u002Fbilling\u002Fbalance`, `GET \u002Fbilling\u002Fusage`. |\n\nA leaf app should almost always use **`INFERENCE`** keys — per-app, per-user, with consumption caps.\n\n## `GET \u002Fapi_keys`\n\n```bash\ncurl https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys \\\n  -H \"Authorization: Bearer $ADMIN_KEY\"\n```\n\nReturns:\n\n```json\n{\n  \"object\": \"list\",\n  \"data\": [\n    {\n      \"id\": \"uuid\",\n      \"apiKeyType\": \"INFERENCE\",\n      \"description\": \"backend prod\",\n      \"createdAt\": \"2025-10-01T12:00:00Z\",\n      \"expiresAt\": null,\n      \"lastUsedAt\": \"2026-04-20T10:05:00Z\",\n      \"last6Chars\": \"2V2jNW\",\n      \"consumptionLimits\": { \"usd\": 50, \"diem\": 10 },\n      \"usage\": { \"trailingSevenDays\": { \"usd\": \"4.20\", \"diem\": \"0.00\" } }\n    }\n  ]\n}\n```\n\nThe full secret is **never** returned on list — only `last6Chars`.\n\n## `POST \u002Fapi_keys` — create\n\n```bash\ncurl https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys \\\n  -H \"Authorization: Bearer $ADMIN_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"apiKeyType\": \"INFERENCE\",\n    \"description\": \"backend prod\",\n    \"expiresAt\": \"2026-12-31T23:59:59Z\",\n    \"consumptionLimit\": { \"usd\": 50, \"diem\": 10 }\n  }'\n```\n\nResponse includes the **one-time** `apiKey` secret:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"uuid\",\n    \"apiKey\": \"VENICE_INFERENCE_KEY_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n    \"apiKeyType\": \"INFERENCE\",\n    \"description\": \"backend prod\",\n    \"expiresAt\": \"2026-12-31T23:59:59Z\",\n    \"consumptionLimit\": { \"usd\": 50, \"diem\": 10 }\n  }\n}\n```\n\n**Save it immediately** — Venice won't show the secret again. If you lose it, delete and re-create.\n\n### Required\n\n- `apiKeyType`\n- `description`\n\n### Optional\n\n- `expiresAt` — empty string or ISO 8601 date\u002Fdatetime. Omit for non-expiring.\n- `consumptionLimit.usd` \u002F `.diem` — per-epoch caps. Null means no cap on that currency.\n- `consumptionLimit.vcu` — **deprecated** (legacy Diem). Use `diem` instead.\n\n## `PATCH \u002Fapi_keys` — update\n\n```bash\ncurl -X PATCH https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys \\\n  -H \"Authorization: Bearer $ADMIN_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"id\": \"uuid\", \"description\": \"renamed\", \"consumptionLimit\": { \"usd\": 100 } }'\n```\n\nOnly `description`, `expiresAt`, and `consumptionLimit` are mutable. Pass `\"expiresAt\": \"\"` or `null` to remove an expiration.\n\n## `DELETE \u002Fapi_keys?id=\u003Cuuid>` — revoke\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys?id=uuid\" \\\n  -H \"Authorization: Bearer $ADMIN_KEY\"\n```\n\nReturns `{\"success\": true}`. Revocation is immediate.\n\n## `GET \u002Fapi_keys\u002F{id}` — details\n\nReturns one key's full metadata plus trailing-7-day usage. Useful for an admin dashboard row view.\n\n## `GET \u002Fapi_keys\u002Frate_limits`\n\n```bash\ncurl https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys\u002Frate_limits \\\n  -H \"Authorization: Bearer $VENICE_API_KEY\"\n```\n\nReturns for the calling key:\n\n```json\n{\n  \"data\": {\n    \"accessPermitted\": true,\n    \"apiTier\": { \"id\": \"paid\", \"isCharged\": true },\n    \"balances\": { \"USD\": 50.23, \"DIEM\": 100.023 },\n    \"keyExpiration\": \"2025-06-01T00:00:00Z\",\n    \"nextEpochBegins\": \"2025-05-07T00:00:00.000Z\",\n    \"rateLimits\": [\n      {\n        \"apiModelId\": \"zai-org-glm-5-1\",\n        \"rateLimits\": [\n          { \"type\": \"RPM\", \"amount\": 100 },\n          { \"type\": \"TPM\", \"amount\": 200000 },\n          { \"type\": \"RPD\", \"amount\": 10000 }\n        ]\n      }\n    ]\n  }\n}\n```\n\nUse it to:\n\n- Display current balances in-app.\n- Warm-gate calls when the relevant model's RPM cap is near.\n- Know when the next epoch resets (DIEM, bundled credits).\n\n## `GET \u002Fapi_keys\u002Frate_limits\u002Flog`\n\nReturns the last 50 rate-limit breaches. Response is wrapped as `{ object: \"list\", data: [...] }`:\n\n```json\n{\n  \"object\": \"list\",\n  \"data\": [\n    { \"apiKeyId\": \"...\", \"modelId\": \"zai-org-glm-5-1\", \"rateLimitType\": \"RPM\",\n      \"rateLimitTier\": \"paid\", \"timestamp\": \"2026-04-20T12:34:56Z\" }\n  ]\n}\n```\n\nFeed these into your monitoring when tuning concurrency.\n\n## Web3 API keys — two-step wallet flow\n\nLets a wallet that **holds sVVV** mint a classic Bearer API key. No Venice account required.\n\n### 1. `GET \u002Fapi_keys\u002Fgenerate_web3_key`\n\n```bash\ncurl https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys\u002Fgenerate_web3_key\n```\n\nReturns `{ success: true, data: { token: \"\u003Cjwt-ish token>\" } }`.\n\n### 2. Sign the token with your wallet, then `POST \u002Fapi_keys\u002Fgenerate_web3_key`\n\n```ts\nimport { Wallet } from 'ethers'\n\nconst { data: { token } } = await fetch(`${base}\u002Fapi_keys\u002Fgenerate_web3_key`).then(r => r.json())\nconst wallet = new Wallet(process.env.WALLET_KEY!)\nconst signature = await wallet.signMessage(token)\n\nconst res = await fetch(`${base}\u002Fapi_keys\u002Fgenerate_web3_key`, {\n  method: 'POST',\n  headers: { 'Content-Type': 'application\u002Fjson' },\n  body: JSON.stringify({\n    apiKeyType: 'INFERENCE',\n    description: 'Web3 API Key',\n    address: wallet.address,\n    signature,\n    token,\n    consumptionLimit: { usd: 50 },\n  }),\n})\n\nconst { data } = await res.json()\nconsole.log(data.apiKey) \u002F\u002F save this once\n```\n\nThe returned `apiKey` behaves exactly like a normal Bearer key.\n\n## Recipes\n\n### Per-customer keys with $5 USD limit\n\n```ts\nawait fetch(`${base}\u002Fapi_keys`, {\n  method: 'POST',\n  headers: { Authorization: `Bearer ${ADMIN_KEY}`, 'Content-Type': 'application\u002Fjson' },\n  body: JSON.stringify({\n    apiKeyType: 'INFERENCE',\n    description: `cust:${customerId}`,\n    consumptionLimit: { usd: 5 },\n  }),\n})\n```\n\nRotate monthly; revoke on churn.\n\n### Health-check for a key\n\n```ts\nconst { data } = await fetch(`${base}\u002Fapi_keys\u002Frate_limits`, {\n  headers: { Authorization: `Bearer ${key}` },\n}).then(r => r.json())\n\nif (!data.accessPermitted) alert('Key blocked — top up or change tier')\n```\n\n## Errors\n\n| Code | Meaning |\n|---|---|\n| `400` | Bad body (e.g. missing `apiKeyType`, malformed `expiresAt`), or attempting to create when you already have 500 active keys. |\n| `401` | Missing \u002F bad \u002F non-admin key for admin-only routes. |\n| `429` | Exceeded 20 creates\u002Fmin. |\n| `500` | Transient; retry. |\n\n## Gotchas\n\n- The secret is returned **exactly once**, in the `POST` response. Losing it = delete + recreate.\n- `consumptionLimit` is per **epoch** (day \u002F reset cycle), not per call.\n- `INFERENCE` keys can't call admin-only routes (`POST\u002FPATCH\u002FDELETE \u002Fapi_keys`, `GET \u002Fapi_keys`, `GET \u002Fapi_keys\u002F{id}`, `GET \u002Fbilling\u002Fbalance`, `GET \u002Fbilling\u002Fusage`). They **can** call `GET \u002Fapi_keys\u002Frate_limits` and `\u002Fapi_keys\u002Frate_limits\u002Flog` for themselves. Use a separate `ADMIN` key for management.\n- `vcu` is legacy — use `diem`.\n- `expiresAt` of empty string `\"\"` means \"no expiration\" in CREATE; on UPDATE it **removes** an existing one.\n- Rate-limit log is capped at 50 entries — pull it frequently if debugging bursts.\n- The Web3 key flow requires wallet holdings of **sVVV**; otherwise the signing step is rejected.\n","# Venice API Keys\n\nAdmin endpoints for managing Bearer API keys. You need an **ADMIN** key (or parent session) to call these. For wallet-only auth, use [`venice-auth`](..\u002Fvenice-auth\u002FSKILL.md) \u002F [`venice-x402`](..\u002Fvenice-x402\u002FSKILL.md) instead.\n\n| Endpoint | Purpose |\n|---|---|\n| `GET \u002Fapi_keys` | List your keys (masked). |\n| `POST \u002Fapi_keys` | Create a new key. Response contains the **only copy of the secret**. |\n| `PATCH \u002Fapi_keys` | Update `description`, `expiresAt`, `consumptionLimit`. |\n| `DELETE \u002Fapi_keys?id=...` | Revoke a key. |\n| `GET \u002Fapi_keys\u002F{id}` | Full details for one key (usage, limits, expiration). |\n| `GET \u002Fapi_keys\u002Frate_limits` | Balances + per-model rate-limit tiers for the current key. |\n| `GET \u002Fapi_keys\u002Frate_limits\u002Flog` | Last 50 rate-limit breaches. |\n| `GET \u002Fapi_keys\u002Fgenerate_web3_key` | Get a SIWE-style token to sign with a wallet. |\n| `POST \u002Fapi_keys\u002Fgenerate_web3_key` | Authenticate a wallet (holds sVVV) and mint a classic API key. |\n\nLimits: key creation is capped at **20 requests\u002Fminute** and **500 active keys per user**.\n\n## Key types\n\n| Type | Can call |\n|---|---|\n| `INFERENCE` | Inference endpoints plus any route that only requires authentication — e.g. `\u002Fchat\u002F*`, `\u002Fimage\u002F*`, `\u002Faudio\u002F*`, `\u002Fvideo\u002F*`, `\u002Fembeddings`, `\u002Faugment\u002F*`, `\u002Fcrypto\u002Frpc`, `\u002Fcharacters`, `\u002Fapi_keys\u002Frate_limits*`, `\u002Fsupport-bot`. Rejected from admin routes listed below with `401`. |\n| `ADMIN` | Everything an `INFERENCE` key can do, plus admin-only routes: `POST\u002FPATCH\u002FDELETE \u002Fapi_keys`, `GET \u002Fapi_keys` (list), `GET \u002Fapi_keys\u002F{id}`, `GET \u002Fbilling\u002Fbalance`, `GET \u002Fbilling\u002Fusage`. |\n\nA leaf app should almost always use **`INFERENCE`** keys — per-app, per-user, with consumption caps.\n\n## `GET \u002Fapi_keys`\n\n```bash\ncurl https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys \\\n  -H \"Authorization: Bearer $ADMIN_KEY\"\n```\n\nReturns:\n\n```json\n{\n  \"object\": \"list\",\n  \"data\": [\n    {\n      \"id\": \"uuid\",\n      \"apiKeyType\": \"INFERENCE\",\n      \"description\": \"backend prod\",\n      \"createdAt\": \"2025-10-01T12:00:00Z\",\n      \"expiresAt\": null,\n      \"lastUsedAt\": \"2026-04-20T10:05:00Z\",\n      \"last6Chars\": \"2V2jNW\",\n      \"consumptionLimits\": { \"usd\": 50, \"diem\": 10 },\n      \"usage\": { \"trailingSevenDays\": { \"usd\": \"4.20\", \"diem\": \"0.00\" } }\n    }\n  ]\n}\n```\n\nThe full secret is **never** returned on list — only `last6Chars`.\n\n## `POST \u002Fapi_keys` — create\n\n```bash\ncurl https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys \\\n  -H \"Authorization: Bearer $ADMIN_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"apiKeyType\": \"INFERENCE\",\n    \"description\": \"backend prod\",\n    \"expiresAt\": \"2026-12-31T23:59:59Z\",\n    \"consumptionLimit\": { \"usd\": 50, \"diem\": 10 }\n  }'\n```\n\nResponse includes the **one-time** `apiKey` secret:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"uuid\",\n    \"apiKey\": \"VENICE_INFERENCE_KEY_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n    \"apiKeyType\": \"INFERENCE\",\n    \"description\": \"backend prod\",\n    \"expiresAt\": \"2026-12-31T23:59:59Z\",\n    \"consumptionLimit\": { \"usd\": 50, \"diem\": 10 }\n  }\n}\n```\n\n**Save it immediately** — Venice won't show the secret again. If you lose it, delete and re-create.\n\n### Required\n\n- `apiKeyType`\n- `description`\n\n### Optional\n\n- `expiresAt` — empty string or ISO 8601 date\u002Fdatetime. Omit for non-expiring.\n- `consumptionLimit.usd` \u002F `.diem` — per-epoch caps. Null means no cap on that currency.\n- `consumptionLimit.vcu` — **deprecated** (legacy Diem). Use `diem` instead.\n\n## `PATCH \u002Fapi_keys` — update\n\n```bash\ncurl -X PATCH https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys \\\n  -H \"Authorization: Bearer $ADMIN_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"id\": \"uuid\", \"description\": \"renamed\", \"consumptionLimit\": { \"usd\": 100 } }'\n```\n\nOnly `description`, `expiresAt`, and `consumptionLimit` are mutable. Pass `\"expiresAt\": \"\"` or `null` to remove an expiration.\n\n## `DELETE \u002Fapi_keys?id=\u003Cuuid>` — revoke\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys?id=uuid\" \\\n  -H \"Authorization: Bearer $ADMIN_KEY\"\n```\n\nReturns `{\"success\": true}`. Revocation is immediate.\n\n## `GET \u002Fapi_keys\u002F{id}` — details\n\nReturns one key's full metadata plus trailing-7-day usage. Useful for an admin dashboard row view.\n\n## `GET \u002Fapi_keys\u002Frate_limits`\n\n```bash\ncurl https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys\u002Frate_limits \\\n  -H \"Authorization: Bearer $VENICE_API_KEY\"\n```\n\nReturns for the calling key:\n\n```json\n{\n  \"data\": {\n    \"accessPermitted\": true,\n    \"apiTier\": { \"id\": \"paid\", \"isCharged\": true },\n    \"balances\": { \"USD\": 50.23, \"DIEM\": 100.023 },\n    \"keyExpiration\": \"2025-06-01T00:00:00Z\",\n    \"nextEpochBegins\": \"2025-05-07T00:00:00.000Z\",\n    \"rateLimits\": [\n      {\n        \"apiModelId\": \"zai-org-glm-5-1\",\n        \"rateLimits\": [\n          { \"type\": \"RPM\", \"amount\": 100 },\n          { \"type\": \"TPM\", \"amount\": 200000 },\n          { \"type\": \"RPD\", \"amount\": 10000 }\n        ]\n      }\n    ]\n  }\n}\n```\n\nUse it to:\n\n- Display current balances in-app.\n- Warm-gate calls when the relevant model's RPM cap is near.\n- Know when the next epoch resets (DIEM, bundled credits).\n\n## `GET \u002Fapi_keys\u002Frate_limits\u002Flog`\n\nReturns the last 50 rate-limit breaches. Response is wrapped as `{ object: \"list\", data: [...] }`:\n\n```json\n{\n  \"object\": \"list\",\n  \"data\": [\n    { \"apiKeyId\": \"...\", \"modelId\": \"zai-org-glm-5-1\", \"rateLimitType\": \"RPM\",\n      \"rateLimitTier\": \"paid\", \"timestamp\": \"2026-04-20T12:34:56Z\" }\n  ]\n}\n```\n\nFeed these into your monitoring when tuning concurrency.\n\n## Web3 API keys — two-step wallet flow\n\nLets a wallet that **holds sVVV** mint a classic Bearer API key. No Venice account required.\n\n### 1. `GET \u002Fapi_keys\u002Fgenerate_web3_key`\n\n```bash\ncurl https:\u002F\u002Fapi.venice.ai\u002Fapi\u002Fv1\u002Fapi_keys\u002Fgenerate_web3_key\n```\n\nReturns `{ success: true, data: { token: \"\u003Cjwt-ish token>\" } }`.\n\n### 2. Sign the token with your wallet, then `POST \u002Fapi_keys\u002Fgenerate_web3_key`\n\n```ts\nimport { Wallet } from 'ethers'\n\nconst { data: { token } } = await fetch(`${base}\u002Fapi_keys\u002Fgenerate_web3_key`).then(r => r.json())\nconst wallet = new Wallet(process.env.WALLET_KEY!)\nconst signature = await wallet.signMessage(token)\n\nconst res = await fetch(`${base}\u002Fapi_keys\u002Fgenerate_web3_key`, {\n  method: 'POST',\n  headers: { 'Content-Type': 'application\u002Fjson' },\n  body: JSON.stringify({\n    apiKeyType: 'INFERENCE',\n    description: 'Web3 API Key',\n    address: wallet.address,\n    signature,\n    token,\n    consumptionLimit: { usd: 50 },\n  }),\n})\n\nconst { data } = await res.json()\nconsole.log(data.apiKey) \u002F\u002F save this once\n```\n\nThe returned `apiKey` behaves exactly like a normal Bearer key.\n\n## Recipes\n\n### Per-customer keys with $5 USD limit\n\n```ts\nawait fetch(`${base}\u002Fapi_keys`, {\n  method: 'POST',\n  headers: { Authorization: `Bearer ${ADMIN_KEY}`, 'Content-Type': 'application\u002Fjson' },\n  body: JSON.stringify({\n    apiKeyType: 'INFERENCE',\n    description: `cust:${customerId}`,\n    consumptionLimit: { usd: 5 },\n  }),\n})\n```\n\nRotate monthly; revoke on churn.\n\n### Health-check for a key\n\n```ts\nconst { data } = await fetch(`${base}\u002Fapi_keys\u002Frate_limits`, {\n  headers: { Authorization: `Bearer ${key}` },\n}).then(r => r.json())\n\nif (!data.accessPermitted) alert('Key blocked — top up or change tier')\n```\n\n## Errors\n\n| Code | Meaning |\n|---|---|\n| `400` | Bad body (e.g. missing `apiKeyType`, malformed `expiresAt`), or attempting to create when you already have 500 active keys. |\n| `401` | Missing \u002F bad \u002F non-admin key for admin-only routes. |\n| `429` | Exceeded 20 creates\u002Fmin. |\n| `500` | Transient; retry. |\n\n## Gotchas\n\n- The secret is returned **exactly once**, in the `POST` response. Losing it = delete + recreate.\n- `consumptionLimit` is per **epoch** (day \u002F reset cycle), not per call.\n- `INFERENCE` keys can't call admin-only routes (`POST\u002FPATCH\u002FDELETE \u002Fapi_keys`, `GET \u002Fapi_keys`, `GET \u002Fapi_keys\u002F{id}`, `GET \u002Fbilling\u002Fbalance`, `GET \u002Fbilling\u002Fusage`). They **can** call `GET \u002Fapi_keys\u002Frate_limits` and `\u002Fapi_keys\u002Frate_limits\u002Flog` for themselves. Use a separate `ADMIN` key for management.\n- `vcu` is legacy — use `diem`.\n- `expiresAt` of empty string `\"\"` means \"no expiration\" in CREATE; on UPDATE it **removes** an existing one.\n- Rate-limit log is capped at 50 entries — pull it frequently if debugging bursts.\n- The Web3 key flow requires wallet holdings of **sVVV**; otherwise the signing step is rejected.\n",{"name":5,"origin":24,"license":15,"version":25,"description":7,"compatibility":26},"github.com\u002Fveniceai\u002Fskills (skill: venice-api-keys)","1.0.0","yana-ai >= 0.14.0","main","481dcd7dd2e288b9d627a2bd017db70e64e6c6fa","core\u002Fskills\u002Fvenice--venice-api-keys",2,"https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI","https:\u002F\u002Fyana.vutam.link\u002F","https:\u002F\u002Fgithub.com\u002FHoronomos-laps","https:\u002F\u002Fyana.vutam.link","An open-source governed runtime & execution environment for multi-agent AI systems.","2026-11-13 13:15:29",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add Horonomos-laps\u002FYana-AI --skill venice--venice-api-keys",{"tool":43,"command":44},"bunx","bunx skills add Horonomos-laps\u002FYana-AI --skill venice--venice-api-keys",{"tool":46,"command":47},"pnpm","pnpm dlx skills add Horonomos-laps\u002FYana-AI --skill venice--venice-api-keys","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fvenice--venice-api-keys\u002FSKILL.md",true,[],[52,59,67,75,83,91],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":58,"publishedAt":19},"01M735GKET5YVYKAY62W2P5YXB","openai--sentry--sentry","Use when the user asks to inspect Sentry issues or events, summarize recent production errors, or pull basic Sentry health data via the Sentry API; perform read-only queries with the bundled script and require `SENTRY_AUTH_TOKEN`.","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fopenai--sentry--sentry\u002FSKILL.md",[],[],{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":63,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":19},"01M73DCAP83T17HY7SMGK7MGFE","ito-basket-compare","Compare Itô prediction-market baskets against a user's knowledge base, portfolio notes, financial context, watchlist, or research thesis. Use for read-only basket comparison and gap analysis without investment advice or live trading.","Apache-2.0","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fito-basket-compare\u002FSKILL.md",[],[],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":63,"licenseFileUrl":71,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":19},"01M734CYEMZFDR3KH6SW0JP8TD","implementing-network-traffic-baselining","Build network traffic baselines from NetFlow\u002FIPFIX data using Python pandas for statistical analysis, z-score anomaly detection, and hourly\u002Fdaily traffic pattern profiling","https:\u002F\u002Fgithub.com\u002Fyanacuti1121\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-network-traffic-baselining\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-network-traffic-baselining\u002FSKILL.md",[],[],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":63,"licenseFileUrl":79,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":19},"01M73ASZ6NJRJM44Z2P84NGQ3Q","detecting-evasion-techniques-in-endpoint-logs","Detects defense evasion techniques used by adversaries in endpoint logs including log tampering, timestomping, process injection, and security tool disabling. Use when investigating suspicious endpoint behavior, building detection rules for evasion tactics, or conducting threat hunting for stealthy adversary activity. Activates for requests involving evasion detection, defense evasion analysis, log tampering detection, or MITRE ATT&CK TA0005.","https:\u002F\u002Fgithub.com\u002Fyanacuti1121\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fdetecting-evasion-techniques-in-endpoint-logs\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fdetecting-evasion-techniques-in-endpoint-logs\u002FSKILL.md",[],[],{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":63,"licenseFileUrl":87,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":19},"01M734AFNXD06Z78QRK0VKGT7Q","implementing-microsegmentation-with-guardicore","Implementing microsegmentation using Akamai Guardicore Segmentation to map application dependencies, create granular network policies, visualize east-west traffic flows, and enforce least-privilege communication between workloads across data centers and cloud.","https:\u002F\u002Fgithub.com\u002Fyanacuti1121\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-microsegmentation-with-guardicore\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-microsegmentation-with-guardicore\u002FSKILL.md",[],[],{"skillNo":92,"name":93,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":63,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":96,"publishedAt":19},"01M736TK27QMCXK0DVCH25SJN5","ramdisk-tmpfs-patterns","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Framdisk-tmpfs-patterns\u002FSKILL.md",[],[]]