{
  "schemaVersion": "1.0",
  "item": {
    "slug": "twitterapi-io",
    "name": "TwitterAPI.io",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/dorukardahan/twitterapi-io",
    "canonicalUrl": "https://clawhub.ai/dorukardahan/twitterapi-io",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/twitterapi-io",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=twitterapi-io",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "CHANGELOG.md",
      "README.md",
      "SKILL.md",
      "references/endpoint-index.md",
      "references/read-endpoints.md",
      "references/webhook-stream-endpoints.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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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/twitterapi-io"
    },
    "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/twitterapi-io",
    "agentPageUrl": "https://openagent3.xyz/skills/twitterapi-io/agent",
    "manifestUrl": "https://openagent3.xyz/skills/twitterapi-io/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/twitterapi-io/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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "TwitterAPI.io skill v3.5.0",
        "body": "Access Twitter/X data and perform actions via TwitterAPI.io REST API.\nUse TwitterAPI.io REST API for read, write, webhook, and stream operations.\n\nDocs: https://docs.twitterapi.io | Dashboard: https://twitterapi.io/dashboard"
      },
      {
        "title": "Setup",
        "body": "Get API key: https://twitterapi.io/dashboard ($0.10 free credits, no CC)\nStore the key in a .env file or your shell's secure config (do not use raw export with the actual key in the terminal -- it gets saved to shell history).\nFor write actions, you also need login_cookies from v2 login + residential proxy.\n\nBase URL: https://api.twitterapi.io\nAuth header: X-API-Key: $TWITTERAPI_IO_KEY (all requests)"
      },
      {
        "title": "Pricing (credit-based, 1 USD = 100,000 credits)",
        "body": "ResourceCreditsApprox $/1KTweets (per returned tweet)15$0.15Profiles (per returned profile)18$0.18Profiles batch 100+ (per profile)10$0.10Followers (per returned follower)15$0.15Verified followers (per follower)30$0.30Minimum per API call15$0.00015List endpoint calls150$0.0015Check follow relationship100$0.001Get article100$0.001Community info20$0.0002Write actions (tweet, like, RT, follow)200-300$0.002-0.003Login300$0.003\n\nNote: If the API returns 0 or 1 item, you are still charged the minimum (15 credits)."
      },
      {
        "title": "QPS (rate limits) -- balance-based",
        "body": "Account Balance (Credits)QPS Limit< 1,000 (free tier)1 req / 5 sec>= 1,0003>= 5,0006>= 10,00010>= 50,00020"
      },
      {
        "title": "API Version Note",
        "body": "All V1 endpoints have been removed from the API. Use only V2 endpoints (_v2 suffix) for write operations.\nV2 requires login_cookies (from user_login_v2) + residential proxy."
      },
      {
        "title": "login_cookie vs login_cookies -- API Inconsistency",
        "body": "The API has an inconsistency in naming:\n\nuser_login_v2 response returns the field as login_cookie (singular)\nAll v2 action endpoints expect the field as login_cookies (plural)\n\nAlways use login_cookies (plural) in request bodies. The value is the same string."
      },
      {
        "title": "Tweet object (from search, replies, etc.)",
        "body": "{\n  \"type\": \"tweet\",\n  \"id\": \"1234567890\",\n  \"url\": \"https://x.com/user/status/1234567890\",\n  \"text\": \"Tweet content...\",\n  \"source\": \"Twitter Web App\",\n  \"retweetCount\": 5,\n  \"replyCount\": 2,\n  \"likeCount\": 42,\n  \"quoteCount\": 1,\n  \"viewCount\": 1500,\n  \"bookmarkCount\": 3,\n  \"createdAt\": \"Sun Feb 08 12:00:00 +0000 2026\",\n  \"lang\": \"en\",\n  \"isReply\": false,\n  \"inReplyToId\": null,\n  \"inReplyToUserId\": null,\n  \"inReplyToUsername\": null,\n  \"conversationId\": \"1234567890\",\n  \"displayTextRange\": [0, 280],\n  \"isLimitedReply\": false,\n  \"author\": { \"...User Object...\" },\n  \"entities\": {\n    \"hashtags\": [{ \"text\": \"AI\", \"indices\": [10, 13] }],\n    \"urls\": [{ \"display_url\": \"example.com\", \"expanded_url\": \"https://example.com\", \"url\": \"https://t.co/xxx\" }],\n    \"user_mentions\": [{ \"id_str\": \"123\", \"name\": \"Someone\", \"screen_name\": \"someone\" }]\n  },\n  \"quoted_tweet\": null,\n  \"retweeted_tweet\": null\n}"
      },
      {
        "title": "User object",
        "body": "{\n  \"type\": \"user\",\n  \"id\": \"999888777\",\n  \"userName\": \"elonmusk\",\n  \"name\": \"Elon Musk\",\n  \"url\": \"https://x.com/elonmusk\",\n  \"isBlueVerified\": true,\n  \"verifiedType\": \"none\",\n  \"profilePicture\": \"https://pbs.twimg.com/...\",\n  \"coverPicture\": \"https://pbs.twimg.com/...\",\n  \"description\": \"Bio text...\",\n  \"location\": \"Mars\",\n  \"followers\": 200000000,\n  \"following\": 800,\n  \"canDm\": false,\n  \"favouritesCount\": 50000,\n  \"mediaCount\": 2000,\n  \"statusesCount\": 30000,\n  \"createdAt\": \"Tue Jun 02 20:12:29 +0000 2009\",\n  \"pinnedTweetIds\": [\"1234567890\"],\n  \"isAutomated\": false,\n  \"possiblySensitive\": false,\n  \"profile_bio\": {\n    \"description\": \"Bio text...\",\n    \"entities\": {\n      \"description\": { \"urls\": [] },\n      \"url\": { \"urls\": [{ \"display_url\": \"example.com\", \"expanded_url\": \"https://example.com\" }] }\n    }\n  }\n}"
      },
      {
        "title": "Paginated list response",
        "body": "{\n  \"tweets\": [ \"...array of Tweet Objects...\" ],\n  \"has_next_page\": true,\n  \"next_cursor\": \"cursor_string...\",\n  \"status\": \"success\",\n  \"msg\": null\n}"
      },
      {
        "title": "Endpoint reference",
        "body": "For detailed endpoint documentation with curl examples, consult the reference files:\n\nFor READ endpoint documentation (33 endpoints), consult references/read-endpoints.md\nFor WRITE V2 endpoint documentation (19 endpoints), consult references/write-endpoints.md\nFor Webhook and Stream endpoint documentation (6 endpoints), consult references/webhook-stream-endpoints.md\nFor the complete endpoint index table (all 58 endpoints), consult references/endpoint-index.md"
      },
      {
        "title": "X/Twitter platform degradation notice (March 2026)",
        "body": "CRITICAL: Around March 5, 2026, Twitter/X disabled or degraded several advanced search features due to high platform usage. This affects ALL Twitter API providers (not just TwitterAPI.io) because TwitterAPI.io proxies Twitter's own search infrastructure."
      },
      {
        "title": "What's broken",
        "body": "FeatureStatusImpactsince:DATE / until:DATE in searchDEGRADEDReturns incomplete results (often only 7-20 tweets per query regardless of actual volume)Search paginationBROKENCursor-based pagination returns the SAME page of results repeatedly instead of advancingsince_time:UNIX / until_time:UNIXWORKSAlternative date format using Unix timestamps -- returns correct date rangewithin_time:NhWORKSRelative time filter (e.g., within_time:72h)get_user_last_tweets paginationWORKSUser timeline cursor pagination is unaffectedget_user_mentions sinceTime/untilTimeWORKSServer-side Unix timestamp parameters (not search operators)Webhook filter rulesWORKSReal-time collection unaffected (but webhook URL may be lost during API key rotation)"
      },
      {
        "title": "Workarounds for date-range queries",
        "body": "Instead of (broken):\n\n$BTC since:2026-03-06_00:00:00_UTC until:2026-03-07_00:00:00_UTC\n\nUse (working):\n\n$BTC since_time:1741219200 until_time:1741305600\n\nConvert dates to Unix timestamps: date -d \"2026-03-06T00:00:00Z\" +%s or use Python: int(datetime(2026,3,6,tzinfo=timezone.utc).timestamp())\n\nPagination workaround: Since pagination is broken, use hourly time windows instead of paginating through a large result set. Each 1-hour window returns a unique set of ~7-16 tweets (page 1 only). This gives ~250 unique tweets per coin per day across 24 windows.\n\nFor user timelines: Use GET /twitter/user/last_tweets with cursor pagination (works normally). Paginate backwards through the user's timeline, then client-side filter by createdAt date. This completely bypasses search operators."
      },
      {
        "title": "Webhook URL gotcha",
        "body": "When a TwitterAPI.io API key is rotated (e.g., after account data reset), the webhook filter rules may be restored but the webhook URL is NOT automatically restored. You must manually re-set the webhook URL in the dashboard at https://twitterapi.io/tweet-filter-rules after any key rotation event.\n\nMonitoring tip: Check that collection_type='webhook' tweets are still arriving. If rules are active but zero webhook tweets arrive for 30+ minutes, verify the webhook URL is configured."
      },
      {
        "title": "Twitter search syntax (for query param in advanced_search)",
        "body": "OperatorExampleDescriptionStatus (Mar 2026)from:from:elonmuskTweets by userWorkingto:to:elonmuskReplies to userWorking\"...\"\"exact phrase\"Exact matchWorkingORcat OR dogEither termWorking--spamExclude termWorkingsince: / until:since:2026-01-01_00:00:00_UTCDate range (UTC)DEGRADED -- use since_time: insteadsince_time: / until_time:since_time:1741219200Date range (Unix timestamp)Workingwithin_time:within_time:24hRelative time windowWorkingmin_faves:min_faves:100Min likesWorkingmin_retweets:min_retweets:50Min RTsWorkingfilter:mediafilter:mediaHas mediaWorkingfilter:linksfilter:linksHas linksWorkinglang:lang:enLanguageWorkingis:replyis:replyOnly repliesWorking-is:retweet-is:retweetExclude RTsWorking\n\nMore examples: https://github.com/igorbrigadir/twitter-advanced-search"
      },
      {
        "title": "Pagination",
        "body": "Most list endpoints return:\n\n{ \"has_next_page\": true, \"next_cursor\": \"cursor_string...\" }\n\nPass cursor=NEXT_CURSOR to get next page. First page: omit cursor or cursor=\"\".\n\nKnown issues (March 2026):\n\nadvanced_search pagination is broken -- returns the same results on every page. Use hourly time windows (1 page per window) instead of deep pagination.\nget_user_last_tweets pagination works normally -- cursor advances through the user's timeline chronologically.\nhas_next_page may return true even when no more data exists (Twitter API limitation). If a subsequent request returns empty or identical results, stop paginating."
      },
      {
        "title": "Error handling",
        "body": "{ \"status\": \"error\", \"msg\": \"Error message\" }\n\nErrorCauseFixInvalid API keyWrong or missing X-API-Key headerCheck key in dashboardInvalid login_cookieExpired or faulty cookieRe-login via user_login_v2 with valid totp_secret400 on v2 actionsFaulty cookie from login without proper totp_secretRe-login with 16-char string totp_secretProxy errorBad proxy format or dead proxyFormat: http://user:pass@host:port, use residentialRate limitedExceeded QPS for your balance tierBack off, add balance for higher QPSAccount suspendedTwitter account bannedUse different account404 on endpointWrong pathCheck correct path in this doc"
      },
      {
        "title": "Get user ID from username (needed for follow, DM)",
        "body": "GET /twitter/user/info?userName=TARGET -> extract data.id\nUse that numeric ID in follow/DM calls\nNote: get_user_mentions accepts userName directly -- no ID lookup needed."
      },
      {
        "title": "Post tweet with image",
        "body": "Upload: POST /twitter/upload_media_v2 -> get media_id\nTweet: POST /twitter/create_tweet_v2 with media_ids: [\"media_id\"]"
      },
      {
        "title": "Reply to a tweet",
        "body": "POST /twitter/create_tweet_v2 with tweet_text + reply_to_tweet_id"
      },
      {
        "title": "Quote tweet",
        "body": "POST /twitter/create_tweet_v2 with tweet_text + attachment_url (full tweet URL)"
      },
      {
        "title": "Post to community",
        "body": "POST /twitter/create_tweet_v2 with tweet_text + community_id"
      },
      {
        "title": "Monitor accounts for new tweets (cheapest method)",
        "body": "Use Stream endpoints instead of polling /twitter/user/last_tweets:\n\nPOST /oapi/x_user_stream/add_user_to_monitor_tweet for each account\nSet up webhook to receive notifications"
      },
      {
        "title": "MCP server",
        "body": "claude mcp add twitterapi-io -- npx -y twitterapi-io-mcp\n\nnpm: https://www.npmjs.com/package/twitterapi-io-mcp\nGitHub: https://github.com/dorukardahan/twitterapi-io-mcp\n\nAlso available: twitterapi-docs MCP server for querying this documentation programmatically."
      },
      {
        "title": "Important notes",
        "body": "Read endpoints need only API key. No Twitter account needed.\nWrite endpoints need login_cookies from v2 login + residential proxy.\nV2 cookies only work with v2 endpoints (_v2 suffix).\n2FA strongly recommended -- use 16-character string totp_secret for reliable login.\nProxy mandatory for all write actions. Use high-quality residential proxies.\nCredits never expire once recharged. Bonus credits valid 30 days."
      }
    ],
    "body": "TwitterAPI.io skill v3.5.0\n\nAccess Twitter/X data and perform actions via TwitterAPI.io REST API. Use TwitterAPI.io REST API for read, write, webhook, and stream operations.\n\nDocs: https://docs.twitterapi.io | Dashboard: https://twitterapi.io/dashboard\n\nSetup\nGet API key: https://twitterapi.io/dashboard ($0.10 free credits, no CC)\nStore the key in a .env file or your shell's secure config (do not use raw export with the actual key in the terminal -- it gets saved to shell history).\nFor write actions, you also need login_cookies from v2 login + residential proxy.\n\nBase URL: https://api.twitterapi.io Auth header: X-API-Key: $TWITTERAPI_IO_KEY (all requests)\n\nPricing (credit-based, 1 USD = 100,000 credits)\nResource\tCredits\tApprox $/1K\nTweets (per returned tweet)\t15\t$0.15\nProfiles (per returned profile)\t18\t$0.18\nProfiles batch 100+ (per profile)\t10\t$0.10\nFollowers (per returned follower)\t15\t$0.15\nVerified followers (per follower)\t30\t$0.30\nMinimum per API call\t15\t$0.00015\nList endpoint calls\t150\t$0.0015\nCheck follow relationship\t100\t$0.001\nGet article\t100\t$0.001\nCommunity info\t20\t$0.0002\nWrite actions (tweet, like, RT, follow)\t200-300\t$0.002-0.003\nLogin\t300\t$0.003\n\nNote: If the API returns 0 or 1 item, you are still charged the minimum (15 credits).\n\nQPS (rate limits) -- balance-based\nAccount Balance (Credits)\tQPS Limit\n< 1,000 (free tier)\t1 req / 5 sec\n>= 1,000\t3\n>= 5,000\t6\n>= 10,000\t10\n>= 50,000\t20\nAPI Version Note\n\nAll V1 endpoints have been removed from the API. Use only V2 endpoints (_v2 suffix) for write operations. V2 requires login_cookies (from user_login_v2) + residential proxy.\n\nlogin_cookie vs login_cookies -- API Inconsistency\n\nThe API has an inconsistency in naming:\n\nuser_login_v2 response returns the field as login_cookie (singular)\nAll v2 action endpoints expect the field as login_cookies (plural)\n\nAlways use login_cookies (plural) in request bodies. The value is the same string.\n\nResponse schemas\nTweet object (from search, replies, etc.)\n{\n  \"type\": \"tweet\",\n  \"id\": \"1234567890\",\n  \"url\": \"https://x.com/user/status/1234567890\",\n  \"text\": \"Tweet content...\",\n  \"source\": \"Twitter Web App\",\n  \"retweetCount\": 5,\n  \"replyCount\": 2,\n  \"likeCount\": 42,\n  \"quoteCount\": 1,\n  \"viewCount\": 1500,\n  \"bookmarkCount\": 3,\n  \"createdAt\": \"Sun Feb 08 12:00:00 +0000 2026\",\n  \"lang\": \"en\",\n  \"isReply\": false,\n  \"inReplyToId\": null,\n  \"inReplyToUserId\": null,\n  \"inReplyToUsername\": null,\n  \"conversationId\": \"1234567890\",\n  \"displayTextRange\": [0, 280],\n  \"isLimitedReply\": false,\n  \"author\": { \"...User Object...\" },\n  \"entities\": {\n    \"hashtags\": [{ \"text\": \"AI\", \"indices\": [10, 13] }],\n    \"urls\": [{ \"display_url\": \"example.com\", \"expanded_url\": \"https://example.com\", \"url\": \"https://t.co/xxx\" }],\n    \"user_mentions\": [{ \"id_str\": \"123\", \"name\": \"Someone\", \"screen_name\": \"someone\" }]\n  },\n  \"quoted_tweet\": null,\n  \"retweeted_tweet\": null\n}\n\nUser object\n{\n  \"type\": \"user\",\n  \"id\": \"999888777\",\n  \"userName\": \"elonmusk\",\n  \"name\": \"Elon Musk\",\n  \"url\": \"https://x.com/elonmusk\",\n  \"isBlueVerified\": true,\n  \"verifiedType\": \"none\",\n  \"profilePicture\": \"https://pbs.twimg.com/...\",\n  \"coverPicture\": \"https://pbs.twimg.com/...\",\n  \"description\": \"Bio text...\",\n  \"location\": \"Mars\",\n  \"followers\": 200000000,\n  \"following\": 800,\n  \"canDm\": false,\n  \"favouritesCount\": 50000,\n  \"mediaCount\": 2000,\n  \"statusesCount\": 30000,\n  \"createdAt\": \"Tue Jun 02 20:12:29 +0000 2009\",\n  \"pinnedTweetIds\": [\"1234567890\"],\n  \"isAutomated\": false,\n  \"possiblySensitive\": false,\n  \"profile_bio\": {\n    \"description\": \"Bio text...\",\n    \"entities\": {\n      \"description\": { \"urls\": [] },\n      \"url\": { \"urls\": [{ \"display_url\": \"example.com\", \"expanded_url\": \"https://example.com\" }] }\n    }\n  }\n}\n\nPaginated list response\n{\n  \"tweets\": [ \"...array of Tweet Objects...\" ],\n  \"has_next_page\": true,\n  \"next_cursor\": \"cursor_string...\",\n  \"status\": \"success\",\n  \"msg\": null\n}\n\nEndpoint reference\n\nFor detailed endpoint documentation with curl examples, consult the reference files:\n\nFor READ endpoint documentation (33 endpoints), consult references/read-endpoints.md\nFor WRITE V2 endpoint documentation (19 endpoints), consult references/write-endpoints.md\nFor Webhook and Stream endpoint documentation (6 endpoints), consult references/webhook-stream-endpoints.md\nFor the complete endpoint index table (all 58 endpoints), consult references/endpoint-index.md\nX/Twitter platform degradation notice (March 2026)\n\nCRITICAL: Around March 5, 2026, Twitter/X disabled or degraded several advanced search features due to high platform usage. This affects ALL Twitter API providers (not just TwitterAPI.io) because TwitterAPI.io proxies Twitter's own search infrastructure.\n\nWhat's broken\nFeature\tStatus\tImpact\nsince:DATE / until:DATE in search\tDEGRADED\tReturns incomplete results (often only 7-20 tweets per query regardless of actual volume)\nSearch pagination\tBROKEN\tCursor-based pagination returns the SAME page of results repeatedly instead of advancing\nsince_time:UNIX / until_time:UNIX\tWORKS\tAlternative date format using Unix timestamps -- returns correct date range\nwithin_time:Nh\tWORKS\tRelative time filter (e.g., within_time:72h)\nget_user_last_tweets pagination\tWORKS\tUser timeline cursor pagination is unaffected\nget_user_mentions sinceTime/untilTime\tWORKS\tServer-side Unix timestamp parameters (not search operators)\nWebhook filter rules\tWORKS\tReal-time collection unaffected (but webhook URL may be lost during API key rotation)\nWorkarounds for date-range queries\n\nInstead of (broken):\n\n$BTC since:2026-03-06_00:00:00_UTC until:2026-03-07_00:00:00_UTC\n\n\nUse (working):\n\n$BTC since_time:1741219200 until_time:1741305600\n\n\nConvert dates to Unix timestamps: date -d \"2026-03-06T00:00:00Z\" +%s or use Python: int(datetime(2026,3,6,tzinfo=timezone.utc).timestamp())\n\nPagination workaround: Since pagination is broken, use hourly time windows instead of paginating through a large result set. Each 1-hour window returns a unique set of ~7-16 tweets (page 1 only). This gives ~250 unique tweets per coin per day across 24 windows.\n\nFor user timelines: Use GET /twitter/user/last_tweets with cursor pagination (works normally). Paginate backwards through the user's timeline, then client-side filter by createdAt date. This completely bypasses search operators.\n\nWebhook URL gotcha\n\nWhen a TwitterAPI.io API key is rotated (e.g., after account data reset), the webhook filter rules may be restored but the webhook URL is NOT automatically restored. You must manually re-set the webhook URL in the dashboard at https://twitterapi.io/tweet-filter-rules after any key rotation event.\n\nMonitoring tip: Check that collection_type='webhook' tweets are still arriving. If rules are active but zero webhook tweets arrive for 30+ minutes, verify the webhook URL is configured.\n\nTwitter search syntax (for query param in advanced_search)\nOperator\tExample\tDescription\tStatus (Mar 2026)\nfrom:\tfrom:elonmusk\tTweets by user\tWorking\nto:\tto:elonmusk\tReplies to user\tWorking\n\"...\"\t\"exact phrase\"\tExact match\tWorking\nOR\tcat OR dog\tEither term\tWorking\n-\t-spam\tExclude term\tWorking\nsince: / until:\tsince:2026-01-01_00:00:00_UTC\tDate range (UTC)\tDEGRADED -- use since_time: instead\nsince_time: / until_time:\tsince_time:1741219200\tDate range (Unix timestamp)\tWorking\nwithin_time:\twithin_time:24h\tRelative time window\tWorking\nmin_faves:\tmin_faves:100\tMin likes\tWorking\nmin_retweets:\tmin_retweets:50\tMin RTs\tWorking\nfilter:media\tfilter:media\tHas media\tWorking\nfilter:links\tfilter:links\tHas links\tWorking\nlang:\tlang:en\tLanguage\tWorking\nis:reply\tis:reply\tOnly replies\tWorking\n-is:retweet\t-is:retweet\tExclude RTs\tWorking\n\nMore examples: https://github.com/igorbrigadir/twitter-advanced-search\n\nPagination\n\nMost list endpoints return:\n\n{ \"has_next_page\": true, \"next_cursor\": \"cursor_string...\" }\n\n\nPass cursor=NEXT_CURSOR to get next page. First page: omit cursor or cursor=\"\".\n\nKnown issues (March 2026):\n\nadvanced_search pagination is broken -- returns the same results on every page. Use hourly time windows (1 page per window) instead of deep pagination.\nget_user_last_tweets pagination works normally -- cursor advances through the user's timeline chronologically.\nhas_next_page may return true even when no more data exists (Twitter API limitation). If a subsequent request returns empty or identical results, stop paginating.\nError handling\n{ \"status\": \"error\", \"msg\": \"Error message\" }\n\nError\tCause\tFix\nInvalid API key\tWrong or missing X-API-Key header\tCheck key in dashboard\nInvalid login_cookie\tExpired or faulty cookie\tRe-login via user_login_v2 with valid totp_secret\n400 on v2 actions\tFaulty cookie from login without proper totp_secret\tRe-login with 16-char string totp_secret\nProxy error\tBad proxy format or dead proxy\tFormat: http://user:pass@host:port, use residential\nRate limited\tExceeded QPS for your balance tier\tBack off, add balance for higher QPS\nAccount suspended\tTwitter account banned\tUse different account\n404 on endpoint\tWrong path\tCheck correct path in this doc\nCommon workflows\nGet user ID from username (needed for follow, DM)\nGET /twitter/user/info?userName=TARGET -> extract data.id\nUse that numeric ID in follow/DM calls Note: get_user_mentions accepts userName directly -- no ID lookup needed.\nPost tweet with image\nUpload: POST /twitter/upload_media_v2 -> get media_id\nTweet: POST /twitter/create_tweet_v2 with media_ids: [\"media_id\"]\nReply to a tweet\n\nPOST /twitter/create_tweet_v2 with tweet_text + reply_to_tweet_id\n\nQuote tweet\n\nPOST /twitter/create_tweet_v2 with tweet_text + attachment_url (full tweet URL)\n\nPost to community\n\nPOST /twitter/create_tweet_v2 with tweet_text + community_id\n\nMonitor accounts for new tweets (cheapest method)\n\nUse Stream endpoints instead of polling /twitter/user/last_tweets:\n\nPOST /oapi/x_user_stream/add_user_to_monitor_tweet for each account\nSet up webhook to receive notifications\nMCP server\nclaude mcp add twitterapi-io -- npx -y twitterapi-io-mcp\n\n\nnpm: https://www.npmjs.com/package/twitterapi-io-mcp GitHub: https://github.com/dorukardahan/twitterapi-io-mcp\n\nAlso available: twitterapi-docs MCP server for querying this documentation programmatically.\n\nImportant notes\nRead endpoints need only API key. No Twitter account needed.\nWrite endpoints need login_cookies from v2 login + residential proxy.\nV2 cookies only work with v2 endpoints (_v2 suffix).\n2FA strongly recommended -- use 16-character string totp_secret for reliable login.\nProxy mandatory for all write actions. Use high-quality residential proxies.\nCredits never expire once recharged. Bonus credits valid 30 days."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/dorukardahan/twitterapi-io",
    "publisherUrl": "https://clawhub.ai/dorukardahan/twitterapi-io",
    "owner": "dorukardahan",
    "version": "3.5.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/twitterapi-io",
    "downloadUrl": "https://openagent3.xyz/downloads/twitterapi-io",
    "agentUrl": "https://openagent3.xyz/skills/twitterapi-io/agent",
    "manifestUrl": "https://openagent3.xyz/skills/twitterapi-io/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/twitterapi-io/agent.md"
  }
}