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-publishBulkPublish — 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
| Type | Formats | Max size |
|---|---|---|
| Image | JPEG, PNG, WebP, GIF | 100MB |
| Video | MP4, MOV, WebM | 100MB (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
| Tool | Use for | Key params |
|---|---|---|
list_media | Browse uploaded files | search, page, limit |
get_media | Single file details | mediaId |
delete_media | Remove a file | mediaId |
Media requirements by platform
| Platform | Image | Video | Notes |
|---|---|---|---|
| Instagram Reels | — | MP4, 9:16 | 3 seconds–15 minutes |
| Instagram Stories | JPEG/PNG, 9:16 | MP4, 9:16 | 1080x1920 recommended; video 3–60 seconds |
| Instagram Carousel | JPEG/PNG | — | 2-10 images |
| TikTok | — | MP4 | Up to 3 minutes for every account; some accounts 5 or 10 |
| YouTube | — | MP4 | Requires title in platformSpecific |
| JPEG/PNG, 2:3 | MP4 | 1000x1500 recommended; video pins at least 4 seconds | |
| Facebook/X/LinkedIn | JPEG/PNG | MP4 | Most 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):
POST /api/media/multipart/create— body{contentType, sizeBytes}(exact size) →{r2Key, uploadId, partSize, partUrls, expiresIn}.partSizeis fixed at 10MB (10485760);partUrlsis one presigned PUT URL per part, in order; URLs expire in 3600s.PUTeach 10MB slice of the file to itspartUrland save theETagresponse header per part. A failed part can be retried alone — a network drop never restarts the whole file.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; itsidgoes inmediaFileIds). 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
@byungkyuYouTube 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).
Edge TTS
@i3130002Text-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.
Antigravity Image Generator
@ipedraxGenerate images using the internal Google Antigravity API (Gemini 3 Pro Image). High quality, native generation without browser automation.
Social Media Scheduler
@1kalinPlan, draft, and organize social media content across platforms. Create content calendars, write platform-optimized posts, and maintain consistent posting schedules.
elevenlabs-voices
@robbyczgw-claHigh-quality voice synthesis with 18 personas, 32 languages, sound effects, batch processing, and voice design using ElevenLabs API.