How to Embed an Instagram Post: oEmbed API Guide
api.instagram.com/oembed was retired in October 2020 and returns HTML, not JSON. The live endpoint is graph.facebook.com/v26.0/instagram_oembed, and it needs a Meta app, an app access token and oEmbed Read approved through App Review. Here is the exact call, what it gives you back, and what it leaves out.
The Instagram oEmbed API in 2026
api.instagram.com/oembed no longer works
Meta retired the old, key-free endpoint in October 2020. When we tested it on 11 September 2026, a request to https://api.instagram.com/oembed?url=POST_URL redirected to an instagram.com web page and returned HTML, not JSON, so code that still calls it can't parse the reply. noembed.com doesn't fill the gap either: it now answers Instagram URLs with "no matching providers found".
The current endpoint: instagram_oembed
The replacement lives on the Graph API. Meta requires an app access token, sent as your app ID and client token joined by a pipe, and the app needs the oEmbed Read feature approved through App Review.
curl -G https://graph.facebook.com/v26.0/instagram_oembed \
-d url=https://www.instagram.com/p/POST_SHORTCODE/ \
-d maxwidth=400 \
-d omitscript=true \
-d 'access_token=APP_ID|CLIENT_TOKEN'maxwidth sets the embed width, and omitscript=true leaves out the embed.js tag so you can load it once per page yourself. The response is just the embed markup:
{
"version": "1.0",
"provider_name": "Instagram",
"provider_url": "https://www.instagram.com/",
"type": "rich",
"width": 400,
"html": "<blockquote class=\"instagram-media\" ...>"
}In the same test, the endpoint also answered without an access token. That isn't documented, so don't build on it: Meta can switch it off without notice.
What oEmbed won't give you
The response has no thumbnail_url, no author_name and no caption. You get Instagram's blockquote and its script, styled Instagram's way. Meta's terms also forbid using oEmbed data for anything other than showing the embed, so you can't lift the image out into your own layout.
If you need the image, caption or post details as data, use the Instagram Graph API with an access token, or let Feedframer return them as JSON.
oEmbed or a Data API?
oEmbed is the right tool when you want Instagram's own embed card and nothing more. It stops being the right tool the moment you need the post as data.
instagram_oembed gives you
- • Instagram's
blockquotemarkup plusembed.js - •
widthandprovider_name - • One post per request, by URL
- • Instagram's styling, which you may not restyle
- • A Meta app plus App Review for oEmbed Read before any of it works
Feedframer gives you
- • Caption, media type, permalink and timestamp as JSON, GraphQL or RSS
- • Image URLs at 320, 768, 960 and 1200px for a
srcset - • Images copied to our storage and served from
cdn.feedframer.com, not an expiring Instagram CDN URL - • Your own markup, because you render the data
- • One OAuth connection instead of an App Review submission
The whole Feedframer request
curl 'https://feedframer.com/api/v1/me?api_key=YOUR_API_KEY' One API key per connected account. Add filter[type]=IMAGE or filter[publishedAfter]=2026-01-01 to narrow the result, or include[]=children for a carousel's individual slides. Full parameters are in the REST API reference.
When to Use Feedframer Instead
You need the post's data, not its card
Captions, timestamps, media types and image URLs come back as JSON, so you can put a post into your own layout instead of Instagram's blockquote.
You want several posts in one call
oEmbed is one post per request, by URL. A feed request returns your recent posts in one go — 6 on the free plan, up to 100 per page on Premium.
You don't want to run App Review
instagram_oembed needs a Meta app with the oEmbed Read feature approved. Feedframer is one OAuth connection, and we hold the app.
You don't want to manage a 60-day token
Instagram's long-lived token expires after 60 days and has to be refreshed before it does. Feedframer refreshes it for you; see the access token guide for what that involves by hand.
How Feedframer Works
Connect your Instagram account
One OAuth connection for a Business or Creator account. We hold the Meta app and refresh the 60-day token, so you don't need an app or App Review.
Request the posts you want
REST, GraphQL or RSS, with one API key per account. Narrow the result by media type (filter[type]) or publish date (filter[publishedAfter]).
Build your own embed
Single post cards, grids, carousels — you write the markup. Four image widths come back for responsive srcset attributes.
Leave it running
New posts are picked up daily on the free plan and hourly on Premium. Images are copied to our storage on the way in, so a post you've synced keeps rendering.
Common Use Cases
Retail & eCommerce
Put product posts on detail pages in your own card design rather than an Instagram blockquote.
Editorial & Publishing
Render a post inside an article without loading Instagram's embed script on every page.
Agencies
Connect up to five client accounts on one Premium plan, each with its own API key.
Email campaigns
Drop the RSS feed into a Mailchimp or Klaviyo RSS campaign — a thing oEmbed cannot do.
FAQs
Does api.instagram.com/oembed still work?
No. Meta retired the key-free endpoint in October 2020. Tested on 11 September 2026, a request to https://api.instagram.com/oembed?url=POST_URL returned a 301 to www.instagram.com/oembed/ and then 200 text/html — a web page, not JSON — so any client that still parses the reply as JSON fails. The live replacement is graph.facebook.com/v26.0/instagram_oembed. noembed.com is not a workaround either: on the same date it answered Instagram URLs with "no matching providers found".
What do I need to call instagram_oembed?
A Meta app, an app access token in the form APP_ID|CLIENT_TOKEN, and the oEmbed Read feature approved through App Review. In our 11 September 2026 test the endpoint also answered with no access token at all, on both v23.0 and v26.0, but that is not documented behaviour — do not build on it, because Meta can close it without notice.
Can I get an Instagram post's thumbnail or caption from oEmbed?
No. The instagram_oembed response contains version, provider_name, provider_url, type, width and html, and nothing else: no thumbnail_url, no author_name and no caption. Meta's platform terms also restrict oEmbed data to rendering the embed, so you cannot lift the image out into your own layout. For the image and the caption as data you need the Instagram Graph API with a long-lived access token, or a feed API that has already done that work.
What does Feedframer return that oEmbed doesn't?
oEmbed returns Instagram's blockquote plus its embed.js script, styled Instagram's way. Feedframer returns the post as data — REST JSON, GraphQL or RSS — with the caption, media type, permalink, timestamp and image URLs at 320, 768, 960 and 1200 pixels wide. Images are copied to Feedframer's own storage when a post is synced and served from cdn.feedframer.com, so your markup is yours and it does not depend on an Instagram CDN URL that expires.
Will a post disappear from my site if it is deleted on Instagram?
No. Feedframer stores a post when it first syncs it and does not remove a stored post if it later stops coming back from the Instagram API, and that post's images are already on Feedframer's own storage rather than Instagram's CDN. A post you have already synced keeps rendering. New posts, of course, stop arriving if the connection breaks.
Can I filter which posts the API returns?
By media type and publish date. filter[type] accepts IMAGE, VIDEO, CAROUSEL_ALBUM and REELS; filter[publishedAfter] and filter[publishedBefore] take dates. There is no post-by-post moderation or approval queue — you cannot hide an individual post from the dashboard today. If you need to exclude specific posts, filter them out of the JSON in your own code.
Is there a rate limit on the API?
Feedframer does not apply a per-key request limit on either plan, so you can call it as often as your site needs. What the plans limit is data, not requests: the free plan covers one connected account and your six most recent posts with no paging, and refreshes daily. Premium ($6/month or $60/year) covers five accounts, up to 100 posts per page, and refreshes hourly.
Does it work with private accounts?
No. Instagram's API only exposes media for Business and Creator accounts, so a private personal account returns nothing. Convert the account to Business or Creator in the Instagram app first, then connect it.
Is the result mobile-responsive?
Feedframer returns raw data rather than a widget, so responsiveness depends on the markup you write. The JSON includes four image widths — 320, 768, 960 and 1200 pixels — which is what you need for a srcset. We ship demo widgets, but the point of a data API is that you build the UI you want.
Related Resources
Instagram Long-Lived Access Token
Generate a 60-day token and refresh it before it expires
Instagram API Error 190
What each OAuthException message means, and which ones a reconnect fixes
Instagram API
API documentation
REST API
Complete reference
Performance
Caching and optimisation
Pricing
Free and premium
Try it without the App Review
The free plan connects one Instagram account and serves your 6 most recent posts, with no limit on API requests. No credit card.