> **For coding agents and LLMs:** This is one Social Fetch marketing page (markdown export). For API orientation start with [`/llms.txt`](https://www.socialfetch.dev/llms.txt); for auth and crawl rules use [`/agents.txt`](https://www.socialfetch.dev/agents.txt); for every operation use [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt).

## This page

- **On-site (HTML):** <https://www.socialfetch.dev/use-cases/instagram-rss-feed-alternative>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/use-cases/instagram-rss-feed-alternative.mdx>

---

# There's no Instagram RSS feed. Here's what actually works.

No official Instagram RSS. Monitors polls public posts, diffs, and delivers signed webhooks or pullable JSON events — no login, no scraper bridge.

Instagram has no official RSS. Third-party bridges scrape the site, break on redesigns, and often ask for your login.

No RSS/Atom here either. GET /v2/instagram/profiles/{profile}/media reads public posts; Monitors diffs on a schedule and delivers signed webhooks or pullable JSON events. Metered per-check pricing; stable schema and retried delivery.

## Endpoints

| Method | Path | What it does |
| --- | --- | --- |
| GET | `/v2/instagram/profiles/{profile}` | Public profile lookup — bio, follower count, verification, privateAccount — before you commit to watching an account. |
| GET | `/v2/instagram/profiles/{profile}/media` | Recent posts for a profile, cursor-paginated — the same feed a browser sees, the underlying source the RSS-feed workaround was trying to replicate. |
| GET | `/v1/monitors/sources` | Discover the watchable operationId for Instagram posts (instagram.profile.posts.list), its minimum interval, and a sample event. |
| POST | `/v1/monitors` | Create a monitor on a profile's posts — the "subscribe to this feed" step, delivered as a signed webhook instead of an RSS entry. |
| POST | `/v1/webhook-endpoints` | Create the delivery target: a real URL, or a hosted test inbox (kind: "sink") to see it work with nothing deployed yet. |
| GET | `/v1/monitors/{id}/events` | Pull new-post events directly, cursor-paginated — the closest thing to polling an RSS feed, if you'd rather not run a webhook receiver at all. |

## Workflow

1. **Confirm the account is public and worth watching.** GET /v2/instagram/profiles/{profile} tells you privateAccount and lookupStatus before you schedule anything against it — private accounts won't produce new-post events.
2. **Read the feed once, the normal way.** GET /v2/instagram/profiles/{profile}/media returns recent posts, cursor-paginated. This is the source of truth Monitors diffs against, so it's worth understanding the shape first.
3. **"Subscribe" by creating a monitor.** POST /v1/monitors with instagram.profile.posts.list, the handle, and a schedule. Creation runs a synchronous baseline, so posts already there don't fire a false new_items event.
4. **Pick push or pull.** Attach a webhook endpoint for push delivery, or leave webhookEndpointId unset and pull GET /v1/monitors/{id}/events on your own cadence — a valid pull-only monitor, the closest match to RSS polling behavior.
5. **Verify signed deliveries over the raw body.** If you're using webhooks, verify with verifySignature or constructEvent from @socialfetch/sdk/webhooks before parsing — the signature is computed over the exact request bytes.
6. **See it work before you build a reader for it.** A hosted test inbox or npx socialfetch listen --forward-to <local-url> lets you see a real signed new_items event before you've written any consumption code at all.

## Read a profile's recent posts — the feed Monitors diffs against.

```bash
curl -sS \
  -H "x-api-key: YOUR_API_KEY" \
  "https://api.socialfetch.dev/v2/instagram/profiles/mkbhd/media"
```

## Why Monitors over an RSS-bridge scraper

- Never asks for your Instagram login — reads public data the same way a signed-out browser would.
- A documented, versioned JSON schema instead of scraped HTML selectors that silently break on Instagram's next redesign.
- Push delivery is signed and retried — 8 attempts over roughly 21 hours on failure — instead of a bridge's fixed poll interval with no delivery guarantee at all.
- Would rather poll than run a webhook receiver? GET /v1/monitors/{id}/events is a cursor-paginated JSON feed you can treat exactly like an RSS reader treats a feed URL.
- A hosted test inbox and the socialfetch listen CLI let you see a real event before you've deployed anything.
- Transparent per-check credit pricing instead of a free bridge whose maintainer is quietly absorbing scraping risk you can't see.
