Schedule and publish posts to TikTok, Instagram, YouTube, Pinterest, LinkedIn, and Facebook via API. Supports TikTok slideshows (photo carousels), video posts, draft uploads, TikTok music via music_url, and multi-account targeting. The core posting endpoint for OpenClaw agents and automated social media workflows.
source="partner_api" and appear in the dashboard queue immediately.
Supports TikTok photo carousels (slideshows), video posts, draft uploads via MEDIA_UPLOAD mode, TikTok music via music_url, and multi-account targeting across all 6 platforms. Instagram’s official publishing API does not currently support programmatic music or sound selection for carousel posts or Reels.
https://www.tiktok.com/@genviral/video/1234567890) used to resolve the
track for TikTok-only requests. The API validates that the link points to
TikTok and rejects requests that target any non-TikTok account. Instagram’s
official publishing API does not support music/sound selection for carousels
or Reels, so any request that includes Instagram accounts with music_url
will be rejected./accounts.All IDs must belong to the authenticated key scope. Unknown or inactive
accounts cause the request to fail.tiktok and pinterest settings are mutually exclusive in one request.
Include only the platform-specific object that matches your targeted
accounts. Other platform-specific objects (for example facebook,
instagram, linkedin, or youtube settings) are rejected with
422 invalid_payload.2025-02-01T15:00:00Z). If omitted or within 30
seconds of “now”, the post is treated as pending for immediate publish.external_id returns the
original post instead of creating a duplicate. Reusing the same
external_id for a materially different request returns 409.music_url are rejected when any Instagram account is selected.tiktok.post_mode = MEDIA_UPLOAD: supported only for media.type = slideshow (photo posts).tiktok.video_cover_timestamp_ms: supported for video DIRECT_POST requests.pinterest.tags: up to 30 tags, each 1–100 characters (spaces allowed). Tags are appended to the final Pinterest description, which still must fit 800 characters.| Platform | Genviral common text maps to | Verified platform limit / note | Other publish limits surfaced here | Dedicated Partner API object |
|---|---|---|---|---|
| TikTok | Video post_info.title; photo post_info.description | Video title max 2,200 UTF-16 runes. Photo title max 90 UTF-16 runes. Photo description max 4,000 UTF-16 runes. | Photo posts support up to 35 images. MEDIA_UPLOAD is photo-only. | tiktok |
caption | Meta’s current fetched publishing docs expose the content-publishing surface but did not yield a clean numeric caption cap in tooling. Genviral currently enforces 2,200. | Carousel posts support up to 10 images/videos. | None today | |
Page feed message, photo caption, video description | Meta’s Page Feed/Page Videos refs do not publish an explicit text max. Genviral currently keeps the existing 63,206-character BYO ceiling. | Multiple photos are supported; mixed image+video payloads are not. | None today | |
commentary | Microsoft Learn’s UGC Post API docs cap commentary text at 3,000 characters; the newer Posts API refs do not restate that limit. | Multi-image posts support 2–20 images. | None today | |
description | Description max 800 characters. | Title max 100, link max 2,048. Pinterest alt text is capped at 500 by the platform, but Partner API does not expose an alt_text field today. | pinterest | |
| YouTube | snippet.description | Description max 5,000 bytes. | Title max 100 characters; tags max 500 characters total. YouTube-specific tags are not exposed via Partner API today. | None today |
POST /api/partner/v1/posts:
caption: required, 1..63206 chars at schema level; the final allowed length is resolved from the targeted accounts after account lookup.media: required object.{ "type": "video", "url": "https://..." }.{ "type": "slideshow", "urls": ["https://...", "..."] }.accounts: required array of { "id": "<uuid>" } objects.scheduled_at: optional ISO 8601 string; omit for immediate queueing.tiktok: optional object for TikTok-only settings.pinterest: optional object for Pinterest-specific board/title/link/tag settings.tiktok and pinterest cannot be sent together because their account
constraints are mutually exclusive.201. Idempotent replays return 200. Successful
responses include:
id - canonical Genviral post IDstatus - either pending or scheduled, matching the scheduling logic abovescheduled_at - ISO timestamp stored on the post. Immediate requests are
stamped with the server “publish ASAP” timestamp (not null).duplicate - true when Genviral deduplicated an idempotent replay and
returned the original post instead of creating a new one.warnings - optional array describing non-blocking validation issuesexternal_id, Genviral still applies a short-window best-effort
duplicate guard using the full request fingerprint, but only external_id
provides a stable API idempotency contract.
video object when targeting TikTok, Instagram Reels, or YouTube Shorts. Add music_url only for TikTok-only requests. Instagram’s official publishing API does not support programmatic music/sound selection for Reels.
slideshow items to schedule a TikTok Photo Mode or Instagram carousel. Order is preserved as given in the media array.
warnings array when media metadata
(size/duration/aspect) is missing. These are informational so you can decide
whether to re-upload media before Hosted Accounts enforce limits.400 invalid_json - body is not valid JSON422 invalid_payload - schema validation failed (caption/media/accounts)400 unknown_accounts - at least one account.id is outside the authenticated key scope400 validation_failed - caption/media/music rules failed (TikTok-only music, bad aspect ratio, etc.)400 missing_accounts - resolved account array is empty after validation400 invalid_music_url or 400 media_unreachable - media or music URLs failed reachability checks401 - authentication failed (missing/invalid/revoked token)402 subscription_required - active Creator/Professional/Business plan required403 tier_not_allowed - Scheduler tier cannot use Partner API500 create_failed - upstream scheduler error (retry after inspecting logs)