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>
Without the loader script there is nothing listening for resize messages, so you must set an explicit height on the iframe yourself and adjust it to fit your feed's layout.

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_ID

The 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, or CAROUSEL_ALBUM.
  • caption — the post caption, or null if 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; 0 otherwise.

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.