{
  "schemaVersion": "1.0",
  "item": {
    "slug": "opentweet-x-poster",
    "name": "OpenTweet X Poster",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/petricbranko/opentweet-x-poster",
    "canonicalUrl": "https://clawhub.ai/petricbranko/opentweet-x-poster",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/opentweet-x-poster",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=opentweet-x-poster",
    "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-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-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/opentweet-x-poster"
    },
    "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/opentweet-x-poster",
    "agentPageUrl": "https://openagent3.xyz/skills/opentweet-x-poster/agent",
    "manifestUrl": "https://openagent3.xyz/skills/opentweet-x-poster/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/opentweet-x-poster/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": "OpenTweet X Poster",
        "body": "You can post to X (Twitter) using the OpenTweet REST API. All requests go to https://opentweet.io with the user's API key."
      },
      {
        "title": "Authentication",
        "body": "Every request needs this header:\n\nAuthorization: Bearer $OPENTWEET_API_KEY\nContent-Type: application/json\n\nFor file uploads, use Content-Type: multipart/form-data instead."
      },
      {
        "title": "Before You Start",
        "body": "ALWAYS verify the connection first:\n\nGET https://opentweet.io/api/v1/me\n\nThis returns subscription status, daily post limits, and post counts. Check subscription.has_access is true and limits.remaining_posts_today > 0 before scheduling or publishing."
      },
      {
        "title": "Create a tweet",
        "body": "POST https://opentweet.io/api/v1/posts\nBody: { \"text\": \"Your tweet text\" }\n\nOptionally add \"scheduled_date\": \"2026-03-01T10:00:00Z\" to schedule it (requires active subscription, date must be in the future)."
      },
      {
        "title": "Create and publish immediately (one step)",
        "body": "POST https://opentweet.io/api/v1/posts\nBody: { \"text\": \"Hello from the API!\", \"publish_now\": true }\n\nCreates the post AND publishes to X in one request. Cannot combine with scheduled_date or bulk posts. Response includes status: \"posted\", x_post_id, and url (the real X post URL) on success."
      },
      {
        "title": "Create a tweet with media",
        "body": "POST https://opentweet.io/api/v1/posts\nBody: {\n  \"text\": \"Check out this screenshot!\",\n  \"media_urls\": [\"https://url-from-upload-endpoint\"]\n}\n\nUpload media first via POST /api/v1/upload, then pass the returned URL(s) in media_urls."
      },
      {
        "title": "Create a thread",
        "body": "POST https://opentweet.io/api/v1/posts\nBody: {\n  \"text\": \"First tweet of the thread\",\n  \"is_thread\": true,\n  \"thread_tweets\": [\"Second tweet\", \"Third tweet\"]\n}"
      },
      {
        "title": "Create a thread with per-tweet media",
        "body": "POST https://opentweet.io/api/v1/posts\nBody: {\n  \"text\": \"Thread intro with image\",\n  \"is_thread\": true,\n  \"thread_tweets\": [\"Second tweet\", \"Third tweet\"],\n  \"media_urls\": [\"https://intro-image-url\"],\n  \"thread_media\": [[\"https://img-for-tweet-2\"], []]\n}\n\nthread_media is an array of arrays. Each inner array contains media URLs for the corresponding tweet in thread_tweets. Use [] for tweets with no media."
      },
      {
        "title": "Post to an X Community",
        "body": "POST https://opentweet.io/api/v1/posts\nBody: {\n  \"text\": \"Shared with the community!\",\n  \"community_id\": \"1234567890\",\n  \"share_with_followers\": true\n}"
      },
      {
        "title": "Bulk create (up to 50 posts)",
        "body": "POST https://opentweet.io/api/v1/posts\nBody: {\n  \"posts\": [\n    { \"text\": \"Tweet 1\", \"scheduled_date\": \"2026-03-01T10:00:00Z\" },\n    { \"text\": \"Tweet 2\", \"scheduled_date\": \"2026-03-01T14:00:00Z\" }\n  ]\n}"
      },
      {
        "title": "Schedule a post",
        "body": "POST https://opentweet.io/api/v1/posts/{id}/schedule\nBody: { \"scheduled_date\": \"2026-03-01T10:00:00Z\" }\n\nThe date must be in the future. Use ISO 8601 format."
      },
      {
        "title": "Publish immediately",
        "body": "POST https://opentweet.io/api/v1/posts/{id}/publish\n\nNo body needed. Posts to X right now. Response includes status: \"posted\", x_post_id, and url (the real X post URL)."
      },
      {
        "title": "Batch schedule (up to 50 posts)",
        "body": "POST https://opentweet.io/api/v1/posts/batch-schedule\nBody: {\n  \"schedules\": [\n    { \"post_id\": \"id1\", \"scheduled_date\": \"2026-03-02T09:00:00Z\" },\n    { \"post_id\": \"id2\", \"scheduled_date\": \"2026-03-03T14:00:00Z\" }\n  ],\n  \"community_id\": \"optional-community-id\",\n  \"share_with_followers\": true\n}"
      },
      {
        "title": "List posts",
        "body": "GET https://opentweet.io/api/v1/posts?status=scheduled&page=1&limit=20\n\nStatus options: scheduled, posted, draft, failed"
      },
      {
        "title": "Get a post",
        "body": "GET https://opentweet.io/api/v1/posts/{id}"
      },
      {
        "title": "Update a post",
        "body": "PUT https://opentweet.io/api/v1/posts/{id}\nBody: { \"text\": \"Updated text\", \"media_urls\": [\"https://...\"], \"scheduled_date\": \"2026-03-01T10:00:00Z\" }\n\nAll fields optional. Cannot update already-published posts. Set scheduled_date to null to unschedule (convert back to draft)."
      },
      {
        "title": "Delete a post",
        "body": "DELETE https://opentweet.io/api/v1/posts/{id}"
      },
      {
        "title": "Upload an image or video",
        "body": "POST https://opentweet.io/api/v1/upload\nContent-Type: multipart/form-data\nBody: file=@your-image.png\n\nReturns: { \"url\": \"https://...\" }\n\nSupported formats: JPG, PNG, GIF, WebP (max 5MB), MP4, MOV (max 20MB).\n\nWorkflow: Upload first, then use the returned URL in media_urls or thread_media when creating/updating posts."
      },
      {
        "title": "Account overview",
        "body": "GET https://opentweet.io/api/v1/analytics/overview\n\nReturns posting stats (total posts, publishing rate, active days, avg posts/week, most active day/hour, threads, media posts), streaks (current, longest), trends (this week vs last, this month vs last, best month), category breakdown, and recent activity (daily counts for last 7 and 30 days)."
      },
      {
        "title": "Tweet engagement metrics (Advanced plan only)",
        "body": "GET https://opentweet.io/api/v1/analytics/tweets?period=30\n\nReturns per-tweet engagement: likes, retweets, replies, quotes, impressions, bookmarks, engagement rate. Also includes top/worst performers, content type stats, engagement timeline, and best hours/days. Period: 7-365 days or \"all\"."
      },
      {
        "title": "Follower growth",
        "body": "GET https://opentweet.io/api/v1/analytics/followers?days=30\n\nReturns follower snapshots over time, current count, net growth, and growth percentage. Days: 7-365 or \"all\"."
      },
      {
        "title": "Best posting times",
        "body": "GET https://opentweet.io/api/v1/analytics/best-times\n\nAnalyzes your publishing patterns to find optimal hours and days. Requires at least 3 published posts."
      },
      {
        "title": "Growth velocity and predictions",
        "body": "GET https://opentweet.io/api/v1/analytics/growth\n\nReturns daily/weekly/monthly growth rates, growth acceleration, milestone predictions (estimated dates to reach follower milestones), and posting-activity-to-growth correlation."
      },
      {
        "title": "Common Workflows",
        "body": "First: verify your connection works:\n\nGET /api/v1/me — check authenticated is true, subscription.has_access is true\n\nPost a tweet right now (two steps):\n\nGET /api/v1/me — check limits.can_post is true\nCreate: POST /api/v1/posts with text\nPublish: POST /api/v1/posts/{id}/publish\n\nPost a tweet right now (one step):\n\nGET /api/v1/me — check limits.can_post is true\nPOST /api/v1/posts with { \"text\": \"...\", \"publish_now\": true }\n\nPost a tweet with an image:\n\nGET /api/v1/me — check limits\nUpload: POST /api/v1/upload with the image file — get back a URL\nCreate: POST /api/v1/posts with { \"text\": \"...\", \"media_urls\": [\"<url>\"] }\nPublish: POST /api/v1/posts/{id}/publish\n\nSchedule a tweet:\n\nGET /api/v1/me — check limits.remaining_posts_today > 0\nCreate with date: POST /api/v1/posts with text and scheduled_date (done in one step)\n\nSchedule a week of content:\n\nGET /api/v1/me — check remaining limit\nBulk create: POST /api/v1/posts with \"posts\": [...] array, each with a scheduled_date\n\nCreate a thread with media:\n\nUpload images: POST /api/v1/upload for each file\nCreate: POST /api/v1/posts with is_thread, thread_tweets, media_urls (for first tweet), and thread_media (for subsequent tweets)\n\nBatch schedule existing drafts:\n\nCreate drafts: POST /api/v1/posts with \"posts\": [...] (no scheduled_date)\nSchedule all: POST /api/v1/posts/batch-schedule with post IDs and dates\n\nCheck analytics before posting:\n\nGET /api/v1/analytics/best-times — find optimal posting hours\nGET /api/v1/analytics/overview — check posting streaks and trends\nSchedule posts at the suggested best times"
      },
      {
        "title": "Important Rules",
        "body": "ALWAYS call GET /api/v1/me before scheduling or publishing to check limits\nCRITICAL: Always parse and use the ACTUAL JSON response from the API. Never fabricate or assume response values.\nPost IDs are always 24-character MongoDB ObjectIds (e.g. \"507f1f77bcf86cd799439011\"), never short strings.\nEvery post response includes a status field: \"draft\", \"scheduled\", \"posted\", or \"failed\".\nPublished posts include a url field with the real X post URL. Always use this URL — never construct your own.\nTo verify a post was published, check: status is \"posted\" AND url is present.\nTweet max length: 280 characters (per tweet in a thread)\nBulk limit: 50 posts per request\nRate limit: 60 requests/minute, 1,000/day (Pro); 300/min, 10,000/day (Advanced)\nDates must be ISO 8601 and in the future — past dates are rejected\nActive subscription required to schedule or publish (creating drafts is free)\nIncluding scheduled_date in POST /api/v1/posts requires a subscription\nUpload media before creating posts — use the returned URL in media_urls or thread_media\nMedia limits: 5MB for images (JPG, PNG, GIF, WebP), 20MB for videos (MP4, MOV)\nTweet engagement analytics require the Advanced plan (returns 403 on Pro)\n403 = no subscription, 429 = rate limit or daily post limit hit\nCheck response status codes: 201=created, 200=success, 4xx=client error, 5xx=server error"
      },
      {
        "title": "Safety Guardrails",
        "body": "Publishing is irreversible — once a tweet is posted to X it cannot be undone via the API."
      },
      {
        "title": "Confirm before publishing",
        "body": "Before calling /publish or using publish_now: true, always tell the user which post(s) you are about to publish and ask for confirmation.\nShow the tweet text (truncated if long) and the post ID so the user can verify."
      },
      {
        "title": "Scheduled posts ≠ ready to publish",
        "body": "If a post has a scheduled_date in the future, it is meant to be published at that time by the scheduler — not right now.\nNEVER call /publish on a post that has a future scheduled_date unless the user explicitly asks you to publish it immediately.\nWhen the user asks to \"publish\" posts, clarify whether they want to publish NOW or schedule for later. Default to scheduling if dates are provided."
      },
      {
        "title": "Batch operations — go slow",
        "body": "When creating or scheduling more than 5 posts, summarize the batch (count, date range, first/last tweet previews) and ask the user to confirm before proceeding.\nNever bulk-create AND immediately publish in one go. Create as drafts or scheduled posts first, let the user review, then publish only on confirmation.\nWhen using batch-schedule, show the user the list of dates before sending the request."
      },
      {
        "title": "Don't loop publish calls",
        "body": "Never loop through a list of posts calling /publish on each one without explicit user approval for the full list.\nIf the user asks to \"publish all my drafts\" or similar, list them first and get confirmation."
      },
      {
        "title": "Full API docs",
        "body": "For complete documentation: https://opentweet.io/api/v1/docs"
      }
    ],
    "body": "OpenTweet X Poster\n\nYou can post to X (Twitter) using the OpenTweet REST API. All requests go to https://opentweet.io with the user's API key.\n\nAuthentication\n\nEvery request needs this header:\n\nAuthorization: Bearer $OPENTWEET_API_KEY\nContent-Type: application/json\n\n\nFor file uploads, use Content-Type: multipart/form-data instead.\n\nBefore You Start\n\nALWAYS verify the connection first:\n\nGET https://opentweet.io/api/v1/me\n\n\nThis returns subscription status, daily post limits, and post counts. Check subscription.has_access is true and limits.remaining_posts_today > 0 before scheduling or publishing.\n\nPost Management\nCreate a tweet\nPOST https://opentweet.io/api/v1/posts\nBody: { \"text\": \"Your tweet text\" }\n\n\nOptionally add \"scheduled_date\": \"2026-03-01T10:00:00Z\" to schedule it (requires active subscription, date must be in the future).\n\nCreate and publish immediately (one step)\nPOST https://opentweet.io/api/v1/posts\nBody: { \"text\": \"Hello from the API!\", \"publish_now\": true }\n\n\nCreates the post AND publishes to X in one request. Cannot combine with scheduled_date or bulk posts. Response includes status: \"posted\", x_post_id, and url (the real X post URL) on success.\n\nCreate a tweet with media\nPOST https://opentweet.io/api/v1/posts\nBody: {\n  \"text\": \"Check out this screenshot!\",\n  \"media_urls\": [\"https://url-from-upload-endpoint\"]\n}\n\n\nUpload media first via POST /api/v1/upload, then pass the returned URL(s) in media_urls.\n\nCreate a thread\nPOST https://opentweet.io/api/v1/posts\nBody: {\n  \"text\": \"First tweet of the thread\",\n  \"is_thread\": true,\n  \"thread_tweets\": [\"Second tweet\", \"Third tweet\"]\n}\n\nCreate a thread with per-tweet media\nPOST https://opentweet.io/api/v1/posts\nBody: {\n  \"text\": \"Thread intro with image\",\n  \"is_thread\": true,\n  \"thread_tweets\": [\"Second tweet\", \"Third tweet\"],\n  \"media_urls\": [\"https://intro-image-url\"],\n  \"thread_media\": [[\"https://img-for-tweet-2\"], []]\n}\n\n\nthread_media is an array of arrays. Each inner array contains media URLs for the corresponding tweet in thread_tweets. Use [] for tweets with no media.\n\nPost to an X Community\nPOST https://opentweet.io/api/v1/posts\nBody: {\n  \"text\": \"Shared with the community!\",\n  \"community_id\": \"1234567890\",\n  \"share_with_followers\": true\n}\n\nBulk create (up to 50 posts)\nPOST https://opentweet.io/api/v1/posts\nBody: {\n  \"posts\": [\n    { \"text\": \"Tweet 1\", \"scheduled_date\": \"2026-03-01T10:00:00Z\" },\n    { \"text\": \"Tweet 2\", \"scheduled_date\": \"2026-03-01T14:00:00Z\" }\n  ]\n}\n\nSchedule a post\nPOST https://opentweet.io/api/v1/posts/{id}/schedule\nBody: { \"scheduled_date\": \"2026-03-01T10:00:00Z\" }\n\n\nThe date must be in the future. Use ISO 8601 format.\n\nPublish immediately\nPOST https://opentweet.io/api/v1/posts/{id}/publish\n\n\nNo body needed. Posts to X right now. Response includes status: \"posted\", x_post_id, and url (the real X post URL).\n\nBatch schedule (up to 50 posts)\nPOST https://opentweet.io/api/v1/posts/batch-schedule\nBody: {\n  \"schedules\": [\n    { \"post_id\": \"id1\", \"scheduled_date\": \"2026-03-02T09:00:00Z\" },\n    { \"post_id\": \"id2\", \"scheduled_date\": \"2026-03-03T14:00:00Z\" }\n  ],\n  \"community_id\": \"optional-community-id\",\n  \"share_with_followers\": true\n}\n\nList posts\nGET https://opentweet.io/api/v1/posts?status=scheduled&page=1&limit=20\n\n\nStatus options: scheduled, posted, draft, failed\n\nGet a post\nGET https://opentweet.io/api/v1/posts/{id}\n\nUpdate a post\nPUT https://opentweet.io/api/v1/posts/{id}\nBody: { \"text\": \"Updated text\", \"media_urls\": [\"https://...\"], \"scheduled_date\": \"2026-03-01T10:00:00Z\" }\n\n\nAll fields optional. Cannot update already-published posts. Set scheduled_date to null to unschedule (convert back to draft).\n\nDelete a post\nDELETE https://opentweet.io/api/v1/posts/{id}\n\nMedia Upload\nUpload an image or video\nPOST https://opentweet.io/api/v1/upload\nContent-Type: multipart/form-data\nBody: file=@your-image.png\n\n\nReturns: { \"url\": \"https://...\" }\n\nSupported formats: JPG, PNG, GIF, WebP (max 5MB), MP4, MOV (max 20MB).\n\nWorkflow: Upload first, then use the returned URL in media_urls or thread_media when creating/updating posts.\n\nAnalytics\nAccount overview\nGET https://opentweet.io/api/v1/analytics/overview\n\n\nReturns posting stats (total posts, publishing rate, active days, avg posts/week, most active day/hour, threads, media posts), streaks (current, longest), trends (this week vs last, this month vs last, best month), category breakdown, and recent activity (daily counts for last 7 and 30 days).\n\nTweet engagement metrics (Advanced plan only)\nGET https://opentweet.io/api/v1/analytics/tweets?period=30\n\n\nReturns per-tweet engagement: likes, retweets, replies, quotes, impressions, bookmarks, engagement rate. Also includes top/worst performers, content type stats, engagement timeline, and best hours/days. Period: 7-365 days or \"all\".\n\nFollower growth\nGET https://opentweet.io/api/v1/analytics/followers?days=30\n\n\nReturns follower snapshots over time, current count, net growth, and growth percentage. Days: 7-365 or \"all\".\n\nBest posting times\nGET https://opentweet.io/api/v1/analytics/best-times\n\n\nAnalyzes your publishing patterns to find optimal hours and days. Requires at least 3 published posts.\n\nGrowth velocity and predictions\nGET https://opentweet.io/api/v1/analytics/growth\n\n\nReturns daily/weekly/monthly growth rates, growth acceleration, milestone predictions (estimated dates to reach follower milestones), and posting-activity-to-growth correlation.\n\nCommon Workflows\n\nFirst: verify your connection works:\n\nGET /api/v1/me — check authenticated is true, subscription.has_access is true\n\nPost a tweet right now (two steps):\n\nGET /api/v1/me — check limits.can_post is true\nCreate: POST /api/v1/posts with text\nPublish: POST /api/v1/posts/{id}/publish\n\nPost a tweet right now (one step):\n\nGET /api/v1/me — check limits.can_post is true\nPOST /api/v1/posts with { \"text\": \"...\", \"publish_now\": true }\n\nPost a tweet with an image:\n\nGET /api/v1/me — check limits\nUpload: POST /api/v1/upload with the image file — get back a URL\nCreate: POST /api/v1/posts with { \"text\": \"...\", \"media_urls\": [\"<url>\"] }\nPublish: POST /api/v1/posts/{id}/publish\n\nSchedule a tweet:\n\nGET /api/v1/me — check limits.remaining_posts_today > 0\nCreate with date: POST /api/v1/posts with text and scheduled_date (done in one step)\n\nSchedule a week of content:\n\nGET /api/v1/me — check remaining limit\nBulk create: POST /api/v1/posts with \"posts\": [...] array, each with a scheduled_date\n\nCreate a thread with media:\n\nUpload images: POST /api/v1/upload for each file\nCreate: POST /api/v1/posts with is_thread, thread_tweets, media_urls (for first tweet), and thread_media (for subsequent tweets)\n\nBatch schedule existing drafts:\n\nCreate drafts: POST /api/v1/posts with \"posts\": [...] (no scheduled_date)\nSchedule all: POST /api/v1/posts/batch-schedule with post IDs and dates\n\nCheck analytics before posting:\n\nGET /api/v1/analytics/best-times — find optimal posting hours\nGET /api/v1/analytics/overview — check posting streaks and trends\nSchedule posts at the suggested best times\nImportant Rules\nALWAYS call GET /api/v1/me before scheduling or publishing to check limits\nCRITICAL: Always parse and use the ACTUAL JSON response from the API. Never fabricate or assume response values.\nPost IDs are always 24-character MongoDB ObjectIds (e.g. \"507f1f77bcf86cd799439011\"), never short strings.\nEvery post response includes a status field: \"draft\", \"scheduled\", \"posted\", or \"failed\".\nPublished posts include a url field with the real X post URL. Always use this URL — never construct your own.\nTo verify a post was published, check: status is \"posted\" AND url is present.\nTweet max length: 280 characters (per tweet in a thread)\nBulk limit: 50 posts per request\nRate limit: 60 requests/minute, 1,000/day (Pro); 300/min, 10,000/day (Advanced)\nDates must be ISO 8601 and in the future — past dates are rejected\nActive subscription required to schedule or publish (creating drafts is free)\nIncluding scheduled_date in POST /api/v1/posts requires a subscription\nUpload media before creating posts — use the returned URL in media_urls or thread_media\nMedia limits: 5MB for images (JPG, PNG, GIF, WebP), 20MB for videos (MP4, MOV)\nTweet engagement analytics require the Advanced plan (returns 403 on Pro)\n403 = no subscription, 429 = rate limit or daily post limit hit\nCheck response status codes: 201=created, 200=success, 4xx=client error, 5xx=server error\nSafety Guardrails\n\nPublishing is irreversible — once a tweet is posted to X it cannot be undone via the API.\n\nConfirm before publishing\nBefore calling /publish or using publish_now: true, always tell the user which post(s) you are about to publish and ask for confirmation.\nShow the tweet text (truncated if long) and the post ID so the user can verify.\nScheduled posts ≠ ready to publish\nIf a post has a scheduled_date in the future, it is meant to be published at that time by the scheduler — not right now.\nNEVER call /publish on a post that has a future scheduled_date unless the user explicitly asks you to publish it immediately.\nWhen the user asks to \"publish\" posts, clarify whether they want to publish NOW or schedule for later. Default to scheduling if dates are provided.\nBatch operations — go slow\nWhen creating or scheduling more than 5 posts, summarize the batch (count, date range, first/last tweet previews) and ask the user to confirm before proceeding.\nNever bulk-create AND immediately publish in one go. Create as drafts or scheduled posts first, let the user review, then publish only on confirmation.\nWhen using batch-schedule, show the user the list of dates before sending the request.\nDon't loop publish calls\nNever loop through a list of posts calling /publish on each one without explicit user approval for the full list.\nIf the user asks to \"publish all my drafts\" or similar, list them first and get confirmation.\nFull API docs\n\nFor complete documentation: https://opentweet.io/api/v1/docs"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/petricbranko/opentweet-x-poster",
    "publisherUrl": "https://clawhub.ai/petricbranko/opentweet-x-poster",
    "owner": "petricbranko",
    "version": "1.1.3",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/opentweet-x-poster",
    "downloadUrl": "https://openagent3.xyz/downloads/opentweet-x-poster",
    "agentUrl": "https://openagent3.xyz/skills/opentweet-x-poster/agent",
    "manifestUrl": "https://openagent3.xyz/skills/opentweet-x-poster/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/opentweet-x-poster/agent.md"
  }
}