[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FS0BR7GRZAV15Y4AMQVDEP":3,"skill-same:01M6FS0BR7GRZAV15Y4AMQVDEP":92},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":25,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":42,"repositoryHtmlUrl":43,"repositoryHomepageUrl":6,"ownerHtmlUrl":44,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":45,"install":46,"resources":59},"01M6FS0BR7GRZAV15Y4AMQVDEP","Fanvue",null,"Manage content, chats, subscribers, and earnings on the Fanvue creator platform via OAuth 2.0 API.","kbarbel640-del\u002Fskills","kbarbel640-del","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255315490?v=4","01M6CJPPQGCCESXMG3K7BBGQ5J","01M6CJPPX2PB2BCZERFVM2C2B3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Figorls\u002Ffanvue\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[5,26,27,28,29,30,31,32,33],"content","manage content","OAuth","api","manage","earnings","platform","via","2026-11-10 10:12:30",false,"---\nname: Fanvue\ndescription: Manage content, chats, subscribers, and earnings on the Fanvue creator platform via OAuth 2.0 API.\n---\n\n# Fanvue API Skill\n\nIntegrate with the Fanvue creator platform to manage chats, posts, subscribers, earnings insights, and media content.\n\n## Prerequisites\n\n### 1. Create an OAuth Application\n\n1. Go to the [Fanvue Developer Portal](https:\u002F\u002Ffanvue.com\u002Fdevelopers\u002Fapps)\n2. Create a new OAuth application\n3. Note your **Client ID** and **Client Secret**\n4. Configure your **Redirect URI** (e.g., `https:\u002F\u002Fyour-app.com\u002Fcallback`)\n\n### 2. Environment Variables\n\nSet these environment variables:\n\n```bash\nFANVUE_CLIENT_ID=your_client_id\nFANVUE_CLIENT_SECRET=your_client_secret\nFANVUE_REDIRECT_URI=https:\u002F\u002Fyour-app.com\u002Fcallback\n```\n\n---\n\n## Authentication\n\nFanvue uses **OAuth 2.0 with PKCE** (Proof Key for Code Exchange). All API requests require:\n\n- **Authorization Header**: `Bearer \u003Caccess_token>`\n- **API Version Header**: `X-Fanvue-API-Version: 2025-06-26`\n\n### OAuth Scopes\n\nRequest these scopes based on your needs:\n\n| Scope | Access |\n|-------|--------|\n| `openid` | OpenID Connect authentication |\n| `offline_access` | Refresh token support |\n| `offline` | Offline access |\n| `read:self` | Read authenticated user profile |\n| `read:chat` | Read chat conversations |\n| `write:chat` | Send messages, update chats |\n| `read:post` | Read posts |\n| `write:post` | Create posts |\n| `read:creator` | Read subscriber\u002Ffollower data |\n| `read:media` | Read media vault |\n| `write:tracking_links` | Manage campaign links |\n| `read:insights` | Read earnings\u002Fanalytics (creator accounts) |\n| `read:subscribers` | Read subscriber lists (creator accounts) |\n\n> **Note**: Some endpoints (subscribers, insights, earnings) require a **creator account** and may need additional scopes not listed in the public documentation.\n\n### Quick Auth Flow\n\n```typescript\nimport { randomBytes, createHash } from 'crypto';\n\n\u002F\u002F 1. Generate PKCE parameters\nconst codeVerifier = randomBytes(32).toString('base64url');\nconst codeChallenge = createHash('sha256')\n  .update(codeVerifier)\n  .digest('base64url');\n\n\u002F\u002F 2. Build authorization URL\nconst authUrl = new URL('https:\u002F\u002Fauth.fanvue.com\u002Foauth2\u002Fauth');\nauthUrl.searchParams.set('client_id', process.env.FANVUE_CLIENT_ID);\nauthUrl.searchParams.set('redirect_uri', process.env.FANVUE_REDIRECT_URI);\nauthUrl.searchParams.set('response_type', 'code');\nauthUrl.searchParams.set('scope', 'openid offline_access read:self read:chat write:chat read:post');\nauthUrl.searchParams.set('state', randomBytes(32).toString('hex'));\nauthUrl.searchParams.set('code_challenge', codeChallenge);\nauthUrl.searchParams.set('code_challenge_method', 'S256');\n\n\u002F\u002F Redirect user to: authUrl.toString()\n```\n\n```typescript\n\u002F\u002F 3. Exchange authorization code for tokens\nconst tokenResponse = await fetch('https:\u002F\u002Fauth.fanvue.com\u002Foauth2\u002Ftoken', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application\u002Fx-www-form-urlencoded' },\n  body: new URLSearchParams({\n    grant_type: 'authorization_code',\n    client_id: process.env.FANVUE_CLIENT_ID,\n    client_secret: process.env.FANVUE_CLIENT_SECRET,\n    code: authorizationCode,\n    redirect_uri: process.env.FANVUE_REDIRECT_URI,\n    code_verifier: codeVerifier,\n  }),\n});\n\nconst tokens = await tokenResponse.json();\n\u002F\u002F tokens.access_token, tokens.refresh_token\n```\n\n---\n\n## API Base URL\n\nAll API requests go to: `https:\u002F\u002Fapi.fanvue.com`\n\n### Standard Request Headers\n\n```typescript\nconst headers = {\n  'Authorization': `Bearer ${accessToken}`,\n  'X-Fanvue-API-Version': '2025-06-26',\n  'Content-Type': 'application\u002Fjson',\n};\n```\n\n---\n\n## Agent Automation\n\nThese workflows are designed for AI agents automating Fanvue creator accounts.\n\n### Accessing Images (with Signed URLs)\n\nThe basic `\u002Fmedia` endpoint only returns metadata. To get actual viewable URLs, use the `variants` query parameter:\n\n```typescript\n\u002F\u002F Step 1: List all media\nconst list = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fmedia', { headers });\nconst { data } = await list.json();\n\n\u002F\u002F Step 2: Get signed URLs for a specific media item\nconst media = await fetch(\n  `https:\u002F\u002Fapi.fanvue.com\u002Fmedia\u002F${uuid}?variants=main,thumbnail,blurred`, \n  { headers }\n);\nconst { variants } = await media.json();\n\n\u002F\u002F variants = [\n\u002F\u002F   { variantType: 'main', url: 'https:\u002F\u002Fmedia.fanvue.com\u002Fprivate\u002F...' },\n\u002F\u002F   { variantType: 'thumbnail', url: '...' },\n\u002F\u002F   { variantType: 'blurred', url: '...' }\n\u002F\u002F ]\n```\n\n**Variant Types:**\n- `main` - Full resolution original\n- `thumbnail` - Optimized preview (smaller)\n- `blurred` - Censored version for teasers\n\n### Creating a Post with Media\n\n```typescript\n\u002F\u002F Step 1: Have existing media UUIDs from vault\nconst mediaIds = ['media-uuid-1', 'media-uuid-2'];\n\n\u002F\u002F Step 2: Create post\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fposts', {\n  method: 'POST',\n  headers,\n  body: JSON.stringify({\n    text: 'Check out my new content! ?',\n    mediaIds,\n    audience: 'subscribers',  \u002F\u002F or 'followers-and-subscribers'\n    \u002F\u002F Optional:\n    price: null,              \u002F\u002F Set for pay-per-view\n    publishAt: null,          \u002F\u002F Set for scheduled posts\n  }),\n});\n```\n\n**Audience Options:**\n| Value | Who Can See |\n|-------|-------------|\n| `subscribers` | Paid subscribers only |\n| `followers-and-subscribers` | Both free followers and subscribers |\n\n### Sending Messages with Media\n\n```typescript\n\u002F\u002F Get subscriber list for decision making\nconst subs = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fcreators\u002Flist-subscribers', { headers });\nconst { data: subscribers } = await subs.json();\n\n\u002F\u002F Get top spenders for VIP targeting\nconst vips = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Finsights\u002Fget-top-spenders', { headers });\nconst { data: topSpenders } = await vips.json();\n\n\u002F\u002F Send personalized message with media\nawait fetch('https:\u002F\u002Fapi.fanvue.com\u002Fchat-messages', {\n  method: 'POST',\n  headers,\n  body: JSON.stringify({\n    recipientUuid: subscribers[0].userUuid,\n    content: 'Thanks for being a subscriber! Here\\'s something special for you ?',\n    mediaIds: ['vault-media-uuid'],  \u002F\u002F Attach media from vault\n  }),\n});\n\n\u002F\u002F Or send to multiple subscribers at once\nawait fetch('https:\u002F\u002Fapi.fanvue.com\u002Fchat-messages\u002Fmass', {\n  method: 'POST',\n  headers,\n  body: JSON.stringify({\n    recipientUuids: subscribers.map(s => s.userUuid),\n    content: 'New exclusive content just dropped! ?',\n    mediaIds: ['vault-media-uuid'],\n  }),\n});\n```\n\n### Agent Decision Context\n\nFor effective automation, gather this context:\n\n```typescript\ninterface AutomationContext {\n  \u002F\u002F Current media in vault\n  media: {\n    uuid: string;\n    name: string;\n    type: 'image' | 'video';\n    description: string;  \u002F\u002F AI-generated caption\n    signedUrl: string;    \u002F\u002F From variants query\n  }[];\n  \n  \u002F\u002F Audience data\n  subscribers: {\n    uuid: string;\n    name: string;\n    subscribedAt: string;\n    tier: string;\n  }[];\n  \n  \u002F\u002F Engagement signals\n  topSpenders: {\n    uuid: string;\n    totalSpent: number;\n  }[];\n  \n  \u002F\u002F Recent earnings for trend analysis\n  earnings: {\n    period: string;\n    total: number;\n    breakdown: { type: string; amount: number }[];\n  };\n}\n```\n\n---\n\n## Core Operations\n\n\n### Get Current User\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fusers\u002Fme', { headers });\nconst user = await response.json();\n```\n\n### List Chats\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fchats', { headers });\nconst { data, pagination } = await response.json();\n```\n\n### Send a Message\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fchat-messages', {\n  method: 'POST',\n  headers,\n  body: JSON.stringify({\n    recipientUuid: 'user-uuid-here',\n    content: 'Hello! Thanks for subscribing!',\n  }),\n});\n```\n\n### Create a Post\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fposts', {\n  method: 'POST',\n  headers,\n  body: JSON.stringify({\n    content: 'New content available!',\n    \u002F\u002F Add media IDs, pricing, etc.\n  }),\n});\n```\n\n### Get Earnings\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Finsights\u002Fget-earnings', { headers });\nconst earnings = await response.json();\n```\n\n### List Subscribers\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fcreators\u002Flist-subscribers', { headers });\nconst { data } = await response.json();\n```\n\n---\n\n## API Reference\n\nSee [api-reference.md](.\u002Fapi-reference.md) for the complete endpoint documentation.\n\n---\n\n## Token Refresh\n\nAccess tokens expire. Use the refresh token to get new ones:\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fauth.fanvue.com\u002Foauth2\u002Ftoken', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application\u002Fx-www-form-urlencoded' },\n  body: new URLSearchParams({\n    grant_type: 'refresh_token',\n    client_id: process.env.FANVUE_CLIENT_ID,\n    client_secret: process.env.FANVUE_CLIENT_SECRET,\n    refresh_token: currentRefreshToken,\n  }),\n});\n\nconst newTokens = await response.json();\n```\n\n---\n\n## Error Handling\n\nCommon HTTP status codes:\n\n| Status | Meaning |\n|--------|---------|\n| `200` | Success |\n| `400` | Bad request - check your parameters |\n| `401` | Unauthorized - token expired or invalid |\n| `403` | Forbidden - missing required scope |\n| `404` | Resource not found |\n| `429` | Rate limited - slow down requests |\n\n---\n\n## Resources\n\n- [Fanvue API Documentation](https:\u002F\u002Fapi.fanvue.com\u002Fdocs)\n- [OAuth 2.0 Guide](https:\u002F\u002Fapi.fanvue.com\u002Fdocs\u002Fauthentication\u002Fquick-start)\n- [Developer Portal](https:\u002F\u002Ffanvue.com\u002Fdevelopers\u002Fapps)\n- [Fanvue App Starter Kit](https:\u002F\u002Fgithub.com\u002Ffanvue\u002Ffanvue-app-starter)\n","# Fanvue API Skill\n\nIntegrate with the Fanvue creator platform to manage chats, posts, subscribers, earnings insights, and media content.\n\n## Prerequisites\n\n### 1. Create an OAuth Application\n\n1. Go to the [Fanvue Developer Portal](https:\u002F\u002Ffanvue.com\u002Fdevelopers\u002Fapps)\n2. Create a new OAuth application\n3. Note your **Client ID** and **Client Secret**\n4. Configure your **Redirect URI** (e.g., `https:\u002F\u002Fyour-app.com\u002Fcallback`)\n\n### 2. Environment Variables\n\nSet these environment variables:\n\n```bash\nFANVUE_CLIENT_ID=your_client_id\nFANVUE_CLIENT_SECRET=your_client_secret\nFANVUE_REDIRECT_URI=https:\u002F\u002Fyour-app.com\u002Fcallback\n```\n\n---\n\n## Authentication\n\nFanvue uses **OAuth 2.0 with PKCE** (Proof Key for Code Exchange). All API requests require:\n\n- **Authorization Header**: `Bearer \u003Caccess_token>`\n- **API Version Header**: `X-Fanvue-API-Version: 2025-06-26`\n\n### OAuth Scopes\n\nRequest these scopes based on your needs:\n\n| Scope | Access |\n|-------|--------|\n| `openid` | OpenID Connect authentication |\n| `offline_access` | Refresh token support |\n| `offline` | Offline access |\n| `read:self` | Read authenticated user profile |\n| `read:chat` | Read chat conversations |\n| `write:chat` | Send messages, update chats |\n| `read:post` | Read posts |\n| `write:post` | Create posts |\n| `read:creator` | Read subscriber\u002Ffollower data |\n| `read:media` | Read media vault |\n| `write:tracking_links` | Manage campaign links |\n| `read:insights` | Read earnings\u002Fanalytics (creator accounts) |\n| `read:subscribers` | Read subscriber lists (creator accounts) |\n\n> **Note**: Some endpoints (subscribers, insights, earnings) require a **creator account** and may need additional scopes not listed in the public documentation.\n\n### Quick Auth Flow\n\n```typescript\nimport { randomBytes, createHash } from 'crypto';\n\n\u002F\u002F 1. Generate PKCE parameters\nconst codeVerifier = randomBytes(32).toString('base64url');\nconst codeChallenge = createHash('sha256')\n  .update(codeVerifier)\n  .digest('base64url');\n\n\u002F\u002F 2. Build authorization URL\nconst authUrl = new URL('https:\u002F\u002Fauth.fanvue.com\u002Foauth2\u002Fauth');\nauthUrl.searchParams.set('client_id', process.env.FANVUE_CLIENT_ID);\nauthUrl.searchParams.set('redirect_uri', process.env.FANVUE_REDIRECT_URI);\nauthUrl.searchParams.set('response_type', 'code');\nauthUrl.searchParams.set('scope', 'openid offline_access read:self read:chat write:chat read:post');\nauthUrl.searchParams.set('state', randomBytes(32).toString('hex'));\nauthUrl.searchParams.set('code_challenge', codeChallenge);\nauthUrl.searchParams.set('code_challenge_method', 'S256');\n\n\u002F\u002F Redirect user to: authUrl.toString()\n```\n\n```typescript\n\u002F\u002F 3. Exchange authorization code for tokens\nconst tokenResponse = await fetch('https:\u002F\u002Fauth.fanvue.com\u002Foauth2\u002Ftoken', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application\u002Fx-www-form-urlencoded' },\n  body: new URLSearchParams({\n    grant_type: 'authorization_code',\n    client_id: process.env.FANVUE_CLIENT_ID,\n    client_secret: process.env.FANVUE_CLIENT_SECRET,\n    code: authorizationCode,\n    redirect_uri: process.env.FANVUE_REDIRECT_URI,\n    code_verifier: codeVerifier,\n  }),\n});\n\nconst tokens = await tokenResponse.json();\n\u002F\u002F tokens.access_token, tokens.refresh_token\n```\n\n---\n\n## API Base URL\n\nAll API requests go to: `https:\u002F\u002Fapi.fanvue.com`\n\n### Standard Request Headers\n\n```typescript\nconst headers = {\n  'Authorization': `Bearer ${accessToken}`,\n  'X-Fanvue-API-Version': '2025-06-26',\n  'Content-Type': 'application\u002Fjson',\n};\n```\n\n---\n\n## Agent Automation\n\nThese workflows are designed for AI agents automating Fanvue creator accounts.\n\n### Accessing Images (with Signed URLs)\n\nThe basic `\u002Fmedia` endpoint only returns metadata. To get actual viewable URLs, use the `variants` query parameter:\n\n```typescript\n\u002F\u002F Step 1: List all media\nconst list = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fmedia', { headers });\nconst { data } = await list.json();\n\n\u002F\u002F Step 2: Get signed URLs for a specific media item\nconst media = await fetch(\n  `https:\u002F\u002Fapi.fanvue.com\u002Fmedia\u002F${uuid}?variants=main,thumbnail,blurred`, \n  { headers }\n);\nconst { variants } = await media.json();\n\n\u002F\u002F variants = [\n\u002F\u002F   { variantType: 'main', url: 'https:\u002F\u002Fmedia.fanvue.com\u002Fprivate\u002F...' },\n\u002F\u002F   { variantType: 'thumbnail', url: '...' },\n\u002F\u002F   { variantType: 'blurred', url: '...' }\n\u002F\u002F ]\n```\n\n**Variant Types:**\n- `main` - Full resolution original\n- `thumbnail` - Optimized preview (smaller)\n- `blurred` - Censored version for teasers\n\n### Creating a Post with Media\n\n```typescript\n\u002F\u002F Step 1: Have existing media UUIDs from vault\nconst mediaIds = ['media-uuid-1', 'media-uuid-2'];\n\n\u002F\u002F Step 2: Create post\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fposts', {\n  method: 'POST',\n  headers,\n  body: JSON.stringify({\n    text: 'Check out my new content! ?',\n    mediaIds,\n    audience: 'subscribers',  \u002F\u002F or 'followers-and-subscribers'\n    \u002F\u002F Optional:\n    price: null,              \u002F\u002F Set for pay-per-view\n    publishAt: null,          \u002F\u002F Set for scheduled posts\n  }),\n});\n```\n\n**Audience Options:**\n| Value | Who Can See |\n|-------|-------------|\n| `subscribers` | Paid subscribers only |\n| `followers-and-subscribers` | Both free followers and subscribers |\n\n### Sending Messages with Media\n\n```typescript\n\u002F\u002F Get subscriber list for decision making\nconst subs = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fcreators\u002Flist-subscribers', { headers });\nconst { data: subscribers } = await subs.json();\n\n\u002F\u002F Get top spenders for VIP targeting\nconst vips = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Finsights\u002Fget-top-spenders', { headers });\nconst { data: topSpenders } = await vips.json();\n\n\u002F\u002F Send personalized message with media\nawait fetch('https:\u002F\u002Fapi.fanvue.com\u002Fchat-messages', {\n  method: 'POST',\n  headers,\n  body: JSON.stringify({\n    recipientUuid: subscribers[0].userUuid,\n    content: 'Thanks for being a subscriber! Here\\'s something special for you ?',\n    mediaIds: ['vault-media-uuid'],  \u002F\u002F Attach media from vault\n  }),\n});\n\n\u002F\u002F Or send to multiple subscribers at once\nawait fetch('https:\u002F\u002Fapi.fanvue.com\u002Fchat-messages\u002Fmass', {\n  method: 'POST',\n  headers,\n  body: JSON.stringify({\n    recipientUuids: subscribers.map(s => s.userUuid),\n    content: 'New exclusive content just dropped! ?',\n    mediaIds: ['vault-media-uuid'],\n  }),\n});\n```\n\n### Agent Decision Context\n\nFor effective automation, gather this context:\n\n```typescript\ninterface AutomationContext {\n  \u002F\u002F Current media in vault\n  media: {\n    uuid: string;\n    name: string;\n    type: 'image' | 'video';\n    description: string;  \u002F\u002F AI-generated caption\n    signedUrl: string;    \u002F\u002F From variants query\n  }[];\n  \n  \u002F\u002F Audience data\n  subscribers: {\n    uuid: string;\n    name: string;\n    subscribedAt: string;\n    tier: string;\n  }[];\n  \n  \u002F\u002F Engagement signals\n  topSpenders: {\n    uuid: string;\n    totalSpent: number;\n  }[];\n  \n  \u002F\u002F Recent earnings for trend analysis\n  earnings: {\n    period: string;\n    total: number;\n    breakdown: { type: string; amount: number }[];\n  };\n}\n```\n\n---\n\n## Core Operations\n\n\n### Get Current User\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fusers\u002Fme', { headers });\nconst user = await response.json();\n```\n\n### List Chats\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fchats', { headers });\nconst { data, pagination } = await response.json();\n```\n\n### Send a Message\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fchat-messages', {\n  method: 'POST',\n  headers,\n  body: JSON.stringify({\n    recipientUuid: 'user-uuid-here',\n    content: 'Hello! Thanks for subscribing!',\n  }),\n});\n```\n\n### Create a Post\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fposts', {\n  method: 'POST',\n  headers,\n  body: JSON.stringify({\n    content: 'New content available!',\n    \u002F\u002F Add media IDs, pricing, etc.\n  }),\n});\n```\n\n### Get Earnings\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Finsights\u002Fget-earnings', { headers });\nconst earnings = await response.json();\n```\n\n### List Subscribers\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fapi.fanvue.com\u002Fcreators\u002Flist-subscribers', { headers });\nconst { data } = await response.json();\n```\n\n---\n\n## API Reference\n\nSee [api-reference.md](.\u002Fapi-reference.md) for the complete endpoint documentation.\n\n---\n\n## Token Refresh\n\nAccess tokens expire. Use the refresh token to get new ones:\n\n```typescript\nconst response = await fetch('https:\u002F\u002Fauth.fanvue.com\u002Foauth2\u002Ftoken', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application\u002Fx-www-form-urlencoded' },\n  body: new URLSearchParams({\n    grant_type: 'refresh_token',\n    client_id: process.env.FANVUE_CLIENT_ID,\n    client_secret: process.env.FANVUE_CLIENT_SECRET,\n    refresh_token: currentRefreshToken,\n  }),\n});\n\nconst newTokens = await response.json();\n```\n\n---\n\n## Error Handling\n\nCommon HTTP status codes:\n\n| Status | Meaning |\n|--------|---------|\n| `200` | Success |\n| `400` | Bad request - check your parameters |\n| `401` | Unauthorized - token expired or invalid |\n| `403` | Forbidden - missing required scope |\n| `404` | Resource not found |\n| `429` | Rate limited - slow down requests |\n\n---\n\n## Resources\n\n- [Fanvue API Documentation](https:\u002F\u002Fapi.fanvue.com\u002Fdocs)\n- [OAuth 2.0 Guide](https:\u002F\u002Fapi.fanvue.com\u002Fdocs\u002Fauthentication\u002Fquick-start)\n- [Developer Portal](https:\u002F\u002Ffanvue.com\u002Fdevelopers\u002Fapps)\n- [Fanvue App Starter Kit](https:\u002F\u002Fgithub.com\u002Ffanvue\u002Ffanvue-app-starter)\n",{"name":5,"description":7},"main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Figorls\u002Ffanvue",0,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del","2026-08-23 22:39:37",{"source":8,"skillName":5,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add kbarbel640-del\u002Fskills --skill Fanvue",{"tool":52,"command":53},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill Fanvue",{"tool":55,"command":56},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill Fanvue","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Figorls\u002Ffanvue\u002FSKILL.md",true,[60,66,70,76,80,84,88],{"path":61,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":65},"_meta.json","REFERENCE","参考文档",264,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Figorls\u002Ffanvue\u002F_meta.json",{"path":67,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":68,"sourceHtmlUrl":69},"api-reference.md",7717,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Figorls\u002Ffanvue\u002Fapi-reference.md",{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"examples\u002Fauth.ts","SCRIPT","脚本",5384,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Figorls\u002Ffanvue\u002Fexamples\u002Fauth.ts",{"path":77,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":78,"sourceHtmlUrl":79},"examples\u002Fchat-operations.ts",5197,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Figorls\u002Ffanvue\u002Fexamples\u002Fchat-operations.ts",{"path":81,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":82,"sourceHtmlUrl":83},"examples\u002Finsights.ts",4831,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Figorls\u002Ffanvue\u002Fexamples\u002Finsights.ts",{"path":85,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":86,"sourceHtmlUrl":87},"examples\u002Fpost-operations.ts",4687,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Figorls\u002Ffanvue\u002Fexamples\u002Fpost-operations.ts",{"path":89,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":90,"sourceHtmlUrl":91},"schemas\u002Fresponses.ts",4791,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Figorls\u002Ffanvue\u002Fschemas\u002Fresponses.ts",[93,122,147,167,173,193],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":104,"publishedAt":34},"01M6G8J55967D6281ACMKAKTEQ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[99],{"categoryNo":100,"categoryName":101,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[105,106,29,107,108,109,110,111,112,113,114,115,116,117,118,119,120,26,121],"crowd prompting","prompting","with","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","https","ai agents",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":129,"publishedAt":34},"01M6G8J0PKPAYVET6BWE8W4C26","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[128],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[130,29,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,111,146],"dilemm ai","arena","analyze","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":156,"publishedAt":34},"01M6G8HWAF3K9SW7NP3Z83CPJ6","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, and submit comments. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, or submitting paper reviews via API at http:\u002F\u002F150.158.152.82:8000.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Fweak-accept\u002FSKILL.md",[153],{"categoryNo":154,"categoryName":155,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000021","资料检索与研究",[157,158,159,160,161,162,163,107,164,144,146,165,29,166,33],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http",{"skillNo":168,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":172,"publishedAt":34},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[171],{"categoryNo":154,"categoryName":155,"taxonomyType":20,"taxonomyTypeDesc":21},[160,159,158,157,33,162,163,107,161,144,146,164,165,29,166],{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":179,"publishedAt":34},"01M6G8HM95Y64JNVFC2HN4E2BG","git-summary","Get a quick summary of the current Git repository including status, recent commits, branches, and contributors.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzweack\u002Fgit-summary\u002FSKILL.md",[],[180,181,182,183,184,185,186,187,188,189,190,191,192],"git","summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":197,"categories":198,"keywords":203,"publishedAt":34},"01M6G8HGEGF05CNEJCGVYFSC4R","agent-constitution","Interact with AgentConstitution governance contracts on Base Sepolia. Check compliance, read rules, log actions, query governance state.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fztsalexey\u002Fagent-constitution\u002FSKILL.md",[199,200],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":201,"categoryName":202,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000037","律师与法务",[204,205,206,207,107,208,209,39,210,165,211,212,213,214,215,120,216,217,218],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","projects","compliance","actions","state","governance","github"]