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":
| Network | Native field we set | What viewers see |
|---|---|---|
| TikTok (video and photo, Direct Post) | brand_content_toggle (Business connections: is_branded_content) | "Paid partnership" label |
| YouTube | paidProductPlacementDetails.hasPaidProductPlacement | "Includes paid promotion" notice |
| X | paid_partnership on the first post of a thread | Paid partnership disclosure |
| Facebook Page photos, Page videos and text/link posts | sponsor_id, only when you also send facebook_sponsor_id | Branded content tag with the sponsor's Page |
sponsor_id, only when you also send pinterest_sponsor_id | Paid 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
| Field | Network | Description |
|---|---|---|
brand_content_toggle | TikTok | true = paid partnership promoting a third-party brand. |
brand_organic_toggle | TikTok | true = you are promoting your own business ("Promotional content"). |
disclose_commercial + your_brand / branded_content | TikTok | The 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. |
hasPaidProductPlacement | YouTube | Paid product placement, sponsorship or endorsement. |
x_paid_partnership | X | Paid partnership disclosure on the first post. |
facebook_sponsor_id | Numeric id of the sponsor's Facebook Page. | |
pinterest_sponsor_id | Numeric id of the sponsor's Pinterest account. |
TikTok
paid_partnershiponly acts on direct posts, and only when you did not sendbrand_content_toggle(whose value, evenfalse, 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=truewithprivacy_level=SELF_ONLYis refused with HTTP 400error_code: commercial_disclosure_privacy_conflictbefore anything is published, on any network in the request. Choose another TikTok privacy level or removepaid_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_UPLOADortiktok_upload_to_draft=true) do not carry the disclosure, on video or photo:paid_partnershipis 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=truewithSELF_ONLYis published asPUBLIC_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
hasPaidProductPlacementis sent inpaidProductPlacementDetailson upload, as before. YouTube's reference accepts that part onvideos.insertandvideos.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 asfalse, 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(orpaid_partnership). It is onevideos.updatecall, 50 quota units. - Source: videos resource, videos.update.
Facebook
- Facebook only tags branded content with the sponsor's Page.
paid_partnership=truealone does nothing on Facebook: sendfacebook_sponsor_idtoo, 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_idis sent assponsor_idwhen 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 twobranded_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_code | When |
|---|---|
commercial_disclosure_invalid_value | paid_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_conflict | paid_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.