# Instagram Location Posts Scraper (`maximedupre/instagram-location-posts`) Actor

Collect public Instagram posts tagged at one location per run. Get captions, hashtags, engagement counts, media links, creator details, and place data in a structured dataset. Use an Instagram location URL or numeric location ID to choose the place.

- **URL**: https://apify.com/maximedupre/instagram-location-posts.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Marketing, Developer tools
- **Stats:** 2 total users, 1 monthly users, 77.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.95 / 1,000 location posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 📍 Explore Instagram posts by place

For marketers, researchers, and local teams, this Actor collects public Instagram posts tagged at one location per run. Each dataset row keeps the post link, caption, engagement counts, media links, creator details, and matched place data in a structured format.

**Use cases**

- Find public posts tagged at a place with **[Instagram Location Post Finder](https://apify.com/maximedupre/instagram-location-posts/examples/instagram-location-post-finder)**.
- Collect location-tagged posts in a dataset with **[Scrape Instagram Location Posts](https://apify.com/maximedupre/instagram-location-posts/examples/scrape-instagram-location-posts)**.
- Search a location URL or ID with **[Instagram Location Search](https://apify.com/maximedupre/instagram-location-posts/examples/instagram-location-search)**.
- Review recent posts from one place with **[Instagram Posts by Location](https://apify.com/maximedupre/instagram-location-posts/examples/instagram-posts-by-location)**.
- Review popular posts from one place with **[Instagram Location Posts](https://apify.com/maximedupre/instagram-location-posts/examples/instagram-location-posts)**.

#### 📦 Get structured location post data

The default dataset contains one row for each eligible public Instagram post saved for the selected location. Rows keep normalized post, creator, media, and place fields. A field can be missing when Instagram does not provide it.

**Main value**

Use the post URL and caption to review content, the likes and comments counts to compare engagement, and the media and location links to connect each row to its source.

#### ▶️ Run one Instagram location search

Each run uses one location. It accepts an Instagram location URL or numeric location ID, then applies your post choice and filters.

1. Enter an Instagram location URL or numeric location ID.
2. Choose recent posts or popular posts.
3. Add date, media type, engagement, or verified creator filters when needed.
4. Start the run.
5. Open the dataset link in the run output.

If the same source post is found again, only its first eligible occurrence is saved. The saved row describes that first match.

#### ⚙️ Input

Use one location per run. Dates use `YYYY-MM-DD`. Leave an optional filter blank to keep it off. Leave `mediaTypes` empty to include all media types.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `locationUrlOrId` | string | Required. Instagram location URL or numeric location ID for the place. |
| `postSelection` | string | Select `recent` for recent posts or `popular` for popular posts. Defaults to `recent`. |
| `publishedAfter` | string (date) | Keeps posts published on or after `YYYY-MM-DD`. Leave blank for no start date. |
| `publishedBefore` | string (date) | Keeps posts published on or before `YYYY-MM-DD`. Leave blank for no end date. |
| `mediaTypes` | array<string> | Keeps `photo`, `video`, `reel`, or `carousel` posts. Leave empty to include all media types. |
| `minimumLikes` | integer | Keeps posts with at least this many likes. Leave blank to keep all posts. |
| `minimumComments` | integer | Keeps posts with at least this many comments. Leave blank to keep all posts. |
| `verifiedCreatorsOnly` | boolean | Set to `true` to keep posts from verified creators only. Leave it `false` to apply no verified-creator filter. |

**Example input**

This is the public input from a successful beta default-style run.

```json
{
  "locationUrlOrId": "https://www.instagram.com/explore/locations/213131048/berlin-germany/",
  "postSelection": "recent",
  "verifiedCreatorsOnly": false
}
```

#### 🧾 Output

The `dataset` output link opens the default dataset. Each saved row represents one public Instagram post matched to the selected location.

**Location post rows**

| Field | Type | What it does |
| --- | --- | --- |
| `postId` | string | Stable Instagram ID for the post. |
| `postUrl` | string (URL) | Canonical Instagram link for the post. |
| `caption` | string | Caption text when available. |
| `hashtags` | array<string> | Hashtags found in the caption when present. |
| `mentions` | array<string> | Usernames mentioned in the caption when present. |
| `likesCount` | integer | Number of likes when available. |
| `commentsCount` | integer | Number of comments when available. |
| `publishedAt` | string (date-time) | Publication time reported by Instagram when available. |
| `mediaType` | string | Source media type: `photo`, `video`, `reel`, or `carousel`. |
| `imageUrls` | array<string> | Direct source URLs for post images when available. |
| `thumbnailUrl` | string (URL) | Direct source URL for a post thumbnail when available. |
| `videoUrl` | string (URL) | Direct source URL for the post video when available. |
| `creator` | object | Public creator context shown with the post. |
| `creator.id` | string | Stable Instagram ID for the creator when available. |
| `creator.username` | string | Instagram username of the creator. |
| `creator.fullName` | string | Display name of the creator when available. |
| `creator.profileUrl` | string (URL) | Instagram profile link for the creator when available. |
| `creator.profileImageUrl` | string (URL) | Direct source URL for the creator profile image when available. |
| `creator.isPrivate` | boolean | Whether the creator profile is private. |
| `creator.isVerified` | boolean | Whether Instagram marks the creator as verified. |
| `location` | object | The Instagram location matched for the post. |
| `location.id` | string | Stable Instagram ID for the location when available. |
| `location.name` | string | Name of the matched Instagram location. |
| `location.url` | string (URL) | Instagram link for the matched location when available. |
| `location.latitude` | number | Latitude of the matched location when available. |
| `location.longitude` | number | Longitude of the matched location when available. |

**Shortened genuine row**

This genuine row comes from a successful current-beta run. It is shortened because the source row contains a large image URL list. The `"..."` values mark omitted real data.

```json
{
  "postId": "3993731118929673093",
  "postUrl": "https://www.instagram.com/reel/DdslUsAOfuF/",
  "caption": "Diosito no me castigues \nmás😫😫😫😫 #futbol #costarica #humor #curazao #concacaf",
  "hashtags": [
    "#futbol",
    "#costarica",
    "#humor",
    "#curazao",
    "#concacaf"
  ],
  "mentions": [],
  "likesCount": 12,
  "commentsCount": 0,
  "publishedAt": "2026-09-25T04:18:15.000Z",
  "mediaType": "reel",
  "imageUrls": [
    "..."
  ],
  "thumbnailUrl": "https://scontent-lga3-2.cdninstagram.com/v/t51.82787-15/797229482_17910319746497495_9134358096624017343_n.jpg?stp=dst-jpg_e15_tt6&_nc_cat=105&ig_cache_key=Mzk5MzczMTExODkyOTY3MzA5MzE3OTEwMzE5NzQzNDk3NDk1.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNMSVBTLnhwaWRzLjEyMDYuc2RyLnZpZGVvX2RlZmF1bHRfY292ZXJfZnJhbWUuQzMifQ%3D%3D&_nc_ohc=977jfycZyX4Q7kNvwHT-SvD&_nc_oc=AdqglAPQgKSP8gJDraegdUEpksfMG1lNj_EPJSrpqN9cP7p_xbbG6W2p4LYt7xQNPmI&_nc_zt=23&_nc_ht=scontent-lga3-2.cdninstagram.com&_nc_gid=mcQWuRglNu6k24eIZICVZQ&_nc_ss=7f689&oh=00_AQLtx8fYp0UVvG6y_RIm5EJsImkovzMFUAIrBDluJRFzpw&oe=6ABBB23F",
  "videoUrl": "https://scontent-lga3-1.cdninstagram.com/o1/v/t2/f2/m86/AQMk2dHuH_9RNQZWHnvsG4FRmPHFZZ7NiWAwMNzQ61vwg2TJvAudurgjwMgz4VAaGRmjQNnNiTvBXMvOe9VICnA6fII-S75dicxGSiA.mp4?_nc_cat=109&_nc_sid=5e9851&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_ohc=R0cVNL1Kk5wQ7kNvwELy4lF&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uQ0xJUFMuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6Mjg3MjgwOTgyNzY4NzY0OTEsImFzc2V0X2FnZV9kYXlzIjowLCJ2aV91c2VjYXNlX2lkIjoxMDA5OSwiZHVyYXRpb25fcyI6OSwidXJsZ2VuX3NvdXJjZSI6Ind3dyJ9&ccb=17-1&vs=52db513794f38f3b&_nc_vs=HBksFQIYUmlnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC8zRjQ0QjkxRTJBNDU0Q0FDRDk3OEMwMDY3RTA4RjlCQl92aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyLzEzNDRGMUI4RkJFRTZCNDZDNDg5RTgzMjQ5MDZCN0JCX2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACaWg-3Ns4OIZhUCKAJDMywXQCOZmZmZmZoYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HZeadAQA&_nc_gid=mcQWuRglNu6k24eIZICVZQ&_nc_ss=7f689&_nc_zt=28&oh=00_AQI6i-MtFnf1fd2MT9fV2VBhy3W7DmDcrXtTaZksTbeXDA&oe=6AB7D67E",
  "creator": {
    "id": "75058673494",
    "username": "futbolconoscar",
    "fullName": "Oscar Araya",
    "profileUrl": "https://www.instagram.com/futbolconoscar/",
    "profileImageUrl": "...",
    "isPrivate": false,
    "isVerified": true
  },
  "location": {
    "id": "212988663",
    "name": "New York, New York",
    "url": "https://www.instagram.com/explore/locations/212988663/new-york-new-york/",
    "latitude": 40.73060987941,
    "longitude": -73.935242127765
  }
}
```

#### 💳 Pricing

Pricing is tied to saved public location posts. Each `Location post` event covers one public post tagged at the requested location and saved to your dataset.

**Location post**

One public post tagged at the requested location is saved to your dataset.

#### 🔌 Integrations

**Dataset access**

Use the output link to open the default Apify dataset. You can also read the dataset through the Apify API.

**Video guide**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I use a location URL or numeric location ID?

Yes. Enter one Instagram location URL or numeric location ID for each run.

##### Does the Actor need an Instagram login?

No. It reads public location-tagged posts and does not require your Instagram login or cookies. Private or login-gated content is outside its scope.

##### Can I choose recent or popular posts?

Yes. Set `postSelection` to `recent` or `popular`.

##### What happens when I leave filters blank?

Blank date fields add no date limit. A blank minimum likes or comments field keeps posts at any count. An empty `mediaTypes` list includes all media types. Leave `verifiedCreatorsOnly` set to `false` to apply no verified-creator filter.

##### Will the same post appear twice?

When the same source post is found again, the Actor keeps its first eligible occurrence and ignores later matches. The saved row describes that first match.

##### Is this an Instagram location tracker?

It collects available public posts for one location in a run. It does not promise ongoing monitoring or change alerts between runs.

##### What does one dataset row contain?

Each row can include the post identity and link, caption tags, engagement counts, publication time, media links, creator context, and matched location data. Fields can be missing when Instagram does not provide them.

##### How does pricing work?

Each saved public location post is one billable `Location post` event. The event description is shown in the Pricing section above.

### 📝 Changelog

**v0.0** (25-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~instagram-location-posts/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Instagram Post & Reel Content Scraper](https://apify.com/maximedupre/instagram-post-content-scraper) collects public posts and Reels from profile feeds for profile-based content research.
- [Instagram Hashtag Username Scraper](https://apify.com/maximedupre/instagram-hashtag-username-scraper) finds public posts and usernames connected to hashtags.
- [Instagram Reels Search Scraper](https://apify.com/maximedupre/instagram-reels-search-scraper) finds public Reels by keyword phrase or hashtag.
- [Instagram Engagement Scraper](https://apify.com/maximedupre/instagram-engagement-scraper) compares public profile feed and Reels engagement measures.
- [Instagram Profile Stats Scraper](https://apify.com/maximedupre/instagram-profile-stats-scraper) collects public profile, audience, and activity data for known accounts.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `locationUrlOrId` (type: `string`):

Paste an Instagram location URL or enter its numeric location ID.

## `postSelection` (type: `string`):

Choose whether to collect recent posts or popular posts for the location.

## `publishedAfter` (type: `string`):

Only include posts published on or after this date. Leave blank for no start date.

## `publishedBefore` (type: `string`):

Only include posts published on or before this date. Leave blank for no end date.

## `mediaTypes` (type: `array`):

Choose the media types to include. Leave this empty to include all media types.

## `minimumLikes` (type: `integer`):

Only include posts with at least this many likes. Leave blank to keep all posts.

## `minimumComments` (type: `integer`):

Only include posts with at least this many comments. Leave blank to keep all posts.

## `verifiedCreatorsOnly` (type: `boolean`):

Set this to true to include posts from verified creators only.

## Actor input object example

```json
{
  "locationUrlOrId": "https://www.instagram.com/explore/locations/213131048/berlin-germany/",
  "postSelection": "recent",
  "verifiedCreatorsOnly": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the collected Instagram location posts.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locationUrlOrId": "https://www.instagram.com/explore/locations/213131048/berlin-germany/",
    "postSelection": "recent"
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/instagram-location-posts").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locationUrlOrId": "https://www.instagram.com/explore/locations/213131048/berlin-germany/",
    "postSelection": "recent",
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/instagram-location-posts").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locationUrlOrId": "https://www.instagram.com/explore/locations/213131048/berlin-germany/",
  "postSelection": "recent"
}' |
apify call maximedupre/instagram-location-posts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/instagram-location-posts"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GYEZyWw3p7F3KkSFv/builds/4nm9pnzshaT8tFXRt/openapi.json
