Instagram Reels API: is_paid_partnership and sponsor IDs
The Instagram Content Publishing API takes is_paid_partnership and branded_content_sponsor_ids for Reels, sponsor ids need Facebook Login. Request-body example.

To publish a Reel as a paid partnership through the Instagram API, create the media container with media_type=REELS, a video_url, is_paid_partnership and the sponsor in branded_content_sponsor_ids. The publishing guide marks branded_content_sponsor_ids as Facebook Login only, and says is_paid_partnership is set to true automatically when sponsor ids are provided. If your app authenticates with another login type, do not count on the sponsor field. The AI label is a separate, optional boolean, is_ai_generated; a sponsored AI ad can need both.
Fields on the page
| Field | Status on the page |
|---|---|
media_type | REELS to publish a Reel |
video_url | Required; the path to the video |
is_ai_generated | Optional boolean for AI disclosure |
is_paid_partnership | Optional boolean; set to true automatically when sponsor ids are given |
branded_content_sponsor_ids | Optional array of up to 2 Instagram user IDs; Facebook Login only |
| Readback quirk | Requesting media_type on a published Reel returns VIDEO |
Example container body
This sketch builds the JSON for the container request. The sponsor id is a placeholder, and the /media call itself needs an access token from Facebook Login that you hold.
import json
def reel_body(video_url, sponsor_ids=None, ai=False):
body = {"media_type": "REELS", "video_url": video_url}
if ai:
body["is_ai_generated"] = True
if sponsor_ids:
body["is_paid_partnership"] = True
body["branded_content_sponsor_ids"] = list(sponsor_ids)
return body
print(json.dumps(reel_body(
"https://example.com/reel.mp4", ["1234567890"], ai=True), indent=2))
Where Sume fits
Sume makes the file; your app sets the flags. The video_url must be reachable by Instagram, which is your hosting decision: this page does not say whether a media.sume.com link satisfies Instagram's fetcher, so test it with a draft. Cut the clip to length with video trim ($0.02 per job) before you create the container.
Order of operations
Decide the partnership and AI flags before you render, not after. They belong to the publish request, so a late change means a new container, not an edit to the file. A workable order is: produce the final MP4, probe it, build the container body above, create the container, wait for it to finish processing, then publish. Keep the sponsor id in configuration rather than in code, since it differs per campaign, and log the exact body you sent so a disclosure question can be answered later from your own records.
Limits
The page describes the sponsor ids as Instagram user IDs of brands (maximum 2, professional accounts), and says nothing about whether a partnership label replaces or adds to the AI label. If you read the Reel back, do not branch on media_type: it returns VIDEO after publishing. For the AI field alone, see the is_ai_generated parameter.
Sources
Related posts
More in Integrations
- Instagram Reels API share_to_feed: true does not guarantee Reels
share_to_feed=true lets a Reel appear in Feed and Reels; false limits it to Reels. Neither value guarantees placement. What Meta's page says, and what to prep.
- Instagram Reels API limits: 3 collaborators, no carousel, audio tags
Meta's Reels API allows up to 3 collaborators, keeps Reels out of carousels, and limits music tagging to original audio. The limits that shape a batch plan.
- langchain-mcp-adapters is archived: what changes for Sume
langchain-mcp-adapters was archived on Sept 17, 2026 and MCP moved into LangChain as langchain[mcp]. What to re-check when the server is Sume's hosted MCP.
- Letta MCP server: register Sume with mcp_servers.create
Register Sume's hosted MCP in Letta with mcp_servers.create, the streamable_http type and an Authorization token, then attach its tools to an agent by id.
Written by Sume