curl --request PATCH \
--url https://www.genviral.io/api/partner/v1/posts/11111111-1111-1111-1111-111111111111 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"caption": "Updated caption",
"media": null,
"music_url": null,
"scheduled_at": "2025-03-01T17:00:00Z"
}'
{
"ok": true,
"code": 200,
"message": "Post updated",
"data": {
"id": "11111111-1111-1111-1111-111111111111",
"status": "scheduled",
"scheduled_at": "2025-03-01T17:00:00Z",
"warnings": [
{
"field": "media",
"message": "Video size metadata is missing",
"code": "VIDEO_METADATA_MISSING"
}
]
}
}
Posts
Update Post
Update a scheduled or pending post
PATCH
/
api
/
partner
/
v1
/
posts
/
{postId}
curl --request PATCH \
--url https://www.genviral.io/api/partner/v1/posts/11111111-1111-1111-1111-111111111111 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"caption": "Updated caption",
"media": null,
"music_url": null,
"scheduled_at": "2025-03-01T17:00:00Z"
}'
{
"ok": true,
"code": 200,
"message": "Post updated",
"data": {
"id": "11111111-1111-1111-1111-111111111111",
"status": "scheduled",
"scheduled_at": "2025-03-01T17:00:00Z",
"warnings": [
{
"field": "media",
"message": "Video size metadata is missing",
"code": "VIDEO_METADATA_MISSING"
}
]
}
}
Update the caption, media, accounts, schedule, or external metadata for a scheduled/pending post.
Only posts in
draft, pending, scheduled, retry, or failed status can be edited. Posted,
partial, or canceled posts are immutable.Path Parameters
string
required
The ID of the post to update.
Body Parameters
string
Optional replacement caption. At least one field in the body is required; empty payloads are
rejected with
422 invalid_payload.Target-specific limit. Hosted Accounts targets cap captions at 500 characters. BYO caps follow
the selected platform and media type: Facebook 63,206; Instagram 2,200; TikTok 2,200 for video
captions / 4,000 for photo-post descriptions; LinkedIn 3,000; Pinterest 800; YouTube 5,000
bytes.
object | null
Optional replacement media payload. Follows the same structure as Create
Post. Pass
null to clear media and make the post text-only.
Text-only updates fail when any selected account requires media.array
Optional list of account objects (max 10):
[{ "id": "<uuid-from-/accounts>" }]. Replaces
the previous targeting list completely.object
Optional canonical provider settings update keyed by provider/platform. Unknown provider keys fail
closed with
422 invalid_payload. Partial settings.<provider> patches merge with stored
values (they do not replace the whole provider block). Use the field tables in
Create Post or the public settings_schema from
GET /accounts; its field names match this Partner API payload.
For YouTube, send settings.youtube.title to set the video title explicitly; if omitted, Genviral
derives the title from the first non-empty caption line.object | null
Optional TikTok settings update. Send TikTok-specific fields here (top-level), not under
Pass
settings.tiktok. Pass null to clear stored TikTok settings from the post.
Supported only when every targeted account is a TikTok BYO account.
Show TikTok Settings
Show TikTok Settings
string
Optional TikTok title override. Video posts: max 2,200 UTF-16 runes. Photo/slideshow posts:
max 90 UTF-16 runes.
string
Optional TikTok description override. Photo/slideshow posts: max 4,000 UTF-16 runes. For video
posts, Genviral keeps this field for compatibility and uses it as a fallback source when
deriving the TikTok title if
title is blank.string
DIRECT_POST or MEDIA_UPLOAD (uploads to TikTok inbox/drafts).string
Optional privacy level (
PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR,
SELF_ONLY).boolean
Optional comment toggle.
boolean
Optional duet toggle (video posts).
boolean
Optional stitch toggle (video posts).
integer
Optional video cover frame offset in milliseconds (video posts,
DIRECT_POST only). TikTok
uses this frame as the video thumbnail.boolean
Confirms the user has accepted TikTok’s music-usage terms for this post. Preferred Partner API
field.
boolean
Legacy alias for
music_usage_confirmation.boolean
Optional commercial-content flag.
boolean
Optional branded-content flag for own brand.
boolean
Optional branded-content flag for third-party promotion.
boolean
Photo
DIRECT_POST only. Omitted defaults to true (TikTok auto-picks a
soundtrack). false still publishes silent. Videos and hosted TikTok ignore
this field.null to clear stored TikTok settings from the post.object | null
Optional Pinterest settings update. Send Pinterest-specific fields here (top-level), not under
Pass
settings.pinterest. Pass null to clear stored Pinterest settings from the post.
Supported only when at least one targeted account is a Pinterest account.
Show Pinterest Settings
Show Pinterest Settings
string
Optional Pinterest board ID (max 128 chars).
string
Optional Pinterest pin title override (max 100 chars).
string
Optional destination URL (max 2,048 chars).
string[]
Optional Pinterest topic tags (up to 30). Multi-word tags are supported. Genviral appends
these tags to the Pinterest description, so
caption + appended tags must still fit
Pinterest’s 800-character description limit.null to clear stored Pinterest settings from the post.TikTok and Pinterest use top-level
tiktok / pinterest on create and update (same as Create
Post). Other providers use settings.<provider>. Only include settings for providers present in
the selected accounts.string | null
Optional ISO 8601 datetime with timezone offset. Pass
null to push the post back into the
immediate publish queue (status: pending). For true scheduled times, the value must be at
least 2 minutes in the future.string
Not mutable after creation. Partner API treats
external_id as the create-time idempotency key,
so PATCH requests that try to change it return 409 external_id_immutable.string
Optional TikTok post URL for background music (e.g.,
https://www.tiktok.com/@genviral/video/1234567890). Pass null to remove existing music without
changing media. This field is TikTok-only. Instagram’s official publishing API does not support
music/sound selection for carousels or Reels, so update requests that include Instagram accounts
with music_url will be rejected.Limits
- Caption: enforced against the targeted accounts. Hosted Accounts targets stay at 500 characters. BYO caps follow platform limits: Facebook 63,206; Instagram 2,200; TikTok 2,200 for video captions and 4,000 for photo-post descriptions; LinkedIn 3,000; Pinterest 800; YouTube 5,000 bytes.
- Text-only: set
mediatonullor omit media while updating other fields; every selected account must advertisetext_onlyin/accountscapabilities. - Video: MP4/MOV/M4V/AVI, under 100MB. If duration metadata is present, we enforce 15–60 seconds; when duration is missing we proceed with a warning. ~9:16 aspect recommended.
- Slideshow: 1–35 images, JPG/JPEG/PNG, each under 5MB. ~9:16 aspect recommended.
- Music: TikTok-only. Instagram’s official API does not support music/sound selection for carousel posts or Reels, so requests with
music_urlare rejected when any Instagram account is selected. - TikTok settings: supported only when all selected accounts are TikTok BYO accounts.
tiktok.post_mode = MEDIA_UPLOAD: supported only formedia.type = slideshow(photo posts).tiktok.video_cover_timestamp_ms: supported for videoDIRECT_POSTrequests.- Pinterest settings: supported only when at least one selected account is Pinterest.
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.- Provider settings: send canonical settings under
settings.<provider>. Unknown provider keys are rejected with422 invalid_payload.
curl --request PATCH \
--url https://www.genviral.io/api/partner/v1/posts/11111111-1111-1111-1111-111111111111 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"caption": "Updated caption",
"media": null,
"music_url": null,
"scheduled_at": "2025-03-01T17:00:00Z"
}'
{
"ok": true,
"code": 200,
"message": "Post updated",
"data": {
"id": "11111111-1111-1111-1111-111111111111",
"status": "scheduled",
"scheduled_at": "2025-03-01T17:00:00Z",
"warnings": [
{
"field": "media",
"message": "Video size metadata is missing",
"code": "VIDEO_METADATA_MISSING"
}
]
}
}
Update responses can include
warnings about missing media metadata. They are informational so
you can re-upload media before Hosted Accounts reject it.Error Responses
400 invalid_json- body is not valid JSON422 invalid_payload- no editable fields provided or schema validation failed400 unknown_accounts- one or more provided accounts are outside the authenticated key scope400 missing_accounts- resolved account list is empty after validation400 validation_failed- post is immutable or media/music/caption rules failed400 invalid_music_urlor400 media_unreachable- TikTok/music URLs failed validation401- authentication failed (missing/invalid/revoked token)402 subscription_required- active Creator/Professional/Business plan required403 tier_not_allowed- Scheduler tier cannot use Partner API409 external_id_immutable- PATCH tried to changeexternal_id403 subscription_required- hosted TikTok posting without an active TikTok virtual subscription500 update_failed- Database update failed unexpectedly
