Platforms
Known issues and platform limits
The platform behavior that surprises developers most often, per channel. Every item gives the symptom as you see it, the cause, and what to do, with a link to the full section.
A failed channel's message is in errors.<channel> on GET /posts/:id and in data.targets[].error on a webhook. The quotes below are the start of those messages. After you fix the cause, publish the failed channels again with POST /posts/:id/retry (see Retries and duplicate posts).
Every channel
Posts fail with "connection expired"
- You see: the account has
needs_reconnect: trueinGET /accounts, and posts to it fail with a message about an expired connection. - Cause: the platform token was revoked or expired, for example after a password change or a removed app permission.
- What to do: reconnect the account in the dashboard under Settings → Organisation → Workspaces, then retry the post. The API cannot reconnect accounts. See Connecting accounts.
A video uploads fine but fails to publish
- You see:
POST /media/uploadsucceeds, and the post fails or is refused later. - Cause: platform size and duration limits are checked when a post is scheduled or published, not at upload.
- What to do: run
POST /media/checkfirst; it returns per-platformwarningsfor your connected channels. See Check compatibility before posting.
The platform refuses a duplicate
- You see: "Facebook rejected this as a duplicate", "LinkedIn rejected this post as a duplicate: identical content already exists on your profile", or "This is a duplicate of a tweet you already posted."
- Cause: Facebook, LinkedIn and X block identical content that is already on the account, also when it was posted outside OmniSocials.
- What to do: change the text before you try again; a retry with the same text fails the same way. See Retries and duplicate posts.
Reels with music fail after a Facebook reconnect
- You see: "Instagram music needs the Facebook Page that is linked to this Instagram account, and the Facebook login connected to this workspace no longer gives OmniSocials access to that Instagram account."
- Cause: a Reel with licensed music is published through the workspace's Facebook login. Facebook's permission window replaces the whole grant of a login, so when the same Facebook login is reconnected in another workspace and this Instagram account is not selected there, this workspace loses access to it.
- What to do: reconnect Facebook in this workspace and select this Page and this Instagram account in Facebook's window. If the same login is connected in other workspaces, select their Pages and Instagram accounts too. Then retry the Reel. See Instagram reel music.
Reels with music fail without a Facebook connection
- You see: "Instagram music needs a connected Facebook account."
GET /audio/searchreturnsneedsFacebook: true. - Cause: music needs a Facebook account in the workspace whose Page is linked to the same Instagram account.
- What to do: connect that Facebook Page to the workspace, or publish the Reel without
instagram.audio_id. See Instagram reel music.
"Licensed music isn't available for this workspace yet"
- You see: "Licensed music isn't available for this workspace yet: the Facebook account connected to it hasn't been granted Instagram publishing permission by Meta."
- Cause: Meta has not given the connected Facebook account the Instagram publishing permission that music needs. Reconnecting does not change it.
- What to do: publish the Reel without licensed music. See Instagram reel music.
The account is restricted from posting
- You see: "Instagram has temporarily restricted this account from posting (anti-abuse protection). Reconnecting won't help. This usually clears within 24 to 48 hours."
- Cause: Instagram's own anti-abuse protection on the account.
- What to do: post less often and retry later. Do not reconnect.
Daily posting limit reached
- You see: "You've reached Instagram's daily posting limit for this account."
- Cause: Instagram allows 100 API publishes per account per 24 hours, and every slide of a multi-slide story counts as one.
- What to do: wait a few hours, then retry. See Multi-slide stories.
Trial Reel refused
- You see: "Trial Reels need a minimum follower count Instagram doesn't think this account has. Turn off Trial Reel and try again."
- Cause: Instagram enables Trial Reels per account, roughly from 1,000 followers.
- What to do: publish without
instagram.is_trial_reel. See Instagram Trial Reels.
Too many hashtags
- You see:
400 hashtag_limit_exceededwhen you apply a hashtag set, or Instagram's "Too many hashtags". - Cause: Instagram rejects a caption or comment with more than 5 hashtags.
- What to do: keep each caption and first comment at 5 hashtags or fewer. See Hashtag sets.
A tall feed image comes back cropped
- You see: an
image_fitentry in the responsewarningswith"action": "cropped". - Cause: Instagram shows feed images between 4:5 and 1.91:1, so OmniSocials crops a taller image to 4:5 around the subject by default. Feed images outside 9:16 to 1.91:1 are refused with
400 validation_error. - What to do: to send the original, pass
media_fit: { "instagram": "keep" }. See Image fit per channel.
A DM reply is refused after 24 hours
- You see:
422 outside_messaging_windowonPOST /inbox/conversations/:id/reply, andreply_window.open: falseonGET /inbox/next. - Cause: Meta allows replies to Instagram and Facebook DMs only within 24 hours of the person's last message.
- What to do: answer from the Instagram or Facebook app (the reply is mirrored into the inbox), or mark the conversation read. Do not retry. See Reply rules.
Hiding a comment returns 502 hide_not_applied
- You see:
502 hide_not_appliedonPOST /inbox/messages/:id/hide. - Cause: the comment shows under "Comments from Facebook" on a Reel that is also shared to Facebook. It lives on Facebook, and Instagram's hide does not reach it.
- What to do: hide it in the Instagram or Facebook app. Do not retry. See Hiding a comment.
Comment-to-DM skips some comments
- You see: automation events with
outcome: "skipped"andreason: "window_passed"or"rate_limited". - Cause: Instagram allows one private reply per comment, within 7 days of the comment, and OmniSocials sends at most 180 DMs an hour per account.
- What to do: expect these skips on old comments and busy posts. Every skip is listed in the activity log (
GET /automations/:id/events) with its reason. See Instagram rules.
A reconnect in one workspace breaks Facebook in another
- You see: in the other workspace, the Facebook account has
needs_reconnect: trueand posts fail. Itsreauth_reasonreads "The Facebook login for this workspace reconnected in another workspace and did not keep the Page ... selected in the Facebook window, so Facebook removed posting access." - Cause: Facebook's permission window replaces the whole grant of a login. A Page that is not selected during a reconnect loses access in every workspace that uses the same login.
- What to do: reconnect Facebook in the affected workspace and select all your Pages in the Facebook window. The same rule can drop an Instagram account; see Reels with music fail after a Facebook reconnect.
Facebook posts have no reach
- You see: no
reachkey in Facebook post analytics. - Cause: Meta retired Facebook post reach in June 2026, and its replacement metric returns no data.
- What to do: use
viewsand the click metrics instead, and sum reach only over entries that carry it. See Analytics.
Mixed images and video are refused
- You see:
400 validation_errorwhen you schedule or publish. - Cause: a Facebook post takes photos or one video, not both.
- What to do: send images only or a single video. See Facebook media requirements.
Messenger replies from the app don't show in the inbox
- You see: replies sent from Messenger or Business Suite are missing from the inbox thread.
- Cause: Pages connected before September 6, 2026 lack a webhook field for these replies.
- What to do: reconnect the Page once under Settings → Organisation → Workspaces. See Replies sent from the native apps.
Scheduled posts go out a few minutes late
- Cause: Facebook's API does not guarantee delivery timing for scheduled posts.
- What to do: expect publish times within a few minutes of
schedule_at. See Facebook limitations.
Daily limit for unverified profiles
- You see: "This LinkedIn profile reached LinkedIn's daily posting limit for profiles that are not verified, so LinkedIn refused this post. The earlier posts of the day went out." It can appear on
linkedinandlinkedin_page. - Cause: LinkedIn gives a member it has not verified a small number of posts per UTC day. It is not the connection and not an OmniSocials quota, so reconnecting does not help.
- What to do: retry after midnight UTC, verify your identity on your LinkedIn profile, or schedule fewer LinkedIn posts per day. See LinkedIn.
Media upload refused on a company page
- You see: "LinkedIn refused the media upload for this Page: the connected LinkedIn member is not a Super admin or Content admin of the Page (any more)."
- Cause: media uploads to a page need a Super admin or Content admin role.
- What to do: ask a page super admin to check the role, then reconnect the page. See LinkedIn limitations.
The connection expires after 60 days
- Cause: LinkedIn access tokens last 60 days. OmniSocials renews them when LinkedIn issued a refresh token, up to LinkedIn's one-year refresh limit; otherwise the workspace gets an email 7 days before the expiry.
- What to do: reconnect the channel when that email arrives. Reconnecting either LinkedIn channel refreshes both. See LinkedIn.
@mentions publish as plain text
- Cause: the API, the MCP server and the CLI have no mentions field.
- What to do: add mentions in the OmniSocials web composer. See Mentions.
A poll drops the media
- Cause: on LinkedIn a poll excludes media and a link share. When a request carries both, the poll takes priority at publish time without an error.
- What to do: send either a poll or media for each LinkedIn channel. See Polls.
TikTok
The video is published as private
- You see: a post you sent with
PUBLIC_TO_EVERYONEis only visible to the creator. - Cause: TikTok decides per creator which privacy levels an account may use. A level the account can't use publishes as
SELF_ONLY. - What to do: check the account's allowed levels in the TikTok app. See TikTok options.
The first comment fails
- You see:
first_comment_result.statusisfailedon the TikTok options of the post. - Cause: TikTok comments need a second authorization, Enable comments on the TikTok channel card. The video must also be public and allow comments.
- What to do: press Enable comments under Settings → Organisation → Workspaces. While TikTok has not returned the final video id yet,
first_comment_result.pendingistrueand the comment follows automatically. See Automatic first comment.
Inbox replies return 401 reauth_required
- Cause: the TikTok comments authorization expired.
- What to do: press Enable comments on the channel card again. See TikTok comments.
Replies don't show on TikTok right away
- Cause: TikTok holds fresh comments and replies in spam review for roughly 15 to 20 minutes.
- What to do: nothing; an accepted reply appears under the video after the review. See Spam review delay.
Watch-depth analytics are missing
- You see: no
average_time_watched,reachor audience keys in TikTok metrics. - Cause: these need the comments authorization. Channels that enabled comments before 22 August 2026 also need the insights scopes.
- What to do: click Unlock analytics permissions on the TikTok channel card. See Watch-depth analytics.
Published videos can't be deleted
- Cause: TikTok's API has no delete, and
DELETE /posts/:idonly removes the post from OmniSocials. - What to do: remove the video in the TikTok app. See TikTok limitations.
YouTube
"OmniSocials briefly reached its YouTube posting limit for the day"
- You see: "This didn't go out because OmniSocials briefly reached its YouTube posting limit for the day. This is on our side, not your channel or your video."
- Cause: YouTube's daily API quota is shared by all OmniSocials customers. It resets at midnight Pacific time.
- What to do: retry the post with
POST /posts/:id/retrylater. See YouTube limitations.
"YouTube's upload limit was reached"
- You see: "YouTube's upload limit was reached. Wait and try again, or space your scheduled YouTube posts further apart."
- Cause: the channel's own upload limit, set by YouTube.
- What to do: wait, then retry, and spread your YouTube posts out.
A Short over 3 minutes is refused
- You see:
400when you schedule or publish. - Cause: OmniSocials publishes Shorts only and caps them at 3 minutes. The file is not converted, so a video that is not 9:16 plays with bars.
- What to do: trim the video, or send a separate cut for YouTube in per-platform
media_urls. See YouTube media requirements.
The upload landed on another channel
- You see: "We detected that this upload was about to land on a different YouTube channel than the one you connected, and removed it."
- Cause: the Google account manages several channels, and the upload did not reach the connected one.
- What to do: disconnect YouTube, reconnect, and pick the right channel in Google's account picker.
YouTube permissions are missing
- You see: "YouTube is missing required permissions. Reconnect your YouTube account and keep every permission box checked." A new connection is refused for the same reason.
- Cause: a YouTube permission was unticked on Google's consent screen.
- What to do: reconnect and leave every YouTube permission ticked. See YouTube.
The custom thumbnail doesn't show
- Cause: YouTube shows a custom Shorts thumbnail only on channels where it has enabled the feature. Other channels show a frame from the video.
- What to do: nothing on the API side. See Video covers.
New comments arrive late
- Cause: YouTube has no comment webhooks, so OmniSocials checks each channel once a day.
- What to do: expect up to a day before a comment reaches the inbox. See Social Inbox.
X (Twitter)
Link posts use credits
- You see: a
warningsentry with codex_url_post_creditson create,402 x_credits_insufficientwhen you schedule or publish, or a failed X target when the balance runs short at publish time. - Cause: X bills posts whose text contains an
http://orhttps://link at a premium, passed through as 20 credits per tweet with a link. Scheduled link posts reserve their cost until they publish. - What to do: top up at app.omnisocials.com/credits and retry. Only the X target fails; other channels publish normally. A bare domain is free. See Link posts use credits.
A post is refused as too long
- You see:
400at create, although the text looks short enough. - Cause: X weighs characters: every link counts as 23, emoji and CJK characters as 2. The limit is 280, or 25,000 on Basic, Premium and Premium+, and the tier is read when you connect.
- What to do: shorten the text, or reconnect X after upgrading the account. See Character limits.
"We can't confirm the post went live"
- You see: "X accepted the request but did not return a post id, so we can't confirm the post went live. Check your X profile before retrying, to avoid a duplicate."
- What to do: look at the X profile first. Retry only when the post is not there. See Retries and duplicate posts.
The X inbox stopped receiving DMs
- You see:
402 x_inbox_suspendedon replies, and no new X DMs. - Cause: the credit balance hit zero, so the X inbox paused itself. DMs sent while paused are not recovered.
- What to do: top up and switch X DMs on again in the Social Inbox. See X direct messages.
Threads
Threads, inbox or replies need a reconnect
- You see:
thread_partsrefused with a400that names the reconnect, Threads conversations missing from the inbox, or401 reauth_requiredon replies and hides. - Cause: accounts connected before the Threads reply permissions were added lack them.
- What to do: reconnect Threads once under Settings → Organisation → Workspaces. See Posting threads.
Location tags are refused
- You see:
400on a post withthreads.location_id. - Cause: Meta has not approved the location permission for OmniSocials yet.
- What to do: leave the field out. See Threads limitations.
Too many links
- You see:
400before anything publishes. - Cause: Threads allows up to 5 unique links per post, and every part of a thread is its own post.
- What to do: move links to another part. See Posting threads.
Video Pins refused now and then
- You see: Pinterest refused this video Pin with the message "This site doesn't allow you to save Pins". The Pin has no link, so no website blocked it.
- Cause: Pinterest sometimes gives this answer for a video Pin without saying why. OmniSocials tries again for about a minute before it reports the failure.
- What to do: retry the post later. If it fails again, post a different video. See Video pins.
The board is not found
- You see: "The Pinterest board you selected isn't in your connected Pinterest account for this workspace."
- Cause:
pinterest.board_idis required and must belong to the connected account. - What to do: take a board
idfrom theboardsarray ofGET /accounts/:id. See Pinterest options.
Carousel slides at different ratios
- You see:
400 validation_errorwith amismatched_slidesarray when you schedule or publish. - Cause: Pinterest carousel pins need every image at the same aspect ratio. Drafts are not checked.
- What to do: re-crop the listed slides to match slide 1. See Carousel constraints.
Product tags missing after publishing
- You see:
pinterest.product_tags_result.skippedlists products with a reason such asPIN_NOT_FROM_VERIFIED_DOMAIN. - Cause: Pinterest tags only your own public product Pins that link to a website the account claimed. A refused product never fails the post.
- What to do: check the reason table. See Product tag rules.
Bluesky
Video upload refused
- You see: "Please verify your email address on Bluesky before uploading videos." or "You have reached your daily video upload limit on Bluesky. Please try again tomorrow."
- Cause: Bluesky needs a verified email for video uploads and sets a daily video limit per account.
- What to do: verify the email on bsky.app (Settings, Account), or retry the next day. See Bluesky media requirements.
Mastodon
A post passes validation but the server refuses it
- Cause: OmniSocials validates media against the mastodon.social defaults, and some servers are stricter. The error then carries the server's own message.
- What to do: adjust the post to the server's limits. See Mastodon media requirements.
The post doesn't show on other servers yet
- Cause: federation delays between servers.
- What to do: wait. A post can reach other servers later, even after a successful publish. See Mastodon limitations.
Google Business
Caption refused for a phone number or link
- You see:
400 validation_errorwhen you schedule. - Cause: Google rejects local posts whose caption holds a phone number, a URL, a bare domain or an email address.
- What to do: put the phone number on a
CALLbutton and the link on a CTA button. See Caption rules.
No per-post analytics
- You see:
metrics_unavailable: trueand anoteon Google Business post analytics. - Cause: Google discontinued per-post insights.
- What to do: read location metrics with
GET /analytics/accounts. See Google Business limitations.
Old posts disappear from the profile
- Cause: Google ages local posts out after roughly 6 months. The post record stays in OmniSocials.
Telegram
Posts fail after the bot was removed
- You see: a failed post whose message says OmniSocials was removed from the Telegram chat, or lost the right to post there. The account shows
needs_reconnect: true. - Cause: someone removed the bot from the chat or took away its right to post.
- What to do: add the bot back as an administrator with Post messages, then reconnect the chat in OmniSocials. See When the connection breaks.
The post was not pinned
- You see:
telegram.result.pinned: falsewithpin_error: "no_right". - Cause: the bot lacks the Edit messages right in a channel, or Pin messages in a group. The post itself is still sent.
- What to do: give the bot that right. See Pinning.
A post can't be removed from Telegram
- Cause: Telegram lets a bot remove a message only in the first 48 hours.
- What to do: after 48 hours, remove it in Telegram yourself. See Removing a post.
Last modified on