{
  "schemaVersion": "1.0",
  "item": {
    "slug": "vincent-twitter",
    "name": "Vincent - Twitter",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/glitch003/vincent-twitter",
    "canonicalUrl": "https://clawhub.ai/glitch003/vincent-twitter",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/vincent-twitter",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=vincent-twitter",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/vincent-twitter"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/vincent-twitter",
    "agentPageUrl": "https://openagent3.xyz/skills/vincent-twitter/agent",
    "manifestUrl": "https://openagent3.xyz/skills/vincent-twitter/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/vincent-twitter/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Vincent - Twitter / X.com for agents",
        "body": "Use this skill to search tweets, look up user profiles, and retrieve recent tweets from X.com (Twitter). All requests are proxied through the Vincent backend, which handles authentication with the X API, enforces rate limits, tracks per-call costs, and deducts from your credit balance automatically.\n\nNo API keys to manage. The agent authenticates with a Vincent API key scoped to a DATA_SOURCES secret. Vincent handles the upstream Twitter API credentials server-side -- the agent never sees or manages Twitter API keys.\n\nAll commands use the @vincentai/cli package. API keys are stored and resolved automatically — you never handle raw keys or file paths."
      },
      {
        "title": "Security Model",
        "body": "This skill is designed for autonomous agent operation with pay-per-call pricing and human oversight.\n\nNo environment variables are required because this skill uses agent-first onboarding: the agent creates a DATA_SOURCES secret at runtime by calling the Vincent API, which returns a scoped API key. The CLI stores the returned API key automatically during creation. The config paths where the key is persisted (${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/credentials/datasources/ or ./datasources/) are declared in this skill's metadata.\n\nThe agent's API key is not a Twitter API key. It is a scoped Bearer token for the Vincent proxy. The Vincent server authenticates with Twitter on the agent's behalf. The agent cannot access the upstream API directly or bypass the proxy's credit and rate-limit enforcement.\n\nModel invocation is intentionally enabled. The purpose of this skill is to give AI agents autonomous access to Twitter data. The agent is expected to search tweets and look up profiles on its own. The human controls spending through credit balance and payment method management at https://heyvincent.ai.\n\nAll API calls go exclusively to heyvincent.ai over HTTPS/TLS. The Vincent server then calls the Twitter API. The agent does not contact Twitter directly.\n\nKey lifecycle:\n\nCreation: The agent runs secret create with --type DATA_SOURCES — the CLI stores the API key automatically and returns a keyId and claimUrl.\nClaim: The human operator uses the claim URL to take ownership, add credit, and manage payment at https://heyvincent.ai.\nCredit: Each API call costs a small amount (see Pricing below). The human adds credit via the frontend. Calls are rejected when credit runs out and no payment method is on file.\nRevocation: The secret owner can revoke the agent's API key at any time from the Vincent frontend."
      },
      {
        "title": "Pricing",
        "body": "EndpointCost per callSearch tweets$0.01Get tweet by ID$0.005Get user profile$0.005Get user's tweets$0.01\n\nCredit is deducted automatically per call. The response includes _vincent.creditRemainingUsd so the agent can track remaining balance."
      },
      {
        "title": "1. Check for Existing Keys",
        "body": "Before creating a new secret, check if one already exists:\n\nnpx @vincentai/cli@latest secret list --type DATA_SOURCES\n\nIf a key is returned, use its id as the --key-id for all subsequent commands. If no keys exist, create a new secret."
      },
      {
        "title": "2. Create a Data Sources Secret",
        "body": "npx @vincentai/cli@latest secret create --type DATA_SOURCES --memo \"My agent data sources\"\n\nReturns keyId (use for all future commands) and claimUrl (share with the user).\n\nAfter creating, tell the user:\n\n\"Here is your data sources claim URL: <claimUrl>. Use this to claim ownership and add credit for Twitter and other data sources at https://heyvincent.ai.\"\n\nImportant: The secret must be claimed and have credit (or a payment method on file) before API calls will succeed."
      },
      {
        "title": "3. Search Tweets",
        "body": "npx @vincentai/cli@latest twitter search --key-id <KEY_ID> --q bitcoin --max-results 10\n\nParameters:\n\n--q (required): Search query (1-512 characters)\n--max-results (optional): Number of results, 10-100 (default: 10)\n--start-time (optional): ISO 8601 datetime, earliest tweets to return\n--end-time (optional): ISO 8601 datetime, latest tweets to return\n\nReturns tweet text, creation time, author ID, and public metrics (likes, retweets, replies)."
      },
      {
        "title": "4. Get a Specific Tweet",
        "body": "npx @vincentai/cli@latest twitter tweet --key-id <KEY_ID> --tweet-id <TWEET_ID>"
      },
      {
        "title": "5. Get User Profile",
        "body": "Look up a Twitter user by username.\n\nnpx @vincentai/cli@latest twitter user --key-id <KEY_ID> --username elonmusk\n\nReturns the user's description, follower/following counts, profile image, and verified status."
      },
      {
        "title": "6. Get a User's Recent Tweets",
        "body": "npx @vincentai/cli@latest twitter user-tweets --key-id <KEY_ID> --user-id <USER_ID> --max-results 10\n\nNote: This command requires the user's numeric ID (from the user profile response), not the username."
      },
      {
        "title": "Response Metadata",
        "body": "Every successful response includes a _vincent object with:\n\n{\n  \"_vincent\": {\n    \"costUsd\": 0.01,\n    \"creditRemainingUsd\": 4.99\n  }\n}\n\nUse creditRemainingUsd to warn the user when credit is running low."
      },
      {
        "title": "Output Format",
        "body": "Tweet search results:\n\n{\n  \"data\": [\n    {\n      \"id\": \"123456789\",\n      \"text\": \"Tweet content here\",\n      \"created_at\": \"2026-02-26T12:00:00.000Z\",\n      \"author_id\": \"987654321\",\n      \"public_metrics\": {\n        \"like_count\": 42,\n        \"retweet_count\": 10,\n        \"reply_count\": 5\n      }\n    }\n  ],\n  \"_vincent\": {\n    \"costUsd\": 0.01,\n    \"creditRemainingUsd\": 4.99\n  }\n}\n\nUser profile responses include description, public_metrics (followers/following counts), profile_image_url, and verified."
      },
      {
        "title": "Error Handling",
        "body": "ErrorCauseResolution401 UnauthorizedInvalid or missing API keyCheck that the key-id is correct; re-link if needed402 Insufficient CreditCredit balance is zero and no payment method on fileUser must add credit at heyvincent.ai429 Rate LimitedExceeded 60 requests/minuteWait and retry with backoffKey not foundAPI key was revoked or never createdRe-link with a new token from the secret ownerUser not foundUsername doesn't exist on TwitterVerify the username spelling"
      },
      {
        "title": "Rate Limits",
        "body": "60 requests per minute per API key across all data source endpoints (Twitter + Brave Search combined)\nIf rate limited, you'll receive a 429 response. Wait and retry."
      },
      {
        "title": "Re-linking (Recovering API Access)",
        "body": "If the agent loses its API key, the secret owner can generate a re-link token from the frontend. The agent then exchanges this token for a new API key.\n\nnpx @vincentai/cli@latest secret relink --token <TOKEN_FROM_USER>\n\nThe CLI exchanges the token for a new API key, stores it automatically, and returns the new keyId. Re-link tokens are one-time use and expire after 10 minutes."
      },
      {
        "title": "Adding Credits",
        "body": "When your credit balance runs low, you can purchase more credits autonomously using USDC on Base via the x402 payment protocol — no human intervention required.\n\nAvailable tiers: $1, $5, $10, $25, $50, $100"
      },
      {
        "title": "Check Balance",
        "body": "npx @vincentai/cli@latest credits balance --key-id <KEY_ID>"
      },
      {
        "title": "Purchase Credits via x402 (USDC on Base)",
        "body": "npx @vincentai/cli@latest credits add --key-id <KEY_ID> --amount 10\n\nHow it works:\n\nThe CLI sends a POST request to the x402 credit endpoint\nThe server returns HTTP 402 with a dynamic USDC deposit address on Base\nThe CLI signs the payment using your agent's wallet\nThe CLI retries the request with the payment proof\nThe server verifies the payment and adds credits to your account\n\nRequirements:\n\nAn x402-compatible wallet with USDC on Base (chain ID 8453)\nYour Vincent DATA_SOURCES API key"
      },
      {
        "title": "Purchase Credits via Card (Human)",
        "body": "npx @vincentai/cli@latest credits checkout --key-id <KEY_ID>\n\nReturns a Stripe Checkout URL. Share this with the user to complete payment with a card."
      },
      {
        "title": "MCP Tools",
        "body": "ToolDescriptionvincent_credit_balanceCheck current credit balance and top-up optionsvincent_add_creditsGet x402 payment instructions for purchasing credits"
      },
      {
        "title": "Auto-Replenish Pattern",
        "body": "For long-running agents, check your balance before expensive operations and top up when low:\n\nBALANCE=$(npx @vincentai/cli@latest credits balance --key-id <KEY_ID> --json | jq -r '.balance')\nif (( $(echo \"$BALANCE < 2.00\" | bc -l) )); then\n  npx @vincentai/cli@latest credits add --key-id <KEY_ID> --amount 10\nfi"
      },
      {
        "title": "Important Notes",
        "body": "A single DATA_SOURCES API key works for all data sources (Twitter, Brave Search, etc.). You do not need a separate key per data source.\nAlways share the claim URL with the user after creating a secret.\nIf a call is rejected with a credit error, tell the user to add credit at https://heyvincent.ai.\nThe Twitter search endpoint only returns tweets from the last 7 days (X API v2 limitation for recent search)."
      }
    ],
    "body": "Vincent - Twitter / X.com for agents\n\nUse this skill to search tweets, look up user profiles, and retrieve recent tweets from X.com (Twitter). All requests are proxied through the Vincent backend, which handles authentication with the X API, enforces rate limits, tracks per-call costs, and deducts from your credit balance automatically.\n\nNo API keys to manage. The agent authenticates with a Vincent API key scoped to a DATA_SOURCES secret. Vincent handles the upstream Twitter API credentials server-side -- the agent never sees or manages Twitter API keys.\n\nAll commands use the @vincentai/cli package. API keys are stored and resolved automatically — you never handle raw keys or file paths.\n\nSecurity Model\n\nThis skill is designed for autonomous agent operation with pay-per-call pricing and human oversight.\n\nNo environment variables are required because this skill uses agent-first onboarding: the agent creates a DATA_SOURCES secret at runtime by calling the Vincent API, which returns a scoped API key. The CLI stores the returned API key automatically during creation. The config paths where the key is persisted (${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/credentials/datasources/ or ./datasources/) are declared in this skill's metadata.\n\nThe agent's API key is not a Twitter API key. It is a scoped Bearer token for the Vincent proxy. The Vincent server authenticates with Twitter on the agent's behalf. The agent cannot access the upstream API directly or bypass the proxy's credit and rate-limit enforcement.\n\nModel invocation is intentionally enabled. The purpose of this skill is to give AI agents autonomous access to Twitter data. The agent is expected to search tweets and look up profiles on its own. The human controls spending through credit balance and payment method management at https://heyvincent.ai.\n\nAll API calls go exclusively to heyvincent.ai over HTTPS/TLS. The Vincent server then calls the Twitter API. The agent does not contact Twitter directly.\n\nKey lifecycle:\n\nCreation: The agent runs secret create with --type DATA_SOURCES — the CLI stores the API key automatically and returns a keyId and claimUrl.\nClaim: The human operator uses the claim URL to take ownership, add credit, and manage payment at https://heyvincent.ai.\nCredit: Each API call costs a small amount (see Pricing below). The human adds credit via the frontend. Calls are rejected when credit runs out and no payment method is on file.\nRevocation: The secret owner can revoke the agent's API key at any time from the Vincent frontend.\nPricing\nEndpoint\tCost per call\nSearch tweets\t$0.01\nGet tweet by ID\t$0.005\nGet user profile\t$0.005\nGet user's tweets\t$0.01\n\nCredit is deducted automatically per call. The response includes _vincent.creditRemainingUsd so the agent can track remaining balance.\n\nQuick Start\n1. Check for Existing Keys\n\nBefore creating a new secret, check if one already exists:\n\nnpx @vincentai/cli@latest secret list --type DATA_SOURCES\n\n\nIf a key is returned, use its id as the --key-id for all subsequent commands. If no keys exist, create a new secret.\n\n2. Create a Data Sources Secret\nnpx @vincentai/cli@latest secret create --type DATA_SOURCES --memo \"My agent data sources\"\n\n\nReturns keyId (use for all future commands) and claimUrl (share with the user).\n\nAfter creating, tell the user:\n\n\"Here is your data sources claim URL: <claimUrl>. Use this to claim ownership and add credit for Twitter and other data sources at https://heyvincent.ai.\"\n\nImportant: The secret must be claimed and have credit (or a payment method on file) before API calls will succeed.\n\n3. Search Tweets\nnpx @vincentai/cli@latest twitter search --key-id <KEY_ID> --q bitcoin --max-results 10\n\n\nParameters:\n\n--q (required): Search query (1-512 characters)\n--max-results (optional): Number of results, 10-100 (default: 10)\n--start-time (optional): ISO 8601 datetime, earliest tweets to return\n--end-time (optional): ISO 8601 datetime, latest tweets to return\n\nReturns tweet text, creation time, author ID, and public metrics (likes, retweets, replies).\n\n4. Get a Specific Tweet\nnpx @vincentai/cli@latest twitter tweet --key-id <KEY_ID> --tweet-id <TWEET_ID>\n\n5. Get User Profile\n\nLook up a Twitter user by username.\n\nnpx @vincentai/cli@latest twitter user --key-id <KEY_ID> --username elonmusk\n\n\nReturns the user's description, follower/following counts, profile image, and verified status.\n\n6. Get a User's Recent Tweets\nnpx @vincentai/cli@latest twitter user-tweets --key-id <KEY_ID> --user-id <USER_ID> --max-results 10\n\n\nNote: This command requires the user's numeric ID (from the user profile response), not the username.\n\nResponse Metadata\n\nEvery successful response includes a _vincent object with:\n\n{\n  \"_vincent\": {\n    \"costUsd\": 0.01,\n    \"creditRemainingUsd\": 4.99\n  }\n}\n\n\nUse creditRemainingUsd to warn the user when credit is running low.\n\nOutput Format\n\nTweet search results:\n\n{\n  \"data\": [\n    {\n      \"id\": \"123456789\",\n      \"text\": \"Tweet content here\",\n      \"created_at\": \"2026-02-26T12:00:00.000Z\",\n      \"author_id\": \"987654321\",\n      \"public_metrics\": {\n        \"like_count\": 42,\n        \"retweet_count\": 10,\n        \"reply_count\": 5\n      }\n    }\n  ],\n  \"_vincent\": {\n    \"costUsd\": 0.01,\n    \"creditRemainingUsd\": 4.99\n  }\n}\n\n\nUser profile responses include description, public_metrics (followers/following counts), profile_image_url, and verified.\n\nError Handling\nError\tCause\tResolution\n401 Unauthorized\tInvalid or missing API key\tCheck that the key-id is correct; re-link if needed\n402 Insufficient Credit\tCredit balance is zero and no payment method on file\tUser must add credit at heyvincent.ai\n429 Rate Limited\tExceeded 60 requests/minute\tWait and retry with backoff\nKey not found\tAPI key was revoked or never created\tRe-link with a new token from the secret owner\nUser not found\tUsername doesn't exist on Twitter\tVerify the username spelling\nRate Limits\n60 requests per minute per API key across all data source endpoints (Twitter + Brave Search combined)\nIf rate limited, you'll receive a 429 response. Wait and retry.\nRe-linking (Recovering API Access)\n\nIf the agent loses its API key, the secret owner can generate a re-link token from the frontend. The agent then exchanges this token for a new API key.\n\nnpx @vincentai/cli@latest secret relink --token <TOKEN_FROM_USER>\n\n\nThe CLI exchanges the token for a new API key, stores it automatically, and returns the new keyId. Re-link tokens are one-time use and expire after 10 minutes.\n\nAdding Credits\n\nWhen your credit balance runs low, you can purchase more credits autonomously using USDC on Base via the x402 payment protocol — no human intervention required.\n\nAvailable tiers: $1, $5, $10, $25, $50, $100\n\nCheck Balance\nnpx @vincentai/cli@latest credits balance --key-id <KEY_ID>\n\nPurchase Credits via x402 (USDC on Base)\nnpx @vincentai/cli@latest credits add --key-id <KEY_ID> --amount 10\n\n\nHow it works:\n\nThe CLI sends a POST request to the x402 credit endpoint\nThe server returns HTTP 402 with a dynamic USDC deposit address on Base\nThe CLI signs the payment using your agent's wallet\nThe CLI retries the request with the payment proof\nThe server verifies the payment and adds credits to your account\n\nRequirements:\n\nAn x402-compatible wallet with USDC on Base (chain ID 8453)\nYour Vincent DATA_SOURCES API key\nPurchase Credits via Card (Human)\nnpx @vincentai/cli@latest credits checkout --key-id <KEY_ID>\n\n\nReturns a Stripe Checkout URL. Share this with the user to complete payment with a card.\n\nMCP Tools\nTool\tDescription\nvincent_credit_balance\tCheck current credit balance and top-up options\nvincent_add_credits\tGet x402 payment instructions for purchasing credits\nAuto-Replenish Pattern\n\nFor long-running agents, check your balance before expensive operations and top up when low:\n\nBALANCE=$(npx @vincentai/cli@latest credits balance --key-id <KEY_ID> --json | jq -r '.balance')\nif (( $(echo \"$BALANCE < 2.00\" | bc -l) )); then\n  npx @vincentai/cli@latest credits add --key-id <KEY_ID> --amount 10\nfi\n\nImportant Notes\nA single DATA_SOURCES API key works for all data sources (Twitter, Brave Search, etc.). You do not need a separate key per data source.\nAlways share the claim URL with the user after creating a secret.\nIf a call is rejected with a credit error, tell the user to add credit at https://heyvincent.ai.\nThe Twitter search endpoint only returns tweets from the last 7 days (X API v2 limitation for recent search)."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/glitch003/vincent-twitter",
    "publisherUrl": "https://clawhub.ai/glitch003/vincent-twitter",
    "owner": "glitch003",
    "version": "1.0.69",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/vincent-twitter",
    "downloadUrl": "https://openagent3.xyz/downloads/vincent-twitter",
    "agentUrl": "https://openagent3.xyz/skills/vincent-twitter/agent",
    "manifestUrl": "https://openagent3.xyz/skills/vincent-twitter/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/vincent-twitter/agent.md"
  }
}