{
  "schemaVersion": "1.0",
  "item": {
    "slug": "publora-instagram",
    "name": "Publora — Instagram",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/sergebulaev/publora-instagram",
    "canonicalUrl": "https://clawhub.ai/sergebulaev/publora-instagram",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/publora-instagram",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=publora-instagram",
    "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/publora-instagram"
    },
    "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/publora-instagram",
    "agentPageUrl": "https://openagent3.xyz/skills/publora-instagram/agent",
    "manifestUrl": "https://openagent3.xyz/skills/publora-instagram/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/publora-instagram/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": "Publora — Instagram",
        "body": "Instagram platform skill for the Publora API. For auth, core scheduling, media upload, and workspace/webhook docs, see the publora core skill.\n\nBase URL: https://api.publora.com/api/v1\nHeader: x-publora-key: sk_YOUR_KEY\nPlatform ID format: instagram-{accountId}"
      },
      {
        "title": "Requirements",
        "body": "Instagram Business account (personal and Creator accounts are NOT supported by the Instagram Graph API)\nAccount must be connected to a Facebook Page\nConnected via OAuth through the Publora dashboard"
      },
      {
        "title": "Platform Limits (API)",
        "body": "⚠️ Instagram API is significantly more restrictive than the native app.\n\nPropertyAPI LimitNative AppCaption2,200 characters2,200Images10 × 8 MB20 imagesImage formatJPEG only ⚠️PNG, GIF also workMixed carousel❌ No images + videos✅Reels duration90 seconds ⚠️15–20 minutesReels size300 MB—Carousel video60s per clip / 300 MB—Text only❌ Media required—Rate limit50 posts/24hr—\n\nFirst 125 characters visible before \"more\".\n\nCommon errors:\n\n(#10) The user is not an Instagram Business — Creator accounts not supported, switch to Business\nError 2207010 — caption exceeds 2,200 chars\nError 2207004 — image exceeds 8 MB\nError 9, Subcode 2207042 — rate limit reached"
      },
      {
        "title": "Post an Image",
        "body": "// Step 1: Create the post\nconst post = await fetch('https://api.publora.com/api/v1/create-post', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json', 'x-publora-key': 'sk_YOUR_KEY' },\n  body: JSON.stringify({\n    content: 'Your caption here ✨ #hashtag',\n    platforms: ['instagram-17841412345678'],\n    scheduledTime: '2026-03-20T12:00:00.000Z'\n  })\n}).then(r => r.json());\n\n// Step 2: Get upload URL\nconst upload = await fetch('https://api.publora.com/api/v1/get-upload-url', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json', 'x-publora-key': 'sk_YOUR_KEY' },\n  body: JSON.stringify({\n    postGroupId: post.postGroupId,\n    fileName: 'photo.jpg',\n    contentType: 'image/jpeg',   // ⚠️ JPEG only for Instagram\n    type: 'image'\n  })\n}).then(r => r.json());\n\n// Step 3: Upload to S3\nawait fetch(upload.uploadUrl, {\n  method: 'PUT',\n  headers: { 'Content-Type': 'image/jpeg' },\n  body: imageFileBytes\n});"
      },
      {
        "title": "Post a Carousel (up to 10 images)",
        "body": "Call get-upload-url N times with the same postGroupId:\n\nimport requests\n\nHEADERS = { 'Content-Type': 'application/json', 'x-publora-key': 'sk_YOUR_KEY' }\n\n# Create post\npost = requests.post('https://api.publora.com/api/v1/create-post', headers=HEADERS, json={\n    'content': 'Swipe through our product highlights! 👆',\n    'platforms': ['instagram-17841412345678'],\n    'scheduledTime': '2026-03-20T12:00:00.000Z'\n}).json()\n\n# Upload each image (max 10)\nimages = ['slide1.jpg', 'slide2.jpg', 'slide3.jpg']\nfor img_path in images:\n    upload = requests.post('https://api.publora.com/api/v1/get-upload-url', headers=HEADERS, json={\n        'postGroupId': post['postGroupId'],\n        'fileName': img_path,\n        'contentType': 'image/jpeg',\n        'type': 'image'\n    }).json()\n    with open(img_path, 'rb') as f:\n        requests.put(upload['uploadUrl'], headers={'Content-Type': 'image/jpeg'}, data=f)"
      },
      {
        "title": "Post a Reel (video, max 90s via API)",
        "body": "// Create post, then upload video via get-upload-url with type: 'video'\nconst post = await createPost({\n  content: 'Check out our latest Reel! 🎬',\n  platforms: ['instagram-17841412345678']\n});\n\nconst upload = await getUploadUrl({\n  postGroupId: post.postGroupId,\n  fileName: 'reel.mp4',\n  contentType: 'video/mp4',\n  type: 'video'\n});\n// Then PUT the video file to upload.uploadUrl\n\n⚠️ Reels via API are limited to 90 seconds. Longer videos will be rejected."
      },
      {
        "title": "Platform Quirks",
        "body": "JPEG only: The Instagram Graph API rejects PNG and GIF. Convert images to JPEG before uploading. Publora does NOT auto-convert for Instagram.\nBusiness accounts only: Creator accounts ((#10) error) cannot use the Content Publishing API\nNo shopping tags, branded content, filters, or music via API\nCarousels: API max is 10 items (native app allows 20); cannot mix images and videos in same carousel\nWebP: Must be converted to JPEG manually before upload"
      }
    ],
    "body": "Publora — Instagram\n\nInstagram platform skill for the Publora API. For auth, core scheduling, media upload, and workspace/webhook docs, see the publora core skill.\n\nBase URL: https://api.publora.com/api/v1\nHeader: x-publora-key: sk_YOUR_KEY\nPlatform ID format: instagram-{accountId}\n\nRequirements\nInstagram Business account (personal and Creator accounts are NOT supported by the Instagram Graph API)\nAccount must be connected to a Facebook Page\nConnected via OAuth through the Publora dashboard\nPlatform Limits (API)\n\n⚠️ Instagram API is significantly more restrictive than the native app.\n\nProperty\tAPI Limit\tNative App\nCaption\t2,200 characters\t2,200\nImages\t10 × 8 MB\t20 images\nImage format\tJPEG only ⚠️\tPNG, GIF also work\nMixed carousel\t❌ No images + videos\t✅\nReels duration\t90 seconds ⚠️\t15–20 minutes\nReels size\t300 MB\t—\nCarousel video\t60s per clip / 300 MB\t—\nText only\t❌ Media required\t—\nRate limit\t50 posts/24hr\t—\n\nFirst 125 characters visible before \"more\".\n\nCommon errors:\n\n(#10) The user is not an Instagram Business — Creator accounts not supported, switch to Business\nError 2207010 — caption exceeds 2,200 chars\nError 2207004 — image exceeds 8 MB\nError 9, Subcode 2207042 — rate limit reached\nPost an Image\n// Step 1: Create the post\nconst post = await fetch('https://api.publora.com/api/v1/create-post', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json', 'x-publora-key': 'sk_YOUR_KEY' },\n  body: JSON.stringify({\n    content: 'Your caption here ✨ #hashtag',\n    platforms: ['instagram-17841412345678'],\n    scheduledTime: '2026-03-20T12:00:00.000Z'\n  })\n}).then(r => r.json());\n\n// Step 2: Get upload URL\nconst upload = await fetch('https://api.publora.com/api/v1/get-upload-url', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json', 'x-publora-key': 'sk_YOUR_KEY' },\n  body: JSON.stringify({\n    postGroupId: post.postGroupId,\n    fileName: 'photo.jpg',\n    contentType: 'image/jpeg',   // ⚠️ JPEG only for Instagram\n    type: 'image'\n  })\n}).then(r => r.json());\n\n// Step 3: Upload to S3\nawait fetch(upload.uploadUrl, {\n  method: 'PUT',\n  headers: { 'Content-Type': 'image/jpeg' },\n  body: imageFileBytes\n});\n\nPost a Carousel (up to 10 images)\n\nCall get-upload-url N times with the same postGroupId:\n\nimport requests\n\nHEADERS = { 'Content-Type': 'application/json', 'x-publora-key': 'sk_YOUR_KEY' }\n\n# Create post\npost = requests.post('https://api.publora.com/api/v1/create-post', headers=HEADERS, json={\n    'content': 'Swipe through our product highlights! 👆',\n    'platforms': ['instagram-17841412345678'],\n    'scheduledTime': '2026-03-20T12:00:00.000Z'\n}).json()\n\n# Upload each image (max 10)\nimages = ['slide1.jpg', 'slide2.jpg', 'slide3.jpg']\nfor img_path in images:\n    upload = requests.post('https://api.publora.com/api/v1/get-upload-url', headers=HEADERS, json={\n        'postGroupId': post['postGroupId'],\n        'fileName': img_path,\n        'contentType': 'image/jpeg',\n        'type': 'image'\n    }).json()\n    with open(img_path, 'rb') as f:\n        requests.put(upload['uploadUrl'], headers={'Content-Type': 'image/jpeg'}, data=f)\n\nPost a Reel (video, max 90s via API)\n// Create post, then upload video via get-upload-url with type: 'video'\nconst post = await createPost({\n  content: 'Check out our latest Reel! 🎬',\n  platforms: ['instagram-17841412345678']\n});\n\nconst upload = await getUploadUrl({\n  postGroupId: post.postGroupId,\n  fileName: 'reel.mp4',\n  contentType: 'video/mp4',\n  type: 'video'\n});\n// Then PUT the video file to upload.uploadUrl\n\n\n⚠️ Reels via API are limited to 90 seconds. Longer videos will be rejected.\n\nPlatform Quirks\nJPEG only: The Instagram Graph API rejects PNG and GIF. Convert images to JPEG before uploading. Publora does NOT auto-convert for Instagram.\nBusiness accounts only: Creator accounts ((#10) error) cannot use the Content Publishing API\nNo shopping tags, branded content, filters, or music via API\nCarousels: API max is 10 items (native app allows 20); cannot mix images and videos in same carousel\nWebP: Must be converted to JPEG manually before upload"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/sergebulaev/publora-instagram",
    "publisherUrl": "https://clawhub.ai/sergebulaev/publora-instagram",
    "owner": "sergebulaev",
    "version": "2.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/publora-instagram",
    "downloadUrl": "https://openagent3.xyz/downloads/publora-instagram",
    "agentUrl": "https://openagent3.xyz/skills/publora-instagram/agent",
    "manifestUrl": "https://openagent3.xyz/skills/publora-instagram/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/publora-instagram/agent.md"
  }
}