> **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/platforms/instagram/v2-instagram-locations-locationid-media>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/platforms/instagram/v2-instagram-locations-locationid-media.mdx>

---

# Instagram location media API

Page the posts and Reels tagged at a place as structured JSON, top-ranked or newest first, in the shared Social Fetch envelope.

`GET /v2/instagram/locations/{locationId}/media` takes the Instagram location id in the path, or an instagram.com `/explore/locations/<id>/` URL. The optional `tab` query picks the feed: `top` (default) for the posts Instagram ranks first, or `recent` for the newest. Read `data.lookupStatus` (`found` or `not_found`), then `data.media` and `data.page` (`hasMore`, `nextCursor`).

Each item is the media object every v2 list returns, with every field always present and `null` when Instagram doesn't say: `id`, `shortcode`, `url`, `kind` (`post` or `reel`), `mediaType`, `caption`, `createdAt` (ISO-8601), the `owner`, `metrics`, image and video URLs, `carousel`, `audio`, `coauthors`, `taggedUsers` and the tagged `location`. `metrics.likeCount` is `null` and `metrics.likesHidden` is `true` when the author hides likes.

The feeds show what Instagram shows now, which reaches back only a short time rather than all time. Use `recent` to monitor a venue or neighbourhood. When `data.page.hasMore` is true, pass `data.page.nextCursor` as `cursor`; it belongs to one location and one feed, so you can omit `tab` on later pages. Repeated posts are dropped and the list ends when a page brings nothing new. Instagram CDN URLs can expire. Bill from `meta.creditsCharged`, per page.

For the place's own name and coordinates use `GET /v2/instagram/locations/{locationId}`, and to find a location id by name use `GET /v2/instagram/locations/search`.

## Request

- **Endpoint:** `GET /v2/instagram/locations/{locationId}/media`
- **Credits:** 1 credit
Failed requests are free
- **Input:** by location id
- **Full reference:** [docs](https://www.socialfetch.dev/docs/api/v2/instagram/locations/locationid/media/get)
- **Platform page:** [/platforms/instagram](https://www.socialfetch.dev/platforms/instagram)

## FAQ

### How do I list Instagram posts at a location via API?

Call `GET /v2/instagram/locations/{locationId}/media` with your Social Fetch API key (`x-api-key`) and the location id in the path. Choose a feed with `tab=top|recent`. Read `data.lookupStatus`, `data.media` and `data.page` in the JSON response. See the API docs for parameters and examples.

### How much does the Instagram location media API cost?

Pricing is documented on the operation in the API registry (shown on this page). Confirm on every response with meta.creditsCharged — that field is the billing source of truth. Each paginated page is a separate billed request.

### Where do I get a location id?

Search by name with `GET /v2/instagram/locations/search`: each result's `id` works here. A post's `location.id` is the same id, and it is the number in an `instagram.com/explore/locations/{id}/` URL, which you can also pass in the path.

### What is the difference between the top and recent tabs?

`top` is the posts Instagram ranks first for the place. `recent` is the newest posts first, which is the feed to poll for new content. Each tab pages on its own cursor, and the cursor remembers its location and tab.

### What does not_found mean here?

The location id doesn't exist. A real place that nobody has tagged recently comes back as `found` with an empty `media` array.

### How does pagination work?

When `data.page.hasMore` is true, pass `data.page.nextCursor` as `cursor` on the next request. A cursor from another location, another route or another tab is a `400`, as is a `tab` that differs from the cursor's. The list ends when `hasMore` is false.
