Instagram API media_url missing: copyrighted audio and reels
Since 2026-07-30 Instagram omits media_url for video with copyrighted audio or reels with downloads off. Treat it as optional and import files you own.

If media_url is missing from an Instagram Graph API media response, that is the documented behavior since 2026-07-30: the field is now omitted for video with copyrighted or licensed audio, and for reels whose owner turned downloads off. Treat the field as optional, and keep a copy of any file you own before you rely on the URL.
The rules below are from the Instagram Platform changelog, read 2026-09-30. The Sume side comes from the Video trim and Video frames docs.
When does Instagram omit media_url?
The changelog entry dated Jul 30, 2026 lists two cases. Both apply to the IG Media endpoint.
| Case | Applies to | Owner's own media |
|---|---|---|
| Copyrighted or licensed audio, including audio from the Instagram audio library, or flagged for a copyright violation | All video media: reels, video posts, video stories | Still omitted, even when the app user owns the media |
| Reel owner turned off downloads (account-level or per-reel) | Reels only, on endpoints that read other users' media | Not affected when you read your own media through GET /<IG_USER_ID>/media or GET /<IG_MEDIA_ID> |
What other fields still come back?
The changelog says all other fields on the media object, such as id, permalink, caption and timestamp, are unchanged. So code should branch on whether media_url is present instead of assuming it. A reel whose media_url is gone is still listed; only the file link is withheld.
How do I handle it in code?
Read media_url defensively, and queue the item for manual follow-up when it is absent. Do not try to rebuild the file URL from the permalink; the omission is a deliberate download protection.
function pickVideoSource(media) {
if (typeof media.media_url === "string" && media.media_url) {
return { ok: true, url: media.media_url };
}
return { ok: false, reason: "media_url omitted", permalink: media.permalink };
}Where does Sume fit when I do have the file?
Sume only works on media hosted on its own domain. The trim docs say there is no open-internet fetch, so import first. For a file you are allowed to use, that means importing it once and then cutting it into a new MP4 with video trim; the trim docs describe the result as a cut of one Sume-hosted clip. See the oEmbed and media-import route for the import side.
If you need stills from a clip you already have, the video frames docs list format as jpeg (default) or png with max_edge from 16 to 2160. None of this recovers a URL Instagram chose to omit.
What should I do next?
Audit every place your code reads media_url, make the missing case a normal path, and keep original uploads in your own storage. Also read the sibling case in off-host URLs are unsupported.
Sources
Related posts
More in Developers
- Instagram API poll_attachment on Reels: how the add-on works
Set poll_attachment when creating a Reel container: two to four options, 3 days by default, Facebook Login only. What Sume prepares before that call.
- Instagram publish error: linked Facebook account restricted
Meta added a publishing error: the linked Facebook account is restricted and cannot publish video. What it blocks and how to post stills from a clip meanwhile.
- graph.instagram.com 400: parameter only for Facebook Login
Requests to graph.instagram.com with a Facebook-Login-only parameter now return 400 naming it, instead of being ignored. How to read the error and fix the call.
- Instagram Graph API hashtag search: 30 per 7 days, and Sume
Meta caps hashtag search at 30 unique hashtags per account per rolling 7 days and needs app review. Sume's instagram_search_hashtag is a bounded public read.
Written by Sume