Skip to main content

Disclosing Paid Partnerships and Branded Content

Several networks let you mark a post as sponsored or promotional with their own native label ("Paid partnership", "Includes paid promotion", "Promotional content"). Upload-Post exposes each network's field and adds one cross-network flag, paid_partnership, that is mapped to every network where the API offers it.

The paid_partnership flag​

Send paid_partnership=true with /api/upload, /api/upload_photos or /api/upload_text. It means "this post is paid for by, or made in partnership with, a third-party brand":

NetworkNative field we setWhat viewers see
TikTok (video and photo, Direct Post)brand_content_toggle (Business connections: is_branded_content)"Paid partnership" label
YouTubepaidProductPlacementDetails.hasPaidProductPlacement"Includes paid promotion" notice
Xpaid_partnership on the first post of a threadPaid partnership disclosure
Facebook Page photos, Page videos and text/link postssponsor_id, only when you also send facebook_sponsor_idBranded content tag with the sponsor's Page
Pinterestsponsor_id, only when you also send pinterest_sponsor_idPaid partnership label

A network-specific field always wins over the flag, so you can mark a post on one network and not on another in the same request:

curl -X POST https://api.upload-post.com/api/upload \
-H "Authorization: ApiKey YOUR_API_KEY" \
-F 'user=YOUR_PROFILE' \
-F 'platform[]=tiktok' -F 'platform[]=youtube' -F 'platform[]=x' -F 'platform[]=linkedin' \
-F '[email protected]' \
-F 'title=Our new collection, in partnership with Acme' \
-F 'paid_partnership=true' \
-F 'x_paid_partnership=false'

Here TikTok and YouTube get the label, X does not, and LinkedIn gets a warning (see below).

paid_partnership accepts true/false, 1/0, yes/no, on/off. Any other value is refused with error_code: commercial_disclosure_invalid_value. The network-specific fields keep exactly the parsing and behaviour they always had: if you do not send any of the new fields (paid_partnership, facebook_sponsor_id, pinterest_sponsor_id), nothing about your uploads changes.

Network-specific fields​

FieldNetworkDescription
brand_content_toggleTikToktrue = paid partnership promoting a third-party brand.
brand_organic_toggleTikToktrue = you are promoting your own business ("Promotional content").
disclose_commercial + your_brand / branded_contentTikTokThe same two options, in the shape of TikTok's own "Disclose post content" switch. On standard TikTok connections disclose_commercial=true without either option fails the TikTok post ("You must select at least one commercial content option"), as it always has.
hasPaidProductPlacementYouTubePaid product placement, sponsorship or endorsement.
x_paid_partnershipXPaid partnership disclosure on the first post.
facebook_sponsor_idFacebookNumeric id of the sponsor's Facebook Page.
pinterest_sponsor_idPinterestNumeric id of the sponsor's Pinterest account.

TikTok​

  • paid_partnership only acts on direct posts, and only when you did not send brand_content_toggle (whose value, even false, always wins) and the other TikTok fields did not already turn branded content on.
  • TikTok does not allow branded content to be "only me" (content sharing guidelines). We never make a post public that you asked to keep private, so paid_partnership=true with privacy_level=SELF_ONLY is refused with HTTP 400 error_code: commercial_disclosure_privacy_conflict before anything is published, on any network in the request. Choose another TikTok privacy level or remove paid_partnership. The same check runs when you edit a scheduled post. If a scheduled post still reaches publication in that state, it is published private, without the label, with a warning in the TikTok result.
  • Drafts (post_mode=MEDIA_UPLOAD or tiktok_upload_to_draft=true) do not carry the disclosure, on video or photo: paid_partnership is not sent and the response says so. Turn it on in the TikTok app when you finish the post.
  • The older fields keep their behaviour: on standard connections disclose_commercial=true + branded_content=true with SELF_ONLY is published as PUBLIC_TO_EVERYONE, as it always has, and the response now carries a warning that says so.
  • Music Usage Confirmation: TikTok's API has no field for it. By posting you accept TikTok's Music Usage Confirmation, and with branded content also its Branded Content Policy. If you post externally licensed music, make sure your licence covers TikTok.
  • Source: TikTok Content Posting API: Direct Post, Photo Post, Content sharing guidelines.

YouTube​

  • hasPaidProductPlacement is sent in paidProductPlacementDetails on upload, as before. YouTube's reference accepts that part on videos.insert and videos.update, but it does not list the property among the ones you can set. After the upload we look at what YouTube answered. If the answer shows the value as false, the result for YouTube carries a warning telling you to turn on "Paid promotion" in YouTube Studio.
  • To change it on a video that is already published, use Edit Post with hasPaidProductPlacement (or paid_partnership). It is one videos.update call, 50 quota units.
  • Source: videos resource, videos.update.

Facebook​

  • Facebook only tags branded content with the sponsor's Page. paid_partnership=true alone does nothing on Facebook: send facebook_sponsor_id too, otherwise you get a warning.
  • Works on Page photos and carousels, Page videos (facebook_media_type=VIDEO) and text/link posts. Reels and Stories have no sponsor field in Facebook's API: the post is published without it, with a warning.
  • Your Page must be able to use Meta's branded content tool (verified Page, Branded Content Policy). If it cannot, Facebook rejects the post and the error comes back in the Facebook result.
  • Source: Branded content (Meta), Page photos, Page videos, Page video_reels.

Pinterest​

  • pinterest_sponsor_id is sent as sponsor_id when the Pin is created. Pinterest currently opens this field only to accounts in a closed beta. Outside the beta, Pinterest rejects the Pin. It cannot be added later.
  • Source: Pinterest API v5: create Pin.

Networks without a native label​

On these networks paid_partnership=true is not applied. The upload still goes ahead and the response carries one warning per network, for example paid_partnership not applied on LinkedIn: ...:

  • Instagram: the "Paid partnership" label (is_paid_partnership, with up to two branded_content_sponsor_ids) exists only in the Instagram API with Facebook Login. Instagram accounts connected to Upload-Post use Instagram Login, which has no such field. Turn the label on in the Instagram app. Source: Instagram content publishing.
  • LinkedIn: the Posts API has no branded-content field. Source: Posts API.
  • Threads: no paid-partnership field. Source: Threads publishing.
  • Snapchat: the Public Profile API can read a sponsor on Spotlight posts but cannot set one. Source: Public Profile API.
  • Reddit: no brand-affiliate or paid-partnership field. Source: Reddit API: submit.
  • Bluesky: self-labels only cover adult content. Source: label definitions.
  • Google Business Profile and the other channels (Discord, Telegram, Mastodon, WordPress and so on) have no such label.

Where a network has no label, disclose in the text itself (for example #ad or "Paid partnership with Acme") if your local rules require it.

Scheduled posts, edits and retries​

The flags are stored with scheduled and queued posts, kept on retries, and can be changed before publication through Scheduled Posts (paid_partnership, x_paid_partnership, facebook_sponsor_id, pinterest_sponsor_id, hasPaidProductPlacement and the TikTok fields, your_brand included). An edit with an invalid value of a new field (commercial_disclosure_invalid_value), or one that leaves paid_partnership=true on a TikTok SELF_ONLY post (commercial_disclosure_privacy_conflict), is refused and nothing is changed.

Error codes​

error_codeWhen
commercial_disclosure_invalid_valuepaid_partnership is not true/false, or facebook_sponsor_id / pinterest_sponsor_id is not a numeric id (only checked when that network is in the request).
commercial_disclosure_privacy_conflictpaid_partnership=true on a TikTok direct post with privacy_level=SELF_ONLY. Only for paid_partnership; the TikTok fields themselves are never refused.

Both come back as HTTP 400 before anything is published, and also from the scheduled-post editor. Nothing else on this page is refused: where a label cannot be applied you get a warning and the upload goes on.

Upload-Post does not check whether a post is really sponsored: the flags are self-disclosure, and labeling correctly is your responsibility under each network's policy and the advertising rules that apply to you.