BulkPublish: Bulk Publish

Upload media files (local or URL), manage media library, and batch-create posts via BulkPublish. Use when the user wants to upload files or publish content in bulk.

Muhammad Azeem

@azeemkafridi

Install

$ openclaw skills install @azeemkafridi/bulk-publish

BulkPublish — Media & Bulk Publishing Reference

upload_media parameters

url       (string, optional) — public URL to download from
filePath  (string, optional) — absolute local file path (e.g. /Users/me/photo.png)
filename  (string, optional) — override filename, otherwise derived from url/path

Provide either url OR filePath, not both.

Supported formats

TypeFormatsMax size
ImageJPEG, PNG, WebP, GIF100MB
VideoMP4, MOV, WebM100MB (up to 1GB via multipart — see below)

Response

Returns: id (use this in mediaFileIds when creating posts), fileName, mimeType, sizeBytes, width, height, duration (video), originalUrl, thumbnailUrl, previewUrl.

Other media tools

ToolUse forKey params
list_mediaBrowse uploaded filessearch, page, limit
get_mediaSingle file detailsmediaId
delete_mediaRemove a filemediaId

Media requirements by platform

PlatformImageVideoNotes
Instagram Reels—MP4, 9:163 seconds–15 minutes
Instagram StoriesJPEG/PNG, 9:16MP4, 9:161080x1920 recommended; video 3–60 seconds
Instagram CarouselJPEG/PNG—2-10 images
TikTok—MP4Up to 3 minutes for every account; some accounts 5 or 10
YouTube—MP4Requires title in platformSpecific
PinterestJPEG/PNG, 2:3MP41000x1500 recommended; video pins at least 4 seconds
Facebook/X/LinkedInJPEG/PNGMP4Most formats accepted

Large files — multipart upload (REST API)

For videos over 100MB (up to 1GB), use the chunked multipart flow: MCP tools create_multipart_upload, complete_multipart_upload, abort_multipart_upload, or the REST API (Authorization: Bearer bp_your_key, base https://app.bulkpublish.com):

  1. POST /api/media/multipart/create — body {contentType, sizeBytes} (exact size) → {r2Key, uploadId, partSize, partUrls, expiresIn}. partSize is fixed at 10MB (10485760); partUrls is one presigned PUT URL per part, in order; URLs expire in 3600s.
  2. PUT each 10MB slice of the file to its partUrl and save the ETag response header per part. A failed part can be retried alone — a network drop never restarts the whole file.
  3. POST /api/media/multipart/complete — body {r2Key, uploadId, parts: [{partNumber, etag}], fileName, mimeType, sizeBytes, width?, height?, duration?} → {file} (same media object as a normal upload; its id goes in mediaFileIds). Failed assembly auto-aborts the upload.
  • To cancel mid-flight: POST /api/media/multipart/abort — body {r2Key, uploadId} (frees stored parts)
  • 400 = disallowed type or too large; 403 with error.code: "QUOTA_EXCEEDED" = storage quota exceeded

Bulk actions and approval

bulk_posts (delete | retry | reschedule) does not take requestApproval. A bulk retry on posts whose role lacks post:publish fails with 403 APPROVAL_REQUIRED — those posts must be submitted for team approval instead (create/update with requestApproval: true, then a teammate calls approve_post). Posts with approvalStatus "pending" or "rejected" do not publish, even after a reschedule, until they are approved.

A bulk reschedule counts against the same scheduling limits as creating a post: moving drafts past the pending-scheduled cap, or more posts onto one day than the per-day cap allows, returns 403 QUOTA_EXCEEDED and changes nothing. It returns 400 when scheduledAt is missing or not an ISO 8601 date-time, or when none of the posts is a draft or scheduled. See the schedule-post skill for the full approval flow.

Bulk pattern

For multiple files: call upload_media for each file, collect the returned IDs, then pass all IDs in mediaFileIds when creating the post.

Top skills in this category

YouTube

@byungkyu

YouTube Data API integration with managed OAuth. Search videos, manage playlists, access channel data, and interact with comments. Use this skill when users want to interact with YouTube. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Calls run through the `maton` CLI with OAuth login, or over raw HTTP with a Maton API key where the CLI cannot be installed. Every call is authenticated as the user's connection and reaches only what that connection's authorization allows, which the provider enforces on every request; the endpoints documented here are the ones this skill uses, and any other endpoint of this app needs the user to ask for it by name. Default to read and list calls, and confirm every write or new connection with the user. This file also documents the three constructs that turn a YouTube connection into automation, in the order they are used: the connection (the first step), a hosted function that runs a YouTube action through the Maton SDK, and a trigger that calls that function on a schedule or on an event. Those sections are the platform's own reference text, shared with the api-gateway skill, with YouTube examples; they add no YouTube capability - YouTube is not an event source, a trigger cannot read YouTube data, and the files under `references/<source>/triggers.md` are the platform's event catalogues for the sources Maton offers (time, Calendly, GitHub, Gmail, HubSpot, Linear, Notion, Slack, Stripe).

14529k

Edge TTS

@i3130002

Text-to-speech conversion using node-edge-tts npm package for generating audio from text. Supports multiple voices, languages, speed adjustment, pitch control, and subtitle generation. Use when: (1) User requests audio/voice output with the "tts" trigger or keyword. (2) Content needs to be spoken rather than read (multitasking, accessibility, driving, cooking). (3) User wants a specific voice, speed, pitch, or format for TTS output.

3323k

Antigravity Image Generator

@ipedrax

Generate images using the internal Google Antigravity API (Gemini 3 Pro Image). High quality, native generation without browser automation.

2015k

Social Media Scheduler

@1kalin

Plan, draft, and organize social media content across platforms. Create content calendars, write platform-optimized posts, and maintain consistent posting schedules.

1414k

elevenlabs-voices

@robbyczgw-cla

High-quality voice synthesis with 18 personas, 32 languages, sound effects, batch processing, and voice design using ElevenLabs API.

168.2k