Guide
Embedding & API
Every feed can be rendered three ways: the script-tag widget, a direct iframe, or raw JSON for a fully custom front-end. All three come from the same feed, so customizing the feed in the dashboard updates them everywhere.
The script tag
The recommended way to embed. Paste this where the feed should appear, replacing FEED_IDwith your feed's ID (the Embed code dialog in the dashboard gives you the snippet pre-filled):
<script src="https://simpleembed.com/embed.js" data-feed-id="FEED_ID" async></script>The script is tiny and loads with async, so it never blocks your page. It replaces itself with an iframe pointed at your feed's embed URL, sized to 100% of the container's width. You can place multiple script tags with different feed IDs on the same page.
How auto-resize works
The embedded document measures its own rendered height and reports it to the parent page with window.postMessage. The loader script listens for these messages — accepting only messages from the Simpleembed origin that match the feed ID — and sets the iframe's height to match. The result: no scrollbars, no clipped posts, and the iframe follows along when the feed's content or your layout changes.
Direct iframe alternative
If your platform strips script tags (some site builders and CMS fields do), embed the feed URL directly in an iframe:
<iframe
src="https://simpleembed.com/embed/FEED_ID"
title="Instagram feed"
loading="lazy"
style="width: 100%; height: 600px; border: 0;"
></iframe>The JSON API
Every feed is also available as JSON — useful when you want to render posts with your own markup instead of the widget:
GET https://simpleembed.com/api/feeds/FEED_IDThe endpoint is public, CORS-enabled (so you can fetch it from the browser), and served with CDN caching. A response looks like this:
{
"feed": {
"id": "FEED_ID",
"name": "Homepage feed",
"source": "Studio account"
},
"posts": [
{
"id": "17895695668004550",
"mediaType": "IMAGE",
"caption": "Behind the scenes at the studio.",
"permalink": "https://www.instagram.com/p/XXXXXXXXXXX/",
"imageUrl": "https://simpleembed.com/api/img/FEED_ID/17895695668004550",
"timestamp": "2026-07-14T09:30:00+0000",
"childCount": 0
}
]
}feed fields
id— the feed ID.name— the feed name you set in the dashboard.source— the name of the connected Instagram source the feed pulls from.
The API is deliberately data-only: widget presentation settings (layout, columns, spacing…) apply to the embed and are not part of the response. The feed's postCount setting does control how many posts the API returns.
posts fields
Posts are returned newest first, limited to the feed's postCount setting. Each post has:
id— the Instagram media ID.mediaType—IMAGE,VIDEO, orCAROUSEL_ALBUM.caption— the post caption, ornullif there is none.permalink— the post's URL on instagram.com.imageUrl— a stable image URL served through the Simpleembed proxy. Raw Instagram CDN URLs expire within days; this one does not. Videos resolve to their poster frame.timestamp— when the post was published on Instagram.childCount— for carousel albums, how many child images the post has;0otherwise.
If the feed ID does not exist, the endpoint returns 404 with { "error": "Feed not found." }.
Don't have a feed yet? Follow the getting started guide or create a free account.