# Instagram Location Scraper (`calm_builder/instagram-location-scraper`) Actor

Scrape Instagram posts and reels tagged at any place, plus place details. Venues come with street address, phone, website and Google rating. Get coordinates, post counts, captions, likes and owners. No login.

- **URL**: https://apify.com/calm\_builder/instagram-location-scraper.md
- **Developed by:** [Coder](https://apify.com/calm_builder) (community)
- **Stats:** 14 total users, 13 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 places

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

## Instagram Location Scraper

Collect public Instagram posts and reels tagged at any place, together with the place's details: name, category, coordinates, total post count, the venue's own Instagram account and today's opening hours. For restaurants, shops, gyms, hotels and other venues you also get the **street address, phone, website and Google rating**, matched from Google Maps. Every post comes with caption, media, likes, comments, reel play counts, owner and hashtags, in a clean, structured format.

Add place links or IDs, choose how many posts you need, and export the results as JSON, CSV or Excel, or pull them through the Apify API. No Instagram account or login needed.

### What This Actor Does

- Collects the **recent** and **top** public posts and reels tagged at each place
- Saves one row of **place details** per place: category, coordinates, how many posts Instagram has for it, the venue's **own Instagram account** and today's **opening status**
- Adds each venue's **street address, phone, website and Google rating** from Google Maps, which Instagram itself does not provide
- Supports many places in one run and never returns the same post twice
- Accepts place links or plain place IDs
- Can skip posts older than a date you choose
- Returns engagement (likes, comments, **reel play counts**), media, audio, owner and tagged users

### Best For

- Local marketing and finding creators who post from a venue, city or neighbourhood
- Monitoring what people post at your business, a competitor's, or an event venue
- Tourism, travel and real-estate research
- Building location datasets for maps, dashboards, NLP or AI workflows

### Input

Add one or more Instagram places and set how many posts to collect for each.

#### Main input fields

- `startUrls`
  One place per row: a place link such as `https://www.instagram.com/explore/locations/213131048/berlin-germany/`, or just its ID (`213131048`).
- `resultsLimit`
  How many posts to collect for each place. Set `0` to collect place details only.
- `onlyPostsNewerThan`
  Skips posts published before this date, for example `2026-09-01` or `7 days`.

Inputs written for other location scrapers (`locationIds`, `maxItems`, `until`) also work.

#### Example input

```json
{
  "startUrls": [
    "https://www.instagram.com/explore/locations/213131048/berlin-germany/",
    "213385402"
  ],
  "resultsLimit": 100
}
```

### Output

The run has two tables: **Posts & reels** (one row per post) and **Places** (one row per place).

#### Post fields

| Field                                          | Description                                                   |
| ---------------------------------------------- | ------------------------------------------------------------- |
| `url`, `shortCode`, `id`                       | Post link and identifiers                                     |
| `type`, `productType`                          | `Image`, `Video` or `Sidecar` (carousel); `clips` for reels   |
| `caption`, `hashtags`, `mentions`              | Post text and the hashtags and accounts it mentions           |
| `timestamp`                                    | Publish time (ISO 8601, UTC)                                  |
| `likesCount`, `commentsCount`                  | Engagement counts                                             |
| `videoPlayCount`, `videoDuration`              | Play count and length for reels and videos                    |
| `displayUrl`, `images`, `videoUrl`, `audioUrl` | Media links                                                   |
| `ownerUsername`, `ownerFullName`, `ownerId`    | Who published the post                                        |
| `taggedUsers`, `coauthorProducers`             | Tagged accounts and collaborators                             |
| `locationName`, `locationId`                   | The place the post is tagged at                               |
| `locationTab`                                  | `recent` or `top`: which of the place's feeds the post is in  |
| `inputUrl`                                     | The place you entered                                         |

#### Place fields

| Field                        | Description                                  |
| ---------------------------- | -------------------------------------------- |
| `id`, `name`, `url`          | Place ID, name and link                      |
| `category`                   | For example `City`, `Restaurant`, `Park`     |
| `lat`, `lng`                 | Coordinates                                  |
| `mediaCount`                 | How many posts Instagram has for the place   |
| `businessUsername`, `businessUrl`, `businessId` | The venue's own Instagram account, when it has one |
| `openingStatus`              | Today's hours, for example `Open until 9:00 PM` |
| `address`, `city`, `zip`     | Street address of venues                     |
| `phone`, `website`           | Venue contact details                        |
| `googleMaps`                 | The matched Google Maps listing: `title`, `address`, `street`, `city`, `postalCode`, `state`, `countryCode`, `phone` (international format), `phoneUnformatted`, `website`, `category`, `rating`, `reviewsCount`, `placeId`, `url`, `distanceMeters` |

#### Example output

```json
{
  "inputUrl": "https://www.instagram.com/explore/locations/213131048/berlin-germany/",
  "id": "3985535646503749253",
  "type": "Video",
  "productType": "clips",
  "shortCode": "DdPd43hg0aF",
  "url": "https://www.instagram.com/p/DdPd43hg0aF/",
  "caption": "Sunday at the Spree #berlin",
  "hashtags": ["berlin"],
  "timestamp": "2026-09-28T15:03:16.000Z",
  "likesCount": 1204,
  "commentsCount": 18,
  "videoPlayCount": 23410,
  "ownerUsername": "example_creator",
  "locationName": "Berlin, Germany",
  "locationId": "213131048",
  "locationTab": "recent"
}
```

Media links are provided by Instagram and expire after a while, so download any files you need soon after the run.

### How To Use

1. Find a place on Instagram (tap the location on any post) and copy its link, or its ID.
2. Add one or more places to `startUrls`.
3. Set `resultsLimit` to how many posts you need for each.
4. Run the actor and open the Posts & reels and Places tables, or export them as JSON, CSV or Excel, or read them through the Apify API.

### Pricing

This actor uses pay-per-event pricing, so you only pay for results you receive:

- **Place** — charged once for each place saved to your dataset.
- **Post** — charged once for each post or reel saved to your dataset.
- **Actor start** — a small fixed fee of $0.001 per run.

Places that can't be found are not charged. Platform usage is included in these prices. Current prices for each Apify plan are shown on the actor's Pricing tab.

#### Free plan

On the Apify free plan, each run processes up to **2** places and up to **20** posts per place. Upgrade to a paid Apify plan to remove these limits.

### Best Practices

- Use specific places (a venue, park or neighbourhood) rather than a whole city: each place gives its own set of posts.
- Start with a small `resultsLimit` to check the output quickly.
- Run the actor on a schedule to keep collecting a busy place's newest posts over time.

### FAQ

#### How many posts can I get per place?

Instagram shows the public about 85 posts per place: roughly 60 of the most recent and 25 top posts. Older posts are only visible to logged-in users.

#### Can I search for a place by name?

Not yet. Place search needs an Instagram login. Open the place on Instagram and paste its link or ID instead.

#### Where do the address, phone and website come from?

Instagram's place pages carry no street address or website, even for logged-in users. The actor looks each venue up on Google Maps by its name at Instagram's exact pin, and keeps the result only when the name matches and the listing is right there; `googleMaps.distanceMeters` shows how close it is. When there is no confident match the fields stay empty rather than guessing.

#### Why do cities have no address?

Cities, regions and neighbourhoods are areas, not venues, so they get coordinates and category but no street address.

### Responsible Use

Use this actor only for publicly available content, and make sure your use complies with applicable laws (including data protection rules such as GDPR) and Instagram's terms. Avoid collecting personal data you don't need.

### Troubleshooting

- Check the run log: it names any place that could not be found.
- Make sure the link is a place link (`/explore/locations/...`) and not a profile or hashtag.
- Test with a small `resultsLimit` before large runs.

# Actor input Schema

## `startUrls` (type: `array`):

Enter one Instagram place per row: a place link such as `https://www.instagram.com/explore/locations/213131048/berlin-germany/`, or just its ID (`213131048`).

Open a place on Instagram (tap the location on any post) to find its link.

## `resultsLimit` (type: `integer`):

How many posts to collect for **each place**.

Instagram shows the public around 85 posts per place (about 60 recent and 25 top). Set 0 to collect place details only.

## `onlyPostsNewerThan` (type: `string`):

Skip posts published before this date, for example `2026-09-01` or `7 days`.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.instagram.com/explore/locations/213131048/berlin-germany/",
    "213385402"
  ],
  "resultsLimit": 100
}
```

# Actor output Schema

## `posts` (type: `string`):

No description

## `places` (type: `string`):

No description

# 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 = {
    "startUrls": [
        "https://www.instagram.com/explore/locations/213131048/berlin-germany/",
        "213385402"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("calm_builder/instagram-location-scraper").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 = { "startUrls": [
        "https://www.instagram.com/explore/locations/213131048/berlin-germany/",
        "213385402",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("calm_builder/instagram-location-scraper").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 '{
  "startUrls": [
    "https://www.instagram.com/explore/locations/213131048/berlin-germany/",
    "213385402"
  ]
}' |
apify call calm_builder/instagram-location-scraper --silent --output-dataset

```

## MCP server setup

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

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/KB5jAuWQ1OA3GcoyI/builds/LxYl8G5A2gCOEyc2Z/openapi.json
