Install
openclaw skills install agent-postmooreAutonomously post, schedule, upload media, save drafts, and manage content across Instagram, TikTok, YouTube Shorts, LinkedIn, Facebook, Threads, and Bluesky...
openclaw skills install agent-postmooreAutonomously manage social media posting via the Postmoore API.
.env:POSTMOORE_API_KEY=pm_live_xxxxx
All requests use a Bearer token:
Authorization: Bearer <POSTMOORE_API_KEY>
Base URL: https://postmoo.re/api/v1
GET /accounts
Optional filter by platform:
GET /accounts?platform=tiktok
Supported platform values: instagram · tiktok · ytshorts · linkedin · facebook · threads · bluesky
Returns an array of connected accounts. Each account has:
id — use this in every post requestplatform — the platform namedisplayName — the account display nameplatformUsername — username on the platformstatus — always activeAlways fetch account IDs before posting — never guess them.
POST /media
Content-Type: multipart/form-data
file: <binary>
Supported formats: image/jpeg · image/png · image/gif · image/webp · video/mp4 · video/quicktime · video/webm
Max file size: 100 MB. Storage quota: 5 GB (Creator plan) · 20 GB (Premium plan).
Returns:
{
"data": {
"id": "uploads/user123/filename.mp4",
"type": "video",
"url": "https://storage.postmoo.re/...",
"mimeType": "video/mp4",
"size": 10485760,
"filename": "video.mp4"
}
}
Save both id and url — you need both when creating a media post.
POST /posts
Content-Type: application/json
Text post (post now):
{
"contentType": "text",
"text": "Your caption here #hashtags",
"accounts": ["<account_id_1>", "<account_id_2>"],
"schedule": { "type": "now" }
}
Text post (scheduled):
{
"contentType": "text",
"text": "Scheduled caption #hashtags",
"accounts": ["<account_id_1>"],
"schedule": { "type": "scheduled", "at": "2026-06-01T14:00:00Z" }
}
Media post (image or video):
{
"contentType": "media",
"text": "Caption for the post #hashtags",
"media": [{ "id": "<id_from_upload>", "url": "<url_from_upload>" }],
"accounts": ["<account_id_1>", "<account_id_2>"],
"schedule": { "type": "now" }
}
Draft (save without publishing):
{
"contentType": "text",
"text": "Draft caption to review",
"accounts": ["<account_id_1>"],
"schedule": { "type": "draft" }
}
schedule options:
{ "type": "now" } — publish immediately{ "type": "scheduled", "at": "<ISO 8601 datetime>" } — schedule for future{ "type": "draft" } — save as draft, no publishingReturns post object with:
id — post IDstatus — pending · scheduled · published · failed · draftaccounts — array of { id, platform }results — per-platform result with success, postId, url, errorGET /posts
GET /posts?status=scheduled
GET /posts?status=draft&page=1&limit=20
Status filters: pending · scheduled · published · failed · draft
Pagination params: page (default 1) · limit (default 20, max 100)
Returns paginated array with data and pagination object containing page, limit, total, totalPages, hasMore.
GET /posts/<post_id>
Returns full post object including per-platform results.
DELETE /posts/<post_id>
Only works on posts with status pending or draft. Scheduled and published posts cannot be deleted.
Returns { "data": { "id": "<post_id>", "deleted": true } }.
ffmpeg -i video.mp4 -ss 00:00:03 -frames:v 1 frame.jpg -y
POST /mediaGET /accountsid and url from the uploadGET /posts/<post_id>"type": "draft" when the user wants to review content before it goes liveGET /accounts before every sessionresults array after posting for per-platform success or failure detailsfailed — check individual results