Posts
Create Post
Schedule or publish text-only, video, or slideshow posts to connected accounts.
POST
Schedule or publish immediately to one or more connected accounts.Documentation Index
Fetch the complete documentation index at: https://docs.genviral.io/llms.txt
Use this file to discover all available pages before exploring further.
Before you post
- Use an API key for a workspace with an active Creator, Professional, or Business subscription.
- Call
GET /accountsand pick account UUIDs. - Check each account’s
capabilities.supported_content_kindsandcaption_limit. - Build the payload below. Only include provider settings for platforms you are actually targeting.
Request body
Shared caption text. Final length is checked per targeted account after lookup
(hosted accounts: 500 chars max).
One to ten account objects:
[{ "id": "<uuid-from-/accounts>" }].Optional.
video, slideshow, or null/omit for text-only posts.ISO 8601 datetime with timezone offset (for example
2026-05-21T15:00:00Z).
Omit or send a time within 30 seconds of now for immediate publish (status: pending).
For true scheduled posts, the time must be at least 2 minutes in the future.Recommended idempotency key (max 128 chars). Same key + same payload replays the original
post (
200, duplicate: true). Same key + different payload returns 409 create_failed.
If omitted, the API dedupes from a SHA-256 fingerprint of the request body instead; a conflicting
replay also returns 409 create_failed.TikTok-only. A TikTok post URL used to resolve the track. Rejected when any non-TikTok account
is selected, including Instagram.
Provider settings
Usesettings.<provider> for X, Instagram, Facebook, LinkedIn, Bluesky,
and YouTube.
For TikTok and Pinterest on create, use the top-level tiktok and pinterest
objects — not settings.tiktok or settings.pinterest. Top-level fields run the full
create-time validation (BYO-only TikTok, hosted TikTok rejection, MEDIA_UPLOAD rules, and
field limits).
Only send settings for providers present in your accounts list. Unknown settings keys return
422 invalid_payload.
YouTube — settings.youtube
Requires a video post to a YouTube account.
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | No | Max 100 chars. If omitted, derived from settings.youtube.description, then caption (first non-empty line). |
description | string | No | Overrides caption as the YouTube description when set. |
type | string | No | Visibility: public, private, or unlisted. Default public. Alias: privacy. |
privacy | string | No | Same as type. |
tags | array | No | { "value": "...", "label": "..." } items. Publish uses label values. Total tag length capped at publish time. |
categoryId | string | No | YouTube category ID. |
selfDeclaredMadeForKids | string | No | yes or no. Default no. Boolean alias: madeForKids. |
thumbnail | object | No | Custom thumbnail: { "path": "<image-url>" }. |
TikTok — top-level tiktok
Requires BYO TikTok accounts and media (video or slideshow). Hosted TikTok accounts cannot use
TikTok-specific settings.
For video posts, the merged publish text built from caption, tiktok.title, and
tiktok.description must stay ≤ 2,200 characters combined.
| Field | Type | Notes |
|---|---|---|
title | string | Video: max 2,200 chars. Slideshow: max 90 chars. |
description | string | Slideshow: max 4,000 chars. Video: used as the publish body when caption is empty. |
post_mode | string | DIRECT_POST or MEDIA_UPLOAD (slideshow drafts only). Defaults to DIRECT_POST at publish time when omitted. |
privacy_level | string | PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY. |
music_usage_confirmation | boolean | Confirms the user has accepted TikTok’s music-usage terms for this post. Preferred Partner API field. |
user_consent | boolean | Legacy alias for music_usage_confirmation. |
disable_comment | boolean | Inverted to allow/deny comments. |
disable_duet | boolean | Video only. |
disable_stitch | boolean | Video only. |
auto_add_music | boolean | Slideshow only. |
is_your_brand | boolean | Own-brand commercial content. |
is_branded_content | boolean | Third-party promotion. |
video_cover_timestamp_ms | integer | Video DIRECT_POST only. Frame offset in milliseconds for the TikTok thumbnail. |
Pinterest — top-level pinterest
Requires at least one Pinterest account and image media.
| Field | Type | Notes |
|---|---|---|
board_id | string | Pinterest board ID. Required for a successful pin publish — no account default is applied. Max 128 chars. |
title | string | Optional pin title. Max 100 chars. |
link | string | Optional destination URL. Max 2,048 chars. |
tags | string[] | Up to 30 tags, 1–100 chars each. Appended to the pin description; total description must stay ≤ 800 chars. |
X — settings.x or settings.twitter
| Field | Type | Required | Notes |
|---|---|---|---|
who_can_reply_post | string | No | everyone (default), following, mentionedUsers, subscribers, verified. |
community | string | No | X community URL: https://x.com/i/communities/<id>. |
made_with_ai | boolean | No | Default false. |
paid_partnership | boolean | No | Default false. |
Instagram — settings.instagram or settings.instagram-standalone
Both keys map to the same stored settings. If both are sent, instagram-standalone wins.
| Field | Type | Required | Notes |
|---|---|---|---|
post_type | string | Recommended | post (feed/reel) or story. |
is_trial_reel | boolean | No | Trial reel flag for video posts. |
graduation_strategy | string | No | MANUAL or SS_PERFORMANCE when using trial reels. |
collaborators | array | No | [{ "label": "<username>" }]. Ignored for stories. |
cover_url | string | No | Custom Reel cover image URL. Takes priority over thumb_offset_ms. Video post_type: post only. Must be publicly accessible. BYO Instagram only — hosted accounts reject cover settings. |
thumb_offset_ms | integer | No | Reel thumbnail frame offset in milliseconds when cover_url is omitted. Video post_type: post only. BYO Instagram only. |
share_to_feed | boolean | No | Share the Reel to the main feed. Default true. Set false for Reels tab only. BYO Instagram only. |
Facebook — settings.facebook
| Field | Type | Required | Notes |
|---|---|---|---|
url | string | No | Optional link attachment URL on the post. |
LinkedIn — settings.linkedin or settings.linkedin-page
Both keys map to the same stored settings. If both are sent, linkedin-page wins.
| Field | Type | Required | Notes |
|---|---|---|---|
post_as_images_carousel | boolean | No | Post multi-image content as a LinkedIn carousel/PDF. |
carousel_name | string | No | Carousel/PDF title. Default slides. |
Bluesky — settings.bluesky
No provider-specific fields. Send {} or omit.
Settings key reference
| Request key | Alias | Stored as |
|---|---|---|
settings.x | settings.twitter | xSettings |
settings.instagram-standalone | settings.instagram | instagramSettings |
settings.linkedin-page | settings.linkedin | linkedinSettings |
Top-level tiktok | — | tikTokSettings |
Top-level pinterest | — | pinterestSettings |
Limits (quick reference)
- Video: MP4/MOV/M4V/AVI, under 100MB. Hosted accounts: 15–60s when duration is provided.
- Non-premium X video: duration metadata required; max 140 seconds.
- Slideshow: 1–35 images, each under 5MB.
- Caption caps (BYO): X 280 (4,000 for premium accounts); Instagram 2,200; TikTok video 2,200 / photo description 4,000; LinkedIn 3,000; Pinterest 800; YouTube 5,000 bytes; Facebook 63,206.
Response
Fresh creates return201. Idempotent replays return 200.
duplicate: true appears on idempotent replays. warnings are non-blocking (for example missing
video duration metadata).
Examples
Errors
| Code | When |
|---|---|
422 invalid_payload | Schema validation failed (includes issues array) |
400 invalid_json | Request body is not valid JSON |
400 validation_failed | Caption, media, music, TikTok/Pinterest, or schedule rules failed |
400 unknown_accounts | Account ID outside key scope |
400 media_unreachable | Media URL not reachable |
400 invalid_music_url | Invalid or non-TikTok music URL |
401 | Missing or invalid API key |
402 subscription_required | No active Creator, Professional, or Business subscription |
403 subscription_required | Hosted TikTok posting without an active TikTok virtual subscription |
403 tier_not_allowed | Scheduler tier blocked |
409 create_failed | Same external_id or dedupe fingerprint reused with a different create payload |
500 create_failed | Unexpected upstream failure |
