{
  "schemaVersion": "1.0",
  "item": {
    "slug": "postnitro-carousel",
    "name": "PostNitro Carousel Generator",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/iAmMuneeb/postnitro-carousel",
    "canonicalUrl": "https://clawhub.ai/iAmMuneeb/postnitro-carousel",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/postnitro-carousel",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=postnitro-carousel",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "references/api-reference.md",
      "examples/EXAMPLES.md",
      "examples/generate-from-text.json",
      "examples/generate-from-x-post.json",
      "examples/import-default.json",
      "examples/import-infographics.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. 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/postnitro-carousel"
    },
    "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/postnitro-carousel",
    "agentPageUrl": "https://openagent3.xyz/skills/postnitro-carousel/agent",
    "manifestUrl": "https://openagent3.xyz/skills/postnitro-carousel/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/postnitro-carousel/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": "PostNitro Carousel Generator",
        "body": "Generate social media carousel posts via the PostNitro.ai Embed API. Two workflows: AI generation (topic/article/X post → carousel) and content import (your own slides, with optional infographics)."
      },
      {
        "title": "Setup",
        "body": "Sign up at https://postnitro.ai (free plan: 5 credits/month)\nGo to account settings → \"Embed\" → generate an API key\nSet up your template, brand, and AI preset in the PostNitro dashboard\nSet environment variables:\nexport POSTNITRO_API_KEY=\"your-api-key\"\nexport POSTNITRO_TEMPLATE_ID=\"your-template-id\"\nexport POSTNITRO_BRAND_ID=\"your-brand-id\"\nexport POSTNITRO_PRESET_ID=\"your-ai-preset-id\"\n\nBase URL: https://embed-api.postnitro.ai\nAuth header: embed-api-key: $POSTNITRO_API_KEY"
      },
      {
        "title": "Core Workflow",
        "body": "All carousel creation is asynchronous: Initiate → Poll Status → Get Output."
      },
      {
        "title": "1. Generate a carousel with AI",
        "body": "curl -X POST 'https://embed-api.postnitro.ai/post/initiate/generate' \\\n  -H 'Content-Type: application/json' \\\n  -H \"embed-api-key: $POSTNITRO_API_KEY\" \\\n  -d '{\n    \"postType\": \"CAROUSEL\",\n    \"templateId\": \"'\"$POSTNITRO_TEMPLATE_ID\"'\",\n    \"brandId\": \"'\"$POSTNITRO_BRAND_ID\"'\",\n    \"presetId\": \"'\"$POSTNITRO_PRESET_ID\"'\",\n    \"responseType\": \"PNG\",\n    \"aiGeneration\": {\n      \"type\": \"text\",\n      \"context\": \"5 tips for growing your LinkedIn audience in 2026\",\n      \"instructions\": \"Professional tone, actionable advice\"\n    }\n  }'\n\nReturns { \"success\": true, \"data\": { \"embedPostId\": \"post123\", \"status\": \"PENDING\" } }. Save the embedPostId.\n\naiGeneration.type values:\n\n\"text\" — context is the text content to turn into a carousel\n\"article\" — context is an article URL to extract and convert\n\"x\" — context is an X (Twitter) post or thread URL\n\nSee examples/generate-from-text.json, examples/generate-from-article.json, and examples/generate-from-x-post.json."
      },
      {
        "title": "2. Import your own slide content",
        "body": "curl -X POST 'https://embed-api.postnitro.ai/post/initiate/import' \\\n  -H 'Content-Type: application/json' \\\n  -H \"embed-api-key: $POSTNITRO_API_KEY\" \\\n  -d '{\n    \"postType\": \"CAROUSEL\",\n    \"templateId\": \"'\"$POSTNITRO_TEMPLATE_ID\"'\",\n    \"brandId\": \"'\"$POSTNITRO_BRAND_ID\"'\",\n    \"responseType\": \"PNG\",\n    \"slides\": [\n      { \"type\": \"starting_slide\", \"heading\": \"Your Title\", \"description\": \"Intro text\" },\n      { \"type\": \"body_slide\", \"heading\": \"Key Point\", \"description\": \"Details here\" },\n      { \"type\": \"ending_slide\", \"heading\": \"Take Action!\", \"cta_button\": \"Learn More\" }\n    ]\n  }'\n\nReturns same response format with embedPostId.\n\nSlide rules:\n\nExactly 1 starting_slide (required)\nAt least 1 body_slide (required)\nExactly 1 ending_slide (required)\nheading is required on every slide\n\nSlide fields: heading (required), sub_heading, description, image (URL), background_image (URL), cta_button, layoutType, layoutConfig.\n\nFor infographic slides, set layoutType: \"infographic\" on body slides — replaces the image with structured data columns. See examples/import-infographics.json and references/api-reference.md for full infographics config."
      },
      {
        "title": "3. Check post status",
        "body": "curl -X GET \"https://embed-api.postnitro.ai/post/status/$EMBED_POST_ID\" \\\n  -H \"embed-api-key: $POSTNITRO_API_KEY\"\n\nPoll every 3–5 seconds until data.embedPost.status is \"COMPLETED\". The logs array shows step-by-step progress."
      },
      {
        "title": "4. Get the output",
        "body": "curl -X GET \"https://embed-api.postnitro.ai/post/output/$EMBED_POST_ID\" \\\n  -H \"embed-api-key: $POSTNITRO_API_KEY\"\n\nReturns downloadable URLs in data.result.data:\n\nPNG: Array of URLs (one per slide)\nPDF: Single URL\n\nSee references/api-reference.md for full response schemas."
      },
      {
        "title": "Pattern 1: LinkedIn thought leadership carousel",
        "body": "Generate a carousel from a topic with professional tone:\n\n{\n  \"aiGeneration\": {\n    \"type\": \"text\",\n    \"context\": \"5 mistakes startups make with their LinkedIn strategy and how to fix each one\",\n    \"instructions\": \"Professional but conversational tone. Each slide should have one clear takeaway.\"\n  }\n}"
      },
      {
        "title": "Pattern 2: Repurpose a blog post",
        "body": "Turn an existing article into a carousel:\n\n{\n  \"aiGeneration\": {\n    \"type\": \"article\",\n    \"context\": \"https://yourblog.com/posts/social-media-strategy-2026\",\n    \"instructions\": \"Extract the 5 most actionable points. Keep slide text concise.\"\n  }\n}"
      },
      {
        "title": "Pattern 3: Repurpose an X thread",
        "body": "Convert a viral X thread into a visual carousel:\n\n{\n  \"aiGeneration\": {\n    \"type\": \"x\",\n    \"context\": \"https://x.com/username/status/1234567890\",\n    \"instructions\": \"Maintain the original voice and key points\"\n  }\n}"
      },
      {
        "title": "Pattern 4: Data-driven infographic carousel",
        "body": "Import slides with structured infographic layouts:\n\nSee examples/import-infographics.json for a complete example with grid and cycle layouts."
      },
      {
        "title": "Content Strategy Tips",
        "body": "LinkedIn: Professional tone, actionable insights, 6–10 slides, clear CTA.\nInstagram: Visual-first, concise text, 5–8 slides, storytelling arc.\nTikTok: Trendy, punchy, 4–7 slides, hook on slide 1.\nX (Twitter): Data-driven, 3–6 slides, provocative opening."
      },
      {
        "title": "Common Gotchas",
        "body": "Default responseType is PDF — always specify \"PNG\" explicitly if you want individual slide images.\nheading is required on every slide — omitting it returns an error.\nSlide structure is strict — exactly 1 starting, at least 1 body, exactly 1 ending.\nArticle type needs a URL — \"article\" type expects a URL as context, not plain text.\nX type needs an X post URL — \"x\" type expects https://x.com/... or https://twitter.com/... as context.\nInfographics replace images — setting layoutType: \"infographic\" overrides any image on that slide.\nCyclical infographics use first column only — columnDisplay: \"cycle\" ignores data in columns 2+.\nMax 3 columns — columnCount cannot exceed 3 for infographic layouts.\nImage URLs must be public — image and background_image fields require publicly accessible URLs.\nCredits vary by method — AI generation costs 2 credits/slide, content import costs 1 credit/slide."
      },
      {
        "title": "Credits & Pricing",
        "body": "PlanPriceCredits/MonthFree$05Monthly$10250+ (scalable)\n\nContent import: 1 credit per slide\nAI generation: 2 credits per slide"
      },
      {
        "title": "Supporting Resources",
        "body": "Reference docs:\n\nreferences/api-reference.md — Complete endpoint reference with request/response schemas and infographics config\n\nReady-to-use examples:\n\nexamples/EXAMPLES.md — Index of all examples\nexamples/generate-from-text.json — AI generation from text\nexamples/generate-from-article.json — AI generation from article URL\nexamples/generate-from-x-post.json — AI generation from X post\nexamples/import-default.json — Basic slide import\nexamples/import-infographics.json — Import with infographic layouts"
      },
      {
        "title": "Quick Reference",
        "body": "# Auth\nHeader: embed-api-key: $POSTNITRO_API_KEY\n\n# AI generation\nPOST /post/initiate/generate  { postType, templateId, brandId, presetId, responseType?, requestorId?, aiGeneration: { type, context, instructions? } }\n\n# Content import\nPOST /post/initiate/import  { postType, templateId, brandId, responseType?, requestorId?, slides: [{ type, heading, ... }] }\n\n# Check status (poll until COMPLETED)\nGET /post/status/{embedPostId}\n\n# Get output (download URLs)\nGET /post/output/{embedPostId}"
      },
      {
        "title": "Tips for the Agent",
        "body": "Always confirm the user has set POSTNITRO_API_KEY, POSTNITRO_TEMPLATE_ID, POSTNITRO_BRAND_ID before calling any endpoint.\nPOSTNITRO_PRESET_ID is only required for AI generation, not for content import.\nFor \"article\" type, the context must be a URL — not article text. For article text, use \"text\" type.\nFor \"x\" type, the context must be an X/Twitter post URL.\nDefault responseType is \"PDF\" — always pass \"PNG\" if the user wants individual slide images.\nWhen importing slides, always structure as: 1 starting_slide → 1+ body_slide → 1 ending_slide.\nFor data-heavy content, suggest using infographic layouts on body slides instead of plain text.\nPoll GET /post/status/{embedPostId} every 3–5 seconds — don't hammer the endpoint.\nAfter getting output, the data field contains download URLs — present them to the user directly.\nIf the user doesn't specify a platform, suggest LinkedIn (most common carousel use case).\nWarn users about credit costs upfront: AI generation is 2x the cost of content import."
      }
    ],
    "body": "PostNitro Carousel Generator\n\nGenerate social media carousel posts via the PostNitro.ai Embed API. Two workflows: AI generation (topic/article/X post → carousel) and content import (your own slides, with optional infographics).\n\nSetup\nSign up at https://postnitro.ai (free plan: 5 credits/month)\nGo to account settings → \"Embed\" → generate an API key\nSet up your template, brand, and AI preset in the PostNitro dashboard\nSet environment variables:\nexport POSTNITRO_API_KEY=\"your-api-key\"\nexport POSTNITRO_TEMPLATE_ID=\"your-template-id\"\nexport POSTNITRO_BRAND_ID=\"your-brand-id\"\nexport POSTNITRO_PRESET_ID=\"your-ai-preset-id\"\n\n\nBase URL: https://embed-api.postnitro.ai Auth header: embed-api-key: $POSTNITRO_API_KEY\n\nCore Workflow\n\nAll carousel creation is asynchronous: Initiate → Poll Status → Get Output.\n\n1. Generate a carousel with AI\ncurl -X POST 'https://embed-api.postnitro.ai/post/initiate/generate' \\\n  -H 'Content-Type: application/json' \\\n  -H \"embed-api-key: $POSTNITRO_API_KEY\" \\\n  -d '{\n    \"postType\": \"CAROUSEL\",\n    \"templateId\": \"'\"$POSTNITRO_TEMPLATE_ID\"'\",\n    \"brandId\": \"'\"$POSTNITRO_BRAND_ID\"'\",\n    \"presetId\": \"'\"$POSTNITRO_PRESET_ID\"'\",\n    \"responseType\": \"PNG\",\n    \"aiGeneration\": {\n      \"type\": \"text\",\n      \"context\": \"5 tips for growing your LinkedIn audience in 2026\",\n      \"instructions\": \"Professional tone, actionable advice\"\n    }\n  }'\n\n\nReturns { \"success\": true, \"data\": { \"embedPostId\": \"post123\", \"status\": \"PENDING\" } }. Save the embedPostId.\n\naiGeneration.type values:\n\n\"text\" — context is the text content to turn into a carousel\n\"article\" — context is an article URL to extract and convert\n\"x\" — context is an X (Twitter) post or thread URL\n\nSee examples/generate-from-text.json, examples/generate-from-article.json, and examples/generate-from-x-post.json.\n\n2. Import your own slide content\ncurl -X POST 'https://embed-api.postnitro.ai/post/initiate/import' \\\n  -H 'Content-Type: application/json' \\\n  -H \"embed-api-key: $POSTNITRO_API_KEY\" \\\n  -d '{\n    \"postType\": \"CAROUSEL\",\n    \"templateId\": \"'\"$POSTNITRO_TEMPLATE_ID\"'\",\n    \"brandId\": \"'\"$POSTNITRO_BRAND_ID\"'\",\n    \"responseType\": \"PNG\",\n    \"slides\": [\n      { \"type\": \"starting_slide\", \"heading\": \"Your Title\", \"description\": \"Intro text\" },\n      { \"type\": \"body_slide\", \"heading\": \"Key Point\", \"description\": \"Details here\" },\n      { \"type\": \"ending_slide\", \"heading\": \"Take Action!\", \"cta_button\": \"Learn More\" }\n    ]\n  }'\n\n\nReturns same response format with embedPostId.\n\nSlide rules:\n\nExactly 1 starting_slide (required)\nAt least 1 body_slide (required)\nExactly 1 ending_slide (required)\nheading is required on every slide\n\nSlide fields: heading (required), sub_heading, description, image (URL), background_image (URL), cta_button, layoutType, layoutConfig.\n\nFor infographic slides, set layoutType: \"infographic\" on body slides — replaces the image with structured data columns. See examples/import-infographics.json and references/api-reference.md for full infographics config.\n\n3. Check post status\ncurl -X GET \"https://embed-api.postnitro.ai/post/status/$EMBED_POST_ID\" \\\n  -H \"embed-api-key: $POSTNITRO_API_KEY\"\n\n\nPoll every 3–5 seconds until data.embedPost.status is \"COMPLETED\". The logs array shows step-by-step progress.\n\n4. Get the output\ncurl -X GET \"https://embed-api.postnitro.ai/post/output/$EMBED_POST_ID\" \\\n  -H \"embed-api-key: $POSTNITRO_API_KEY\"\n\n\nReturns downloadable URLs in data.result.data:\n\nPNG: Array of URLs (one per slide)\nPDF: Single URL\n\nSee references/api-reference.md for full response schemas.\n\nCommon Patterns\nPattern 1: LinkedIn thought leadership carousel\n\nGenerate a carousel from a topic with professional tone:\n\n{\n  \"aiGeneration\": {\n    \"type\": \"text\",\n    \"context\": \"5 mistakes startups make with their LinkedIn strategy and how to fix each one\",\n    \"instructions\": \"Professional but conversational tone. Each slide should have one clear takeaway.\"\n  }\n}\n\nPattern 2: Repurpose a blog post\n\nTurn an existing article into a carousel:\n\n{\n  \"aiGeneration\": {\n    \"type\": \"article\",\n    \"context\": \"https://yourblog.com/posts/social-media-strategy-2026\",\n    \"instructions\": \"Extract the 5 most actionable points. Keep slide text concise.\"\n  }\n}\n\nPattern 3: Repurpose an X thread\n\nConvert a viral X thread into a visual carousel:\n\n{\n  \"aiGeneration\": {\n    \"type\": \"x\",\n    \"context\": \"https://x.com/username/status/1234567890\",\n    \"instructions\": \"Maintain the original voice and key points\"\n  }\n}\n\nPattern 4: Data-driven infographic carousel\n\nImport slides with structured infographic layouts:\n\nSee examples/import-infographics.json for a complete example with grid and cycle layouts.\n\nContent Strategy Tips\nLinkedIn: Professional tone, actionable insights, 6–10 slides, clear CTA.\nInstagram: Visual-first, concise text, 5–8 slides, storytelling arc.\nTikTok: Trendy, punchy, 4–7 slides, hook on slide 1.\nX (Twitter): Data-driven, 3–6 slides, provocative opening.\nCommon Gotchas\nDefault responseType is PDF — always specify \"PNG\" explicitly if you want individual slide images.\nheading is required on every slide — omitting it returns an error.\nSlide structure is strict — exactly 1 starting, at least 1 body, exactly 1 ending.\nArticle type needs a URL — \"article\" type expects a URL as context, not plain text.\nX type needs an X post URL — \"x\" type expects https://x.com/... or https://twitter.com/... as context.\nInfographics replace images — setting layoutType: \"infographic\" overrides any image on that slide.\nCyclical infographics use first column only — columnDisplay: \"cycle\" ignores data in columns 2+.\nMax 3 columns — columnCount cannot exceed 3 for infographic layouts.\nImage URLs must be public — image and background_image fields require publicly accessible URLs.\nCredits vary by method — AI generation costs 2 credits/slide, content import costs 1 credit/slide.\nCredits & Pricing\nPlan\tPrice\tCredits/Month\nFree\t$0\t5\nMonthly\t$10\t250+ (scalable)\nContent import: 1 credit per slide\nAI generation: 2 credits per slide\nSupporting Resources\n\nReference docs:\n\nreferences/api-reference.md — Complete endpoint reference with request/response schemas and infographics config\n\nReady-to-use examples:\n\nexamples/EXAMPLES.md — Index of all examples\nexamples/generate-from-text.json — AI generation from text\nexamples/generate-from-article.json — AI generation from article URL\nexamples/generate-from-x-post.json — AI generation from X post\nexamples/import-default.json — Basic slide import\nexamples/import-infographics.json — Import with infographic layouts\nQuick Reference\n# Auth\nHeader: embed-api-key: $POSTNITRO_API_KEY\n\n# AI generation\nPOST /post/initiate/generate  { postType, templateId, brandId, presetId, responseType?, requestorId?, aiGeneration: { type, context, instructions? } }\n\n# Content import\nPOST /post/initiate/import  { postType, templateId, brandId, responseType?, requestorId?, slides: [{ type, heading, ... }] }\n\n# Check status (poll until COMPLETED)\nGET /post/status/{embedPostId}\n\n# Get output (download URLs)\nGET /post/output/{embedPostId}\n\nTips for the Agent\nAlways confirm the user has set POSTNITRO_API_KEY, POSTNITRO_TEMPLATE_ID, POSTNITRO_BRAND_ID before calling any endpoint.\nPOSTNITRO_PRESET_ID is only required for AI generation, not for content import.\nFor \"article\" type, the context must be a URL — not article text. For article text, use \"text\" type.\nFor \"x\" type, the context must be an X/Twitter post URL.\nDefault responseType is \"PDF\" — always pass \"PNG\" if the user wants individual slide images.\nWhen importing slides, always structure as: 1 starting_slide → 1+ body_slide → 1 ending_slide.\nFor data-heavy content, suggest using infographic layouts on body slides instead of plain text.\nPoll GET /post/status/{embedPostId} every 3–5 seconds — don't hammer the endpoint.\nAfter getting output, the data field contains download URLs — present them to the user directly.\nIf the user doesn't specify a platform, suggest LinkedIn (most common carousel use case).\nWarn users about credit costs upfront: AI generation is 2x the cost of content import."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/iAmMuneeb/postnitro-carousel",
    "publisherUrl": "https://clawhub.ai/iAmMuneeb/postnitro-carousel",
    "owner": "iAmMuneeb",
    "version": "2.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/postnitro-carousel",
    "downloadUrl": "https://openagent3.xyz/downloads/postnitro-carousel",
    "agentUrl": "https://openagent3.xyz/skills/postnitro-carousel/agent",
    "manifestUrl": "https://openagent3.xyz/skills/postnitro-carousel/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/postnitro-carousel/agent.md"
  }
}