{
  "schemaVersion": "1.0",
  "item": {
    "slug": "openclaw-powerpost",
    "name": "PowerPost",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/tarekhoury/openclaw-powerpost",
    "canonicalUrl": "https://clawhub.ai/tarekhoury/openclaw-powerpost",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/openclaw-powerpost",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=openclaw-powerpost",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "CHANGELOG.md",
      "README.md",
      "SKILL.md",
      "clawhub.json"
    ],
    "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-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/openclaw-powerpost"
    },
    "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/openclaw-powerpost",
    "agentPageUrl": "https://openagent3.xyz/skills/openclaw-powerpost/agent",
    "manifestUrl": "https://openagent3.xyz/skills/openclaw-powerpost/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/openclaw-powerpost/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": "PowerPost Skill",
        "body": "PowerPost writes social media captions, generates images and videos, and publishes to Instagram, TikTok, X/Twitter, YouTube, Facebook, and LinkedIn through a single API."
      },
      {
        "title": "Setup",
        "body": "The user needs two credentials:\n\nPOWERPOST_API_KEY — their API key (starts with pp_live_sk_). They can create one at https://powerpost.ai/settings/api\nPOWERPOST_WORKSPACE_ID — their workspace ID. Found at https://powerpost.ai/settings/workspaces\n\nThere are two ways to configure these in OpenClaw. The API key can go in the Skills UI (the \"API key\" field) or via config. The workspace ID has to be set via config since the UI only has one field per skill:\n\nopenclaw config set skills.entries.powerpost.apiKey \"pp_live_sk_YOUR_KEY\"\nopenclaw config set skills.entries.powerpost.env.POWERPOST_WORKSPACE_ID \"YOUR_WORKSPACE_ID\"\n\nAPI keys come in two types:\n\nread_write — full access, including publishing.\nread_draft — can generate content and create drafts, but publishing is blocked (returns 403). Good when a human should review before anything goes live.\n\nNew accounts start with 50 free credits. Pricing details at https://powerpost.ai/pricing"
      },
      {
        "title": "First run",
        "body": "Before running any PowerPost command, make sure both credentials are set. If either is missing, walk the user through setup:\n\nIf POWERPOST_API_KEY is not set:\n\nAsk if they have a PowerPost account. If not, they can sign up at https://powerpost.ai/login\nPoint them to https://powerpost.ai/settings/api to create an API key.\nThey can paste it into the \"API key\" field on the Skills page in the OpenClaw UI, or run: openclaw config set skills.entries.powerpost.apiKey \"pp_live_sk_...\"\n\n\n\nIf POWERPOST_WORKSPACE_ID is not set:\n\nPoint them to https://powerpost.ai/settings/workspaces to find it.\nThey need to run: openclaw config set skills.entries.powerpost.env.POWERPOST_WORKSPACE_ID \"their-workspace-id\" — there's no UI field for this one, it has to be set via config.\n\n\n\nOnce both are set, verify by calling GET /account/credits. If it returns a balance, you're good. If it returns 401, the API key is wrong.\n\nDon't run any other PowerPost commands until both credentials are confirmed working."
      },
      {
        "title": "Base URL",
        "body": "All requests go to:\n\nhttps://powerpost.ai/api/v1"
      },
      {
        "title": "Authentication Headers",
        "body": "Every request needs x-api-key (or Authorization: Bearer <key>). All content endpoints also need X-Workspace-Id. The only exception is GET /account/credits which only needs x-api-key.\n\nx-api-key: $POWERPOST_API_KEY\nX-Workspace-Id: $POWERPOST_WORKSPACE_ID"
      },
      {
        "title": "Core Workflow",
        "body": "The standard PowerPost flow is:\n\nCheck credits to make sure the user has enough balance.\nGenerate content from text, images, or video (async — returns a generation ID).\nPoll for results every 2-3 seconds until status is completed or failed.\nOptionally generate images or videos from the captions or a text prompt (also async — poll for results).\nCreate a post combining the generated captions and images into a draft.\nShow the draft to the user for review before publishing.\nPublish the post to connected social platforms.\n\nAlways check credits before generating content. Always show the user what will be published and get confirmation before calling the publish endpoint."
      },
      {
        "title": "1. Check Credits",
        "body": "Use this to check how many credits the user has before starting any generation.\n\ncurl https://powerpost.ai/api/v1/account/credits \\\n  -H \"x-api-key: $POWERPOST_API_KEY\"\n\nNote: This endpoint does NOT need the X-Workspace-Id header.\n\nResponse:\n\n{\n  \"balance\": 47\n}\n\nTell the user their current balance. If balance is low, warn them before they start a generation."
      },
      {
        "title": "Credit Costs",
        "body": "Credit costs vary by action:\n\nCaption generation: depends on research mode, input type, number of source URLs, and video length.\nImage generation: depends on model and quantity.\nVideo generation: depends on model, duration, and whether audio is enabled.\nPublishing: depends on platform. Premium platforms like X cost more.\n\nThe exact cost is returned in every API response via credits_used and remaining_credits. Always check credits before starting a generation so the user knows the cost upfront.\n\nCredits are only charged for successful operations. Failed generations, failed publish attempts, and failed URL scrapes are refunded."
      },
      {
        "title": "2. Upload Media",
        "body": "Use this when the user wants to generate content from images or video, or when they want to attach media to a post.\n\ncurl -X POST https://powerpost.ai/api/v1/media/upload \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -F \"file=@/path/to/file\" \\\n  -F \"type=image\"\n\nThe type field must be image or video.\n\nSupported formats:\n\nImages: JPEG, PNG, WebP (max 10 MB)\nVideos: MP4, MOV, WebM (max 500 MB)\n\nResponse:\n\n{\n  \"media_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n  \"type\": \"image\",\n  \"file_name\": \"photo.jpg\",\n  \"file_size\": 245000,\n  \"mime_type\": \"image/jpeg\",\n  \"created_at\": \"2026-01-10T18:30:00Z\"\n}\n\nSave the media_id from the response. You will need it for content generation (media_ids field) or for creating posts (media_ids in post items).\n\nTell the user the upload was successful and show the file name and size."
      },
      {
        "title": "3. Generate Content",
        "body": "Use this when the user wants to create social media captions.\n\nThere are three input modes, determined by which fields you provide:\n\nText only: Send prompt (required, 3-2000 chars).\nImage input: Send media_ids with image IDs (+ optional prompt for context).\nVideo input: Send media_ids with a video ID (+ optional prompt for context).\n\nYou must provide either prompt or media_ids (or both).\n\ncurl -X POST https://powerpost.ai/api/v1/content/generate \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"We just shipped dark mode across all our apps\",\n    \"post_types\": [\"instagram-reel\", \"tiktok-video\", \"x-post\"],\n    \"research_mode\": \"regular\"\n  }'\n\nRequired fields:\n\npost_types (string array) — At least one post type. See the post types table below.\nresearch_mode (string) — \"regular\" or \"deep\". Use regular for quick tasks, deep for important posts.\n\nOptional fields:\n\nwriting_style_id (string) — A custom writing style ID created in the dashboard.\ncta_text (string, max 100 chars) — A custom call-to-action.\nsource_urls (string array, max 10) — URLs to scrape for research context. Must be HTTPS. Private/internal URLs are filtered out for security. Each URL adds to the generation cost.\n\nPost types:\n\nPlatformPost TypesInstagraminstagram-feed, instagram-reel, instagram-storyTikToktiktok-video, tiktok-photosYouTubeyoutube-video, youtube-shortXx-postFacebookfacebook-post, facebook-reel, facebook-storyLinkedInlinkedin-post\n\nMultiple post types from the same platform produce one shared caption for that platform. The post type declares publishing intent.\n\nResponse:\n\n{\n  \"generation_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"status\": \"processing\",\n  \"credits_used\": 10,\n  \"remaining_credits\": 90,\n  \"status_url\": \"/api/v1/content/generations/550e8400-e29b-41d4-a716-446655440000\"\n}\n\nTell the user the generation has started, how many credits it cost, and that you are waiting for it to complete. Then immediately start polling."
      },
      {
        "title": "4. Get Generation Status (Polling)",
        "body": "After starting a generation, poll this endpoint every 2-3 seconds until status is completed or failed. Do not poll more than 60 times (about 2 minutes).\n\ncurl https://powerpost.ai/api/v1/content/generations/GENERATION_ID \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\nWhile processing:\n\n{\n  \"generation_id\": \"550e8400-...\",\n  \"status\": \"processing\",\n  \"prompt\": \"We just shipped dark mode\",\n  \"platforms\": [\"tiktok\", \"instagram\"],\n  \"research_mode\": \"regular\",\n  \"credits_used\": 10,\n  \"created_at\": \"2026-01-10T18:30:00Z\"\n}\n\nIf status is still processing or pending, wait 3 seconds and poll again.\n\nWhen completed:\n\n{\n  \"generation_id\": \"550e8400-...\",\n  \"status\": \"completed\",\n  \"prompt\": \"We just shipped dark mode\",\n  \"platforms\": [\"tiktok\", \"instagram\"],\n  \"research_mode\": \"regular\",\n  \"credits_used\": 10,\n  \"created_at\": \"2026-01-10T18:30:00Z\",\n  \"outputs\": {\n    \"tiktok\": \"Dark mode activated! POV: your eyes at 2am finally getting some relief... #darkmode #tech\",\n    \"instagram\": \"Dark mode is here!\\n\\nYour late-night scrolling just got easier on the eyes... #DarkMode #ProductUpdate\"\n  }\n}\n\nThe outputs object is keyed by platform name (not post type). Each value is a string, EXCEPT YouTube which has a title and description:\n\n\"youtube\": {\n  \"title\": \"We Just Shipped Dark Mode\",\n  \"description\": \"Dark mode is finally here across all our apps... #darkmode\"\n}\n\nWhen completed, display all generated captions to the user, clearly labeled by platform.\n\nWhen failed:\n\nThe response includes an error object with code and message. Credits are refunded on failure. Tell the user the generation failed and show the error message."
      },
      {
        "title": "5. List Generations",
        "body": "Use this when the user wants to see their recent generations or search for a past generation.\n\ncurl \"https://powerpost.ai/api/v1/content/generations?status=completed&limit=10\" \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\nQuery parameters (all optional):\n\nstatus — Filter by: pending, processing, completed, failed\nlimit — Results per page, 1-100 (default 20)\ncursor — Pagination cursor from next_cursor in a previous response\n\nResponse:\n\n{\n  \"data\": [\n    {\n      \"generation_id\": \"550e8400-...\",\n      \"status\": \"completed\",\n      \"prompt\": \"We just shipped dark mode\",\n      \"platforms\": [\"tiktok\", \"instagram\"],\n      \"research_mode\": \"regular\",\n      \"credits_used\": 10,\n      \"created_at\": \"2026-01-10T18:30:00Z\"\n    }\n  ],\n  \"next_cursor\": \"gen_cursor_abc123\",\n  \"has_more\": true\n}\n\nThe list endpoint does NOT include outputs. To get the full content of a specific generation, use the get generation endpoint with its ID.\n\nShow the user a summary table of their generations. If they want to see the content of a specific one, fetch it with the get endpoint."
      },
      {
        "title": "6. Generate Images",
        "body": "Use this when the user wants to create AI-generated images. There are three input modes:\n\nText mode: Describe the image in prompt.\nReference mode: Provide prompt + style_images (media IDs of uploaded reference images, max 4).\nPost mode: Provide generation_id to create images matching an existing caption generation (+optional prompt for extra direction and source_post_type to pick which platform caption to use).\n\ncurl -X POST https://powerpost.ai/api/v1/images/generate \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"Minimalist workspace with laptop and coffee, warm morning light\",\n    \"size\": \"square\",\n    \"quantity\": 2,\n    \"model\": \"flux2-flex\"\n  }'\n\nFields:\n\nprompt (string, max 2000 chars) — Required for text and reference modes. Optional for post mode.\nsize (string) — square (1:1), feed (4:5), portrait (9:16), landscape (16:9). Default: square.\nquantity (number, 1-4) — How many images to generate. Default: 1.\nmodel (string) — flux2-flex (default, best for multi-reference and fine control), ideogram-3 (best text rendering and logos), gpt-image-1.5 (most photorealistic, best detail), nano-banana-2 (fast generation, great text).\nenhance_prompt (boolean) — Let AI optimize the prompt. Default: false.\nstyle_images (string array) — Media IDs of reference images (max 4). For reference mode.\ngeneration_id (string) — Caption generation ID. For post mode.\nsource_post_type (string) — Which platform's caption to use as source. For post mode only.\n\nModel and size compatibility:\n\nflux2-flex: square, feed, portrait, landscape\nideogram-3: square, feed, portrait, landscape\ngpt-image-1.5: square, portrait, landscape (NO feed)\nnano-banana-2: square, feed, portrait, landscape\n\nIf the user requests a model/size combo that is not supported, warn them and suggest an alternative.\n\nResponse:\n\n{\n  \"image_generation_id\": \"7a8b9c0d-e1f2-3456-abcd-ef7890123456\",\n  \"status\": \"processing\",\n  \"credits_used\": 10,\n  \"remaining_credits\": 36,\n  \"status_url\": \"/api/v1/images/generations/7a8b9c0d-e1f2-3456-abcd-ef7890123456\"\n}\n\nTell the user that image generation has started and begin polling."
      },
      {
        "title": "7. Get Image Generation Status (Polling)",
        "body": "Poll this endpoint every 2-3 seconds until status is completed or failed.\n\ncurl https://powerpost.ai/api/v1/images/generations/IMAGE_GENERATION_ID \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\nWhen completed:\n\n{\n  \"image_generation_id\": \"7a8b9c0d-...\",\n  \"status\": \"completed\",\n  \"prompt\": \"Minimalist workspace with laptop and coffee\",\n  \"size\": \"square\",\n  \"quantity\": 2,\n  \"created_at\": \"2026-01-10T18:30:00Z\",\n  \"images\": [\n    {\n      \"media_id\": \"img-001-abcd-efgh\",\n      \"url\": \"https://powerpost.ai/storage/images/img-001-abcd-efgh.webp\",\n      \"thumbnail_url\": \"https://powerpost.ai/storage/images/img-001-abcd-efgh-thumb.jpg\",\n      \"width\": 1024,\n      \"height\": 1024\n    }\n  ]\n}\n\nEach image has a media_id which you use to attach the image to a post. The url is a preview link valid for 7 days. Always use the media_id, not the URL, when creating posts.\n\nShow the user the image URLs so they can preview. Save the media_id values for creating posts.\n\nPartial failure: If some images fail while others succeed, you get a partial result with a partial credit refund. The response status will be failed but may still contain an images array with the successful ones."
      },
      {
        "title": "8. Generate Videos",
        "body": "Use this when the user wants to create AI-generated videos. There are two input modes:\n\nText-to-video: Describe the video in prompt.\nImage-to-video: Provide prompt + source_image (media ID of an uploaded image).\n\ncurl -X POST https://powerpost.ai/api/v1/videos/generate \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"A golden retriever running through a field of wildflowers at sunset\",\n    \"size\": \"landscape\",\n    \"duration\": 5,\n    \"model\": \"kling-3.0-pro\",\n    \"has_audio\": false\n  }'\n\nFields:\n\nprompt (string, required) — Text description of the video.\nsize (string) — landscape (16:9) or portrait (9:16). Default: landscape.\nduration (integer, required) — Duration in seconds. Must match one of the model's supported values (see table).\nmodel (string) — kling-3.0-pro (default), veo-3.1, or runway-gen-4.5.\nhas_audio (boolean) — Generate with audio. Default: false. Only supported by some models.\nenhance_prompt (boolean) — Let AI optimize the prompt. Default: false.\nsource_image (media ID, UUID) — Media ID of an uploaded image for image-to-video mode.\n\nModel details:\n\nModel IDNameSizesAudioDurationskling-3.0-proKling 3.0 Prolandscape, portraitYes5s, 10sveo-3.1Google Veo 3.1landscape, portraitYes4s, 8srunway-gen-4.5Runway Gen-4.5landscape, portraitNo5s, 10s\n\nPrompt limits by model: Veo 3.1 = 3000 chars, Kling 3.0 Pro = 2500 chars, Runway Gen-4.5 = 1000 chars.\n\nCredit costs depend on the model, duration, and audio. The exact cost is returned in the response.\n\nResponse:\n\n{\n  \"video_generation_id\": \"7a8b9c0d-e1f2-3456-abcd-ef7890123456\",\n  \"status\": \"processing\",\n  \"credits_used\": 15,\n  \"remaining_credits\": 85,\n  \"status_url\": \"/api/v1/videos/generations/7a8b9c0d-e1f2-3456-abcd-ef7890123456\"\n}\n\nTell the user that video generation has started and begin polling."
      },
      {
        "title": "9. Get Video Generation Status (Polling)",
        "body": "Poll this endpoint every 10 seconds until status is completed or failed. Video generation takes longer than images — do not poll more than 120 times.\n\ncurl https://powerpost.ai/api/v1/videos/generations/VIDEO_GENERATION_ID \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\nWhen completed:\n\n{\n  \"video_generation_id\": \"7a8b9c0d-...\",\n  \"status\": \"completed\",\n  \"prompt\": \"A golden retriever running...\",\n  \"size\": \"landscape\",\n  \"duration\": 5,\n  \"has_audio\": false,\n  \"model\": \"kling-3.0-pro\",\n  \"created_at\": \"2026-03-11T10:00:00Z\",\n  \"video\": {\n    \"media_id\": \"vid-001-abcd\",\n    \"url\": \"https://powerpost.ai/storage/videos/vid-001-abcd.mp4\",\n    \"thumbnail_url\": \"https://powerpost.ai/storage/thumbs/vid-001-abcd.jpg\",\n    \"width\": 1920,\n    \"height\": 1080,\n    \"duration\": 5\n  }\n}\n\nThe video has a media_id which you use to attach it to a post. The url is a preview link valid for 7 days. Always use the media_id, not the URL, when creating posts.\n\nShow the user the video URL so they can preview. Save the media_id for creating posts.\n\nWhen failed: The response includes an error object with code (VIDEO_GENERATION_FAILED) and message. Credits are refunded on failure."
      },
      {
        "title": "10. Create Post",
        "body": "Use this to assemble captions and media into a draft post ready for review and publishing.\n\ncurl -X POST https://powerpost.ai/api/v1/posts \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"generation_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"items\": [\n      {\n        \"post_type\": \"instagram-reel\",\n        \"media_ids\": [\"img-001-abcd-efgh\"]\n      },\n      {\n        \"post_type\": \"tiktok-video\",\n        \"media_ids\": [\"img-001-abcd-efgh\"]\n      }\n    ]\n  }'\n\nFields:\n\ngeneration_id (string, optional) — Links to a completed caption generation. If provided, content is auto-filled from the generation outputs for each platform.\nitems (array, required) — One item per post type you want to publish.\n\nEach item:\n\npost_type (string, required) — The target post type (e.g., instagram-reel, x-post).\ncontent (string) — The caption text. Required if no generation_id is provided. If generation_id is provided, content is auto-filled but can be overridden.\ntitle (string) — Required for YouTube post types (youtube-video, youtube-short).\nmedia_ids (string array, optional) — Media to attach (uploaded or generated image IDs).\n\nCustom content example (no generation):\n\ncurl -X POST https://powerpost.ai/api/v1/posts \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"items\": [\n      {\n        \"post_type\": \"x-post\",\n        \"content\": \"Just shipped the biggest update of the year.\"\n      },\n      {\n        \"post_type\": \"linkedin-post\",\n        \"content\": \"Excited to announce our biggest product update of the year...\"\n      }\n    ]\n  }'\n\nResponse:\n\n{\n  \"post_id\": \"post-550e8400-e29b-41d4-a716-446655440000\",\n  \"status\": \"draft\",\n  \"created_at\": \"2026-01-10T18:30:00Z\",\n  \"items\": [\n    {\n      \"item_id\": \"item-001\",\n      \"post_type\": \"instagram-reel\",\n      \"platform\": \"instagram\",\n      \"content\": \"Dark mode is here! Your late-night scrolling just got easier... #DarkMode\",\n      \"media_ids\": [\"img-001-abcd-efgh\"],\n      \"status\": \"draft\"\n    }\n  ]\n}\n\nAfter creating a post, show the user a summary of every item (platform, content preview, attached media) and ask if they want to publish or make changes."
      },
      {
        "title": "11. Get Post",
        "body": "Use this to check the status of a post, especially after publishing.\n\ncurl https://powerpost.ai/api/v1/posts/POST_ID \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\nResponse includes the post with all items and their individual statuses. After publishing, each item will show posting, posted, or failed with an optional platform_post_id for successfully published items.\n\nPost statuses: draft, publishing, published, failed.\nItem statuses: draft, posting, posted, failed."
      },
      {
        "title": "12. Publish Post",
        "body": "Use this to publish a draft post to connected social platforms. Always confirm with the user before calling this endpoint.\n\ncurl -X POST https://powerpost.ai/api/v1/posts/POST_ID/publish \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\nPrerequisites:\n\nThe user's social platforms must be connected at https://powerpost.ai/settings/connections\nThe post must be in draft status.\nThe user must have sufficient credits.\nThe API key must be read_write type (not read_draft).\n\nResponse:\n\n{\n  \"post_id\": \"post-550e8400-...\",\n  \"status\": \"publishing\",\n  \"credits_used\": 1,\n  \"status_url\": \"/api/v1/posts/post-550e8400-...\"\n}\n\nPublishing is asynchronous. After receiving the response, poll the Get Post endpoint every 3 seconds to check when each item has finished publishing.\n\nPublishing costs vary by platform. The exact cost is returned in the response via credits_used.\n\nTell the user how many credits were used and that publishing is in progress. When all items show posted or failed, summarize the results."
      },
      {
        "title": "\"Post about X\" / \"Create a post about X\"",
        "body": "Full flow:\n\nCheck credits.\nAsk which platforms if not specified. Default to all if the user says \"everywhere\" or \"all platforms\".\nGenerate content with the user's topic as the prompt. Use regular research mode unless they ask for deep. If the user provides URLs as references, include them in source_urls.\nPoll until complete.\nShow the generated captions.\nAsk if they want to generate images too.\nCreate the post.\nShow the draft and ask for confirmation.\nPublish on confirmation."
      },
      {
        "title": "\"Write captions about X\" / \"Generate content about X\"",
        "body": "Partial flow (no publishing):\n\nCheck credits.\nGenerate content.\nPoll until complete.\nShow the captions to the user."
      },
      {
        "title": "\"Create an image\" / \"Generate an image of X\"",
        "body": "Check credits.\nIf the user provides a text description, use text mode. If they reference a previous generation, use post mode. If they have reference images, use reference mode.\nAsk about size preference if not specified (square is a safe default).\nGenerate the image.\nPoll until complete.\nShow the image URLs to the user."
      },
      {
        "title": "\"Create a video\" / \"Generate a video of X\"",
        "body": "Check credits.\nIf the user has an image they want to animate, use image-to-video mode (upload first, then pass source_image). Otherwise use text-to-video mode.\nAsk about duration if not specified. Default to 5 seconds.\nAsk about size if not specified (landscape is a safe default for video).\nGenerate the video.\nPoll until complete (video takes longer than images — up to a few minutes).\nShow the video URL to the user."
      },
      {
        "title": "\"Check my credits\" / \"How many credits do I have?\"",
        "body": "Call the credits endpoint.\nTell the user their balance."
      },
      {
        "title": "\"Upload this image/video\"",
        "body": "Upload the file using the media upload endpoint.\nTell the user the upload succeeded and show the media ID.\nAsk what they want to do with it (generate captions from it, use it in a post, etc.)."
      },
      {
        "title": "\"Show my recent posts\" / \"List my generations\"",
        "body": "Call the list generations endpoint.\nShow a summary of recent generations.\nIf the user wants details on one, fetch it with the get generation endpoint."
      },
      {
        "title": "\"Publish my post\" / \"Send it live\"",
        "body": "If there is a draft post from this session, publish it.\nIf not, ask the user which post to publish.\nAlways confirm before publishing."
      },
      {
        "title": "Polling Strategy",
        "body": "Content generation, image generation, and video generation are all asynchronous. After starting any of them:\n\nWait 2 seconds.\nCall the status endpoint.\nIf status is processing or pending, wait 3 seconds and poll again.\nIf status is completed, show the results.\nIf status is failed, show the error and tell the user credits were refunded.\nDo not poll more than 60 times for content/images, or 120 times for video (it takes longer). If it times out, tell the user to try again later.\n\nPublishing is also asynchronous. After calling publish:\n\nWait 3 seconds.\nPoll the Get Post endpoint.\nCheck each item's status. When all are either posted or failed, stop polling."
      },
      {
        "title": "Error Handling",
        "body": "All errors return this format:\n\n{\n  \"error\": {\n    \"message\": \"Human-readable error message\",\n    \"code\": \"ERROR_CODE\"\n  }\n}\n\nHandle these errors:\n\nHTTP StatusCodeWhat to Tell the User400VALIDATION_ERRORThe request was invalid. Check the fields and try again.401INVALID_API_KEYThe API key is missing or invalid. Check POWERPOST_API_KEY.402INSUFFICIENT_CREDITSNot enough credits. Check balance and suggest upgrading.403FORBIDDENAccess denied. The API key may be read_draft and publishing was attempted.404NOT_FOUNDThe resource was not found. Check the ID.409ALREADY_PUBLISHEDThis post was already published.413FILE_TOO_LARGEThe file exceeds the size limit (10 MB for images, 500 MB for video).413STORAGE_QUOTA_EXCEEDEDStorage quota exceeded (10 GB limit). Delete unused media or contact support.422PLATFORM_NOT_CONNECTEDThe target platform is not connected. Direct user to https://powerpost.ai/settings/connections429RATE_LIMIT_EXCEEDEDToo many requests. Wait the duration in retryAfter seconds and retry.500INTERNAL_ERRORServer error. Wait a moment and try again.\n\nFor rate limit errors (429), the response includes a retryAfter field in seconds. Wait that long before retrying.\n\nEvery response includes an X-Request-Id header. If the user needs support, give them this ID."
      },
      {
        "title": "Things to know",
        "body": "Always show the user what will be posted and where, and get explicit confirmation before publishing. This goes to real social accounts.\nYouTube posts need a title field in addition to the caption.\nIf the user picks both instagram-reel and instagram-feed, they share one Instagram caption. The post type controls the publishing format, not the caption.\nImage and video URLs from generation expire after 7 days. Always use media_id when creating posts, not the URL.\nCredits are shared across all workspaces on an account.\nWorkspaces are isolated from each other. Generations, posts, media, and connections in one workspace aren't visible in another.\nUsers can set up webhooks at https://powerpost.ai/settings/api for real-time notifications instead of polling. Not needed for agent usage, but useful for production integrations."
      },
      {
        "title": "External endpoints",
        "body": "All requests go to one domain: https://powerpost.ai/api/v1/*. Nothing is sent anywhere else."
      },
      {
        "title": "Security and privacy",
        "body": "Your API key and workspace ID are sent to powerpost.ai as HTTP headers with every request. They're not logged, displayed, or sent anywhere else.\nPrompts, uploaded media, and generated content are stored on PowerPost's servers, scoped to your workspace.\nThis skill only uses curl over HTTPS. It doesn't write files, run scripts, or touch your system."
      },
      {
        "title": "Trust",
        "body": "When you use this skill, your prompts, images, videos, and credentials go to powerpost.ai over HTTPS. PowerPost uses third-party AI models on their servers to process your content. Their privacy policy is at https://powerpost.ai/terms and support is at https://powerpost.ai/contact"
      },
      {
        "title": "Tips",
        "body": "Always check the credit balance before starting a generation. Better to warn the user upfront than hit an insufficient credits error mid-flow.\nDefault to regular research mode. Only use deep when the user asks for it or says the post matters.\nDefault to square for image size if the user doesn't say. It works on most platforms.\nDefault to flux2-flex for the image model. It supports all sizes and handles reference images well.\nIf a generation fails, credits are refunded. Let the user know and suggest trying again.\nWhen the user says \"all platforms,\" use one post type per platform: instagram-feed, tiktok-video, youtube-short, x-post, facebook-post, linkedin-post.\nIf the user's image description is short or vague, suggest setting enhance_prompt: true to let the AI fill in the details.\nDefault to kling-3.0-pro for video generation. It handles both sizes and supports audio.\nDefault to landscape and 5 seconds for video unless the user says otherwise.\nVideo generation is slower than images. Tell the user it may take a couple minutes.\nIf the user provides URLs as references for a post, pass them as source_urls in the content generation request. Each URL adds to the cost."
      }
    ],
    "body": "PowerPost Skill\n\nPowerPost writes social media captions, generates images and videos, and publishes to Instagram, TikTok, X/Twitter, YouTube, Facebook, and LinkedIn through a single API.\n\nSetup\n\nThe user needs two credentials:\n\nPOWERPOST_API_KEY — their API key (starts with pp_live_sk_). They can create one at https://powerpost.ai/settings/api\nPOWERPOST_WORKSPACE_ID — their workspace ID. Found at https://powerpost.ai/settings/workspaces\n\nThere are two ways to configure these in OpenClaw. The API key can go in the Skills UI (the \"API key\" field) or via config. The workspace ID has to be set via config since the UI only has one field per skill:\n\nopenclaw config set skills.entries.powerpost.apiKey \"pp_live_sk_YOUR_KEY\"\nopenclaw config set skills.entries.powerpost.env.POWERPOST_WORKSPACE_ID \"YOUR_WORKSPACE_ID\"\n\n\nAPI keys come in two types:\n\nread_write — full access, including publishing.\nread_draft — can generate content and create drafts, but publishing is blocked (returns 403). Good when a human should review before anything goes live.\n\nNew accounts start with 50 free credits. Pricing details at https://powerpost.ai/pricing\n\nFirst run\n\nBefore running any PowerPost command, make sure both credentials are set. If either is missing, walk the user through setup:\n\nIf POWERPOST_API_KEY is not set:\n\nAsk if they have a PowerPost account. If not, they can sign up at https://powerpost.ai/login\nPoint them to https://powerpost.ai/settings/api to create an API key.\nThey can paste it into the \"API key\" field on the Skills page in the OpenClaw UI, or run: openclaw config set skills.entries.powerpost.apiKey \"pp_live_sk_...\"\n\nIf POWERPOST_WORKSPACE_ID is not set:\n\nPoint them to https://powerpost.ai/settings/workspaces to find it.\nThey need to run: openclaw config set skills.entries.powerpost.env.POWERPOST_WORKSPACE_ID \"their-workspace-id\" — there's no UI field for this one, it has to be set via config.\n\nOnce both are set, verify by calling GET /account/credits. If it returns a balance, you're good. If it returns 401, the API key is wrong.\n\nDon't run any other PowerPost commands until both credentials are confirmed working.\n\nBase URL\n\nAll requests go to:\n\nhttps://powerpost.ai/api/v1\n\nAuthentication Headers\n\nEvery request needs x-api-key (or Authorization: Bearer <key>). All content endpoints also need X-Workspace-Id. The only exception is GET /account/credits which only needs x-api-key.\n\nx-api-key: $POWERPOST_API_KEY\nX-Workspace-Id: $POWERPOST_WORKSPACE_ID\n\nCore Workflow\n\nThe standard PowerPost flow is:\n\nCheck credits to make sure the user has enough balance.\nGenerate content from text, images, or video (async — returns a generation ID).\nPoll for results every 2-3 seconds until status is completed or failed.\nOptionally generate images or videos from the captions or a text prompt (also async — poll for results).\nCreate a post combining the generated captions and images into a draft.\nShow the draft to the user for review before publishing.\nPublish the post to connected social platforms.\n\nAlways check credits before generating content. Always show the user what will be published and get confirmation before calling the publish endpoint.\n\nEndpoints\n1. Check Credits\n\nUse this to check how many credits the user has before starting any generation.\n\ncurl https://powerpost.ai/api/v1/account/credits \\\n  -H \"x-api-key: $POWERPOST_API_KEY\"\n\n\nNote: This endpoint does NOT need the X-Workspace-Id header.\n\nResponse:\n\n{\n  \"balance\": 47\n}\n\n\nTell the user their current balance. If balance is low, warn them before they start a generation.\n\nCredit Costs\n\nCredit costs vary by action:\n\nCaption generation: depends on research mode, input type, number of source URLs, and video length.\nImage generation: depends on model and quantity.\nVideo generation: depends on model, duration, and whether audio is enabled.\nPublishing: depends on platform. Premium platforms like X cost more.\n\nThe exact cost is returned in every API response via credits_used and remaining_credits. Always check credits before starting a generation so the user knows the cost upfront.\n\nCredits are only charged for successful operations. Failed generations, failed publish attempts, and failed URL scrapes are refunded.\n\n2. Upload Media\n\nUse this when the user wants to generate content from images or video, or when they want to attach media to a post.\n\ncurl -X POST https://powerpost.ai/api/v1/media/upload \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -F \"file=@/path/to/file\" \\\n  -F \"type=image\"\n\n\nThe type field must be image or video.\n\nSupported formats:\n\nImages: JPEG, PNG, WebP (max 10 MB)\nVideos: MP4, MOV, WebM (max 500 MB)\n\nResponse:\n\n{\n  \"media_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n  \"type\": \"image\",\n  \"file_name\": \"photo.jpg\",\n  \"file_size\": 245000,\n  \"mime_type\": \"image/jpeg\",\n  \"created_at\": \"2026-01-10T18:30:00Z\"\n}\n\n\nSave the media_id from the response. You will need it for content generation (media_ids field) or for creating posts (media_ids in post items).\n\nTell the user the upload was successful and show the file name and size.\n\n3. Generate Content\n\nUse this when the user wants to create social media captions.\n\nThere are three input modes, determined by which fields you provide:\n\nText only: Send prompt (required, 3-2000 chars).\nImage input: Send media_ids with image IDs (+ optional prompt for context).\nVideo input: Send media_ids with a video ID (+ optional prompt for context).\n\nYou must provide either prompt or media_ids (or both).\n\ncurl -X POST https://powerpost.ai/api/v1/content/generate \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"We just shipped dark mode across all our apps\",\n    \"post_types\": [\"instagram-reel\", \"tiktok-video\", \"x-post\"],\n    \"research_mode\": \"regular\"\n  }'\n\n\nRequired fields:\n\npost_types (string array) — At least one post type. See the post types table below.\nresearch_mode (string) — \"regular\" or \"deep\". Use regular for quick tasks, deep for important posts.\n\nOptional fields:\n\nwriting_style_id (string) — A custom writing style ID created in the dashboard.\ncta_text (string, max 100 chars) — A custom call-to-action.\nsource_urls (string array, max 10) — URLs to scrape for research context. Must be HTTPS. Private/internal URLs are filtered out for security. Each URL adds to the generation cost.\n\nPost types:\n\nPlatform\tPost Types\nInstagram\tinstagram-feed, instagram-reel, instagram-story\nTikTok\ttiktok-video, tiktok-photos\nYouTube\tyoutube-video, youtube-short\nX\tx-post\nFacebook\tfacebook-post, facebook-reel, facebook-story\nLinkedIn\tlinkedin-post\n\nMultiple post types from the same platform produce one shared caption for that platform. The post type declares publishing intent.\n\nResponse:\n\n{\n  \"generation_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"status\": \"processing\",\n  \"credits_used\": 10,\n  \"remaining_credits\": 90,\n  \"status_url\": \"/api/v1/content/generations/550e8400-e29b-41d4-a716-446655440000\"\n}\n\n\nTell the user the generation has started, how many credits it cost, and that you are waiting for it to complete. Then immediately start polling.\n\n4. Get Generation Status (Polling)\n\nAfter starting a generation, poll this endpoint every 2-3 seconds until status is completed or failed. Do not poll more than 60 times (about 2 minutes).\n\ncurl https://powerpost.ai/api/v1/content/generations/GENERATION_ID \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\n\nWhile processing:\n\n{\n  \"generation_id\": \"550e8400-...\",\n  \"status\": \"processing\",\n  \"prompt\": \"We just shipped dark mode\",\n  \"platforms\": [\"tiktok\", \"instagram\"],\n  \"research_mode\": \"regular\",\n  \"credits_used\": 10,\n  \"created_at\": \"2026-01-10T18:30:00Z\"\n}\n\n\nIf status is still processing or pending, wait 3 seconds and poll again.\n\nWhen completed:\n\n{\n  \"generation_id\": \"550e8400-...\",\n  \"status\": \"completed\",\n  \"prompt\": \"We just shipped dark mode\",\n  \"platforms\": [\"tiktok\", \"instagram\"],\n  \"research_mode\": \"regular\",\n  \"credits_used\": 10,\n  \"created_at\": \"2026-01-10T18:30:00Z\",\n  \"outputs\": {\n    \"tiktok\": \"Dark mode activated! POV: your eyes at 2am finally getting some relief... #darkmode #tech\",\n    \"instagram\": \"Dark mode is here!\\n\\nYour late-night scrolling just got easier on the eyes... #DarkMode #ProductUpdate\"\n  }\n}\n\n\nThe outputs object is keyed by platform name (not post type). Each value is a string, EXCEPT YouTube which has a title and description:\n\n\"youtube\": {\n  \"title\": \"We Just Shipped Dark Mode\",\n  \"description\": \"Dark mode is finally here across all our apps... #darkmode\"\n}\n\n\nWhen completed, display all generated captions to the user, clearly labeled by platform.\n\nWhen failed:\n\nThe response includes an error object with code and message. Credits are refunded on failure. Tell the user the generation failed and show the error message.\n\n5. List Generations\n\nUse this when the user wants to see their recent generations or search for a past generation.\n\ncurl \"https://powerpost.ai/api/v1/content/generations?status=completed&limit=10\" \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\n\nQuery parameters (all optional):\n\nstatus — Filter by: pending, processing, completed, failed\nlimit — Results per page, 1-100 (default 20)\ncursor — Pagination cursor from next_cursor in a previous response\n\nResponse:\n\n{\n  \"data\": [\n    {\n      \"generation_id\": \"550e8400-...\",\n      \"status\": \"completed\",\n      \"prompt\": \"We just shipped dark mode\",\n      \"platforms\": [\"tiktok\", \"instagram\"],\n      \"research_mode\": \"regular\",\n      \"credits_used\": 10,\n      \"created_at\": \"2026-01-10T18:30:00Z\"\n    }\n  ],\n  \"next_cursor\": \"gen_cursor_abc123\",\n  \"has_more\": true\n}\n\n\nThe list endpoint does NOT include outputs. To get the full content of a specific generation, use the get generation endpoint with its ID.\n\nShow the user a summary table of their generations. If they want to see the content of a specific one, fetch it with the get endpoint.\n\n6. Generate Images\n\nUse this when the user wants to create AI-generated images. There are three input modes:\n\nText mode: Describe the image in prompt. Reference mode: Provide prompt + style_images (media IDs of uploaded reference images, max 4). Post mode: Provide generation_id to create images matching an existing caption generation (+optional prompt for extra direction and source_post_type to pick which platform caption to use).\n\ncurl -X POST https://powerpost.ai/api/v1/images/generate \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"Minimalist workspace with laptop and coffee, warm morning light\",\n    \"size\": \"square\",\n    \"quantity\": 2,\n    \"model\": \"flux2-flex\"\n  }'\n\n\nFields:\n\nprompt (string, max 2000 chars) — Required for text and reference modes. Optional for post mode.\nsize (string) — square (1:1), feed (4:5), portrait (9:16), landscape (16:9). Default: square.\nquantity (number, 1-4) — How many images to generate. Default: 1.\nmodel (string) — flux2-flex (default, best for multi-reference and fine control), ideogram-3 (best text rendering and logos), gpt-image-1.5 (most photorealistic, best detail), nano-banana-2 (fast generation, great text).\nenhance_prompt (boolean) — Let AI optimize the prompt. Default: false.\nstyle_images (string array) — Media IDs of reference images (max 4). For reference mode.\ngeneration_id (string) — Caption generation ID. For post mode.\nsource_post_type (string) — Which platform's caption to use as source. For post mode only.\n\nModel and size compatibility:\n\nflux2-flex: square, feed, portrait, landscape\nideogram-3: square, feed, portrait, landscape\ngpt-image-1.5: square, portrait, landscape (NO feed)\nnano-banana-2: square, feed, portrait, landscape\n\nIf the user requests a model/size combo that is not supported, warn them and suggest an alternative.\n\nResponse:\n\n{\n  \"image_generation_id\": \"7a8b9c0d-e1f2-3456-abcd-ef7890123456\",\n  \"status\": \"processing\",\n  \"credits_used\": 10,\n  \"remaining_credits\": 36,\n  \"status_url\": \"/api/v1/images/generations/7a8b9c0d-e1f2-3456-abcd-ef7890123456\"\n}\n\n\nTell the user that image generation has started and begin polling.\n\n7. Get Image Generation Status (Polling)\n\nPoll this endpoint every 2-3 seconds until status is completed or failed.\n\ncurl https://powerpost.ai/api/v1/images/generations/IMAGE_GENERATION_ID \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\n\nWhen completed:\n\n{\n  \"image_generation_id\": \"7a8b9c0d-...\",\n  \"status\": \"completed\",\n  \"prompt\": \"Minimalist workspace with laptop and coffee\",\n  \"size\": \"square\",\n  \"quantity\": 2,\n  \"created_at\": \"2026-01-10T18:30:00Z\",\n  \"images\": [\n    {\n      \"media_id\": \"img-001-abcd-efgh\",\n      \"url\": \"https://powerpost.ai/storage/images/img-001-abcd-efgh.webp\",\n      \"thumbnail_url\": \"https://powerpost.ai/storage/images/img-001-abcd-efgh-thumb.jpg\",\n      \"width\": 1024,\n      \"height\": 1024\n    }\n  ]\n}\n\n\nEach image has a media_id which you use to attach the image to a post. The url is a preview link valid for 7 days. Always use the media_id, not the URL, when creating posts.\n\nShow the user the image URLs so they can preview. Save the media_id values for creating posts.\n\nPartial failure: If some images fail while others succeed, you get a partial result with a partial credit refund. The response status will be failed but may still contain an images array with the successful ones.\n\n8. Generate Videos\n\nUse this when the user wants to create AI-generated videos. There are two input modes:\n\nText-to-video: Describe the video in prompt. Image-to-video: Provide prompt + source_image (media ID of an uploaded image).\n\ncurl -X POST https://powerpost.ai/api/v1/videos/generate \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"A golden retriever running through a field of wildflowers at sunset\",\n    \"size\": \"landscape\",\n    \"duration\": 5,\n    \"model\": \"kling-3.0-pro\",\n    \"has_audio\": false\n  }'\n\n\nFields:\n\nprompt (string, required) — Text description of the video.\nsize (string) — landscape (16:9) or portrait (9:16). Default: landscape.\nduration (integer, required) — Duration in seconds. Must match one of the model's supported values (see table).\nmodel (string) — kling-3.0-pro (default), veo-3.1, or runway-gen-4.5.\nhas_audio (boolean) — Generate with audio. Default: false. Only supported by some models.\nenhance_prompt (boolean) — Let AI optimize the prompt. Default: false.\nsource_image (media ID, UUID) — Media ID of an uploaded image for image-to-video mode.\n\nModel details:\n\nModel ID\tName\tSizes\tAudio\tDurations\nkling-3.0-pro\tKling 3.0 Pro\tlandscape, portrait\tYes\t5s, 10s\nveo-3.1\tGoogle Veo 3.1\tlandscape, portrait\tYes\t4s, 8s\nrunway-gen-4.5\tRunway Gen-4.5\tlandscape, portrait\tNo\t5s, 10s\n\nPrompt limits by model: Veo 3.1 = 3000 chars, Kling 3.0 Pro = 2500 chars, Runway Gen-4.5 = 1000 chars.\n\nCredit costs depend on the model, duration, and audio. The exact cost is returned in the response.\n\nResponse:\n\n{\n  \"video_generation_id\": \"7a8b9c0d-e1f2-3456-abcd-ef7890123456\",\n  \"status\": \"processing\",\n  \"credits_used\": 15,\n  \"remaining_credits\": 85,\n  \"status_url\": \"/api/v1/videos/generations/7a8b9c0d-e1f2-3456-abcd-ef7890123456\"\n}\n\n\nTell the user that video generation has started and begin polling.\n\n9. Get Video Generation Status (Polling)\n\nPoll this endpoint every 10 seconds until status is completed or failed. Video generation takes longer than images — do not poll more than 120 times.\n\ncurl https://powerpost.ai/api/v1/videos/generations/VIDEO_GENERATION_ID \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\n\nWhen completed:\n\n{\n  \"video_generation_id\": \"7a8b9c0d-...\",\n  \"status\": \"completed\",\n  \"prompt\": \"A golden retriever running...\",\n  \"size\": \"landscape\",\n  \"duration\": 5,\n  \"has_audio\": false,\n  \"model\": \"kling-3.0-pro\",\n  \"created_at\": \"2026-03-11T10:00:00Z\",\n  \"video\": {\n    \"media_id\": \"vid-001-abcd\",\n    \"url\": \"https://powerpost.ai/storage/videos/vid-001-abcd.mp4\",\n    \"thumbnail_url\": \"https://powerpost.ai/storage/thumbs/vid-001-abcd.jpg\",\n    \"width\": 1920,\n    \"height\": 1080,\n    \"duration\": 5\n  }\n}\n\n\nThe video has a media_id which you use to attach it to a post. The url is a preview link valid for 7 days. Always use the media_id, not the URL, when creating posts.\n\nShow the user the video URL so they can preview. Save the media_id for creating posts.\n\nWhen failed: The response includes an error object with code (VIDEO_GENERATION_FAILED) and message. Credits are refunded on failure.\n\n10. Create Post\n\nUse this to assemble captions and media into a draft post ready for review and publishing.\n\ncurl -X POST https://powerpost.ai/api/v1/posts \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"generation_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"items\": [\n      {\n        \"post_type\": \"instagram-reel\",\n        \"media_ids\": [\"img-001-abcd-efgh\"]\n      },\n      {\n        \"post_type\": \"tiktok-video\",\n        \"media_ids\": [\"img-001-abcd-efgh\"]\n      }\n    ]\n  }'\n\n\nFields:\n\ngeneration_id (string, optional) — Links to a completed caption generation. If provided, content is auto-filled from the generation outputs for each platform.\nitems (array, required) — One item per post type you want to publish.\n\nEach item:\n\npost_type (string, required) — The target post type (e.g., instagram-reel, x-post).\ncontent (string) — The caption text. Required if no generation_id is provided. If generation_id is provided, content is auto-filled but can be overridden.\ntitle (string) — Required for YouTube post types (youtube-video, youtube-short).\nmedia_ids (string array, optional) — Media to attach (uploaded or generated image IDs).\n\nCustom content example (no generation):\n\ncurl -X POST https://powerpost.ai/api/v1/posts \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"items\": [\n      {\n        \"post_type\": \"x-post\",\n        \"content\": \"Just shipped the biggest update of the year.\"\n      },\n      {\n        \"post_type\": \"linkedin-post\",\n        \"content\": \"Excited to announce our biggest product update of the year...\"\n      }\n    ]\n  }'\n\n\nResponse:\n\n{\n  \"post_id\": \"post-550e8400-e29b-41d4-a716-446655440000\",\n  \"status\": \"draft\",\n  \"created_at\": \"2026-01-10T18:30:00Z\",\n  \"items\": [\n    {\n      \"item_id\": \"item-001\",\n      \"post_type\": \"instagram-reel\",\n      \"platform\": \"instagram\",\n      \"content\": \"Dark mode is here! Your late-night scrolling just got easier... #DarkMode\",\n      \"media_ids\": [\"img-001-abcd-efgh\"],\n      \"status\": \"draft\"\n    }\n  ]\n}\n\n\nAfter creating a post, show the user a summary of every item (platform, content preview, attached media) and ask if they want to publish or make changes.\n\n11. Get Post\n\nUse this to check the status of a post, especially after publishing.\n\ncurl https://powerpost.ai/api/v1/posts/POST_ID \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\n\nResponse includes the post with all items and their individual statuses. After publishing, each item will show posting, posted, or failed with an optional platform_post_id for successfully published items.\n\nPost statuses: draft, publishing, published, failed. Item statuses: draft, posting, posted, failed.\n\n12. Publish Post\n\nUse this to publish a draft post to connected social platforms. Always confirm with the user before calling this endpoint.\n\ncurl -X POST https://powerpost.ai/api/v1/posts/POST_ID/publish \\\n  -H \"x-api-key: $POWERPOST_API_KEY\" \\\n  -H \"X-Workspace-Id: $POWERPOST_WORKSPACE_ID\"\n\n\nPrerequisites:\n\nThe user's social platforms must be connected at https://powerpost.ai/settings/connections\nThe post must be in draft status.\nThe user must have sufficient credits.\nThe API key must be read_write type (not read_draft).\n\nResponse:\n\n{\n  \"post_id\": \"post-550e8400-...\",\n  \"status\": \"publishing\",\n  \"credits_used\": 1,\n  \"status_url\": \"/api/v1/posts/post-550e8400-...\"\n}\n\n\nPublishing is asynchronous. After receiving the response, poll the Get Post endpoint every 3 seconds to check when each item has finished publishing.\n\nPublishing costs vary by platform. The exact cost is returned in the response via credits_used.\n\nTell the user how many credits were used and that publishing is in progress. When all items show posted or failed, summarize the results.\n\nCommon User Commands\n\"Post about X\" / \"Create a post about X\"\n\nFull flow:\n\nCheck credits.\nAsk which platforms if not specified. Default to all if the user says \"everywhere\" or \"all platforms\".\nGenerate content with the user's topic as the prompt. Use regular research mode unless they ask for deep. If the user provides URLs as references, include them in source_urls.\nPoll until complete.\nShow the generated captions.\nAsk if they want to generate images too.\nCreate the post.\nShow the draft and ask for confirmation.\nPublish on confirmation.\n\"Write captions about X\" / \"Generate content about X\"\n\nPartial flow (no publishing):\n\nCheck credits.\nGenerate content.\nPoll until complete.\nShow the captions to the user.\n\"Create an image\" / \"Generate an image of X\"\nCheck credits.\nIf the user provides a text description, use text mode. If they reference a previous generation, use post mode. If they have reference images, use reference mode.\nAsk about size preference if not specified (square is a safe default).\nGenerate the image.\nPoll until complete.\nShow the image URLs to the user.\n\"Create a video\" / \"Generate a video of X\"\nCheck credits.\nIf the user has an image they want to animate, use image-to-video mode (upload first, then pass source_image). Otherwise use text-to-video mode.\nAsk about duration if not specified. Default to 5 seconds.\nAsk about size if not specified (landscape is a safe default for video).\nGenerate the video.\nPoll until complete (video takes longer than images — up to a few minutes).\nShow the video URL to the user.\n\"Check my credits\" / \"How many credits do I have?\"\nCall the credits endpoint.\nTell the user their balance.\n\"Upload this image/video\"\nUpload the file using the media upload endpoint.\nTell the user the upload succeeded and show the media ID.\nAsk what they want to do with it (generate captions from it, use it in a post, etc.).\n\"Show my recent posts\" / \"List my generations\"\nCall the list generations endpoint.\nShow a summary of recent generations.\nIf the user wants details on one, fetch it with the get generation endpoint.\n\"Publish my post\" / \"Send it live\"\nIf there is a draft post from this session, publish it.\nIf not, ask the user which post to publish.\nAlways confirm before publishing.\nPolling Strategy\n\nContent generation, image generation, and video generation are all asynchronous. After starting any of them:\n\nWait 2 seconds.\nCall the status endpoint.\nIf status is processing or pending, wait 3 seconds and poll again.\nIf status is completed, show the results.\nIf status is failed, show the error and tell the user credits were refunded.\nDo not poll more than 60 times for content/images, or 120 times for video (it takes longer). If it times out, tell the user to try again later.\n\nPublishing is also asynchronous. After calling publish:\n\nWait 3 seconds.\nPoll the Get Post endpoint.\nCheck each item's status. When all are either posted or failed, stop polling.\nError Handling\n\nAll errors return this format:\n\n{\n  \"error\": {\n    \"message\": \"Human-readable error message\",\n    \"code\": \"ERROR_CODE\"\n  }\n}\n\n\nHandle these errors:\n\nHTTP Status\tCode\tWhat to Tell the User\n400\tVALIDATION_ERROR\tThe request was invalid. Check the fields and try again.\n401\tINVALID_API_KEY\tThe API key is missing or invalid. Check POWERPOST_API_KEY.\n402\tINSUFFICIENT_CREDITS\tNot enough credits. Check balance and suggest upgrading.\n403\tFORBIDDEN\tAccess denied. The API key may be read_draft and publishing was attempted.\n404\tNOT_FOUND\tThe resource was not found. Check the ID.\n409\tALREADY_PUBLISHED\tThis post was already published.\n413\tFILE_TOO_LARGE\tThe file exceeds the size limit (10 MB for images, 500 MB for video).\n413\tSTORAGE_QUOTA_EXCEEDED\tStorage quota exceeded (10 GB limit). Delete unused media or contact support.\n422\tPLATFORM_NOT_CONNECTED\tThe target platform is not connected. Direct user to https://powerpost.ai/settings/connections\n429\tRATE_LIMIT_EXCEEDED\tToo many requests. Wait the duration in retryAfter seconds and retry.\n500\tINTERNAL_ERROR\tServer error. Wait a moment and try again.\n\nFor rate limit errors (429), the response includes a retryAfter field in seconds. Wait that long before retrying.\n\nEvery response includes an X-Request-Id header. If the user needs support, give them this ID.\n\nThings to know\nAlways show the user what will be posted and where, and get explicit confirmation before publishing. This goes to real social accounts.\nYouTube posts need a title field in addition to the caption.\nIf the user picks both instagram-reel and instagram-feed, they share one Instagram caption. The post type controls the publishing format, not the caption.\nImage and video URLs from generation expire after 7 days. Always use media_id when creating posts, not the URL.\nCredits are shared across all workspaces on an account.\nWorkspaces are isolated from each other. Generations, posts, media, and connections in one workspace aren't visible in another.\nUsers can set up webhooks at https://powerpost.ai/settings/api for real-time notifications instead of polling. Not needed for agent usage, but useful for production integrations.\nExternal endpoints\n\nAll requests go to one domain: https://powerpost.ai/api/v1/*. Nothing is sent anywhere else.\n\nSecurity and privacy\nYour API key and workspace ID are sent to powerpost.ai as HTTP headers with every request. They're not logged, displayed, or sent anywhere else.\nPrompts, uploaded media, and generated content are stored on PowerPost's servers, scoped to your workspace.\nThis skill only uses curl over HTTPS. It doesn't write files, run scripts, or touch your system.\nTrust\n\nWhen you use this skill, your prompts, images, videos, and credentials go to powerpost.ai over HTTPS. PowerPost uses third-party AI models on their servers to process your content. Their privacy policy is at https://powerpost.ai/terms and support is at https://powerpost.ai/contact\n\nTips\nAlways check the credit balance before starting a generation. Better to warn the user upfront than hit an insufficient credits error mid-flow.\nDefault to regular research mode. Only use deep when the user asks for it or says the post matters.\nDefault to square for image size if the user doesn't say. It works on most platforms.\nDefault to flux2-flex for the image model. It supports all sizes and handles reference images well.\nIf a generation fails, credits are refunded. Let the user know and suggest trying again.\nWhen the user says \"all platforms,\" use one post type per platform: instagram-feed, tiktok-video, youtube-short, x-post, facebook-post, linkedin-post.\nIf the user's image description is short or vague, suggest setting enhance_prompt: true to let the AI fill in the details.\nDefault to kling-3.0-pro for video generation. It handles both sizes and supports audio.\nDefault to landscape and 5 seconds for video unless the user says otherwise.\nVideo generation is slower than images. Tell the user it may take a couple minutes.\nIf the user provides URLs as references for a post, pass them as source_urls in the content generation request. Each URL adds to the cost."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/tarekhoury/openclaw-powerpost",
    "publisherUrl": "https://clawhub.ai/tarekhoury/openclaw-powerpost",
    "owner": "tarekhoury",
    "version": "0.2.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/openclaw-powerpost",
    "downloadUrl": "https://openagent3.xyz/downloads/openclaw-powerpost",
    "agentUrl": "https://openagent3.xyz/skills/openclaw-powerpost/agent",
    "manifestUrl": "https://openagent3.xyz/skills/openclaw-powerpost/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/openclaw-powerpost/agent.md"
  }
}