Instagram Location Scraper - Posts by Place, $0.40/1k avatar

Instagram Location Scraper - Posts by Place, $0.40/1k

Pricing

Pay per event

Go to Apify Store
Instagram Location Scraper - Posts by Place, $0.40/1k

Instagram Location Scraper - Posts by Place, $0.40/1k

Own any place on the map. Feed it location IDs or /explore/locations/ URLs and get the top and recent posts per place: caption, likes, comments, media URLs, hashtags, owner and timestamp. $0.40 per 1,000 posts plus a $0.001 start fee - the lowest of any active Instagram location scraper.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

12 hours ago

Last modified

Share

⚡ Instagram Location Scraper — Posts by Place

Scrape Instagram posts by location/place at the cheapest per-post rate on the market. Give it location IDs or /explore/locations/<id>/ URLs and get back the top & recent posts for each place: caption, likes, comments, media URLs, owner, hashtags, mentions and timestamp. Export to JSON, CSV or Excel, call it from the API, or have every run delivered straight to Notion. $0.40 per 1,000 posts plus a $0.001 run-start fee — built for local lead gen, event coverage, geo-trend tracking and market research.

Instagram location feeds are login-gated — there is no logged-out endpoint that returns them. This Actor works from your own throwaway sessionid cookies, rotating between them and hopping exit addresses when Instagram pushes back. Run it with no cookie and it returns one clearly-labeled SAMPLE post (free) so you can preview the exact output shape before you add a session.

Why this scraper

  • 💸 The cheapest Instagram location scraper on the market — $0.40 / 1,000 posts plus $0.001 per run start, billed per post actually returned. Flat rate: no volume tiers, no plan gates, no minimum spend.
  • 🔁 Account + IP rotation built in — paste a few throwaway sessionid cookies and the Actor cycles through them, moving to a fresh rotating exit address whenever a request is rate-limited.
  • 🧹 Clean, flat records — one tidy object per post, ready for sheets, dashboards or LLM pipelines. No nested GraphQL soup to unpack.
  • 📬 Built-in Notion delivery — push every run into Notion via Apify connectors, zero extra code.
  • 🚦 Honest errors — a clear diagnostic row (BLOCKED, RATE_LIMITED, NO_RESULTS) instead of silent emptiness, and those rows are never charged.

Instagram gates location feeds behind a login. Get the cookie (1 min): log in to instagram.com on a throwaway accountF12 → Application → Cookies → copy the sessionid value → paste it into sessionCookies (one per line). Add a few accounts for more throughput; the Actor rotates between them automatically and skips any cookie that comes back dead.

What you can scrape

ModeInputReturns
Location IDlocationIds (e.g. 212988663)Top & recent posts at that place
Location URLstartUrls/explore/locations/<id>/Same, ID parsed from the URL

Input

  • locationIds — Instagram location/place IDs (the number in /explore/locations/<id>/).
  • startUrls — or paste full /explore/locations/<id>/ URLs instead.
  • sessionCookies (required for real data) — one or more throwaway-account sessionid cookies, one per line. Leave empty for a free, labeled sample post that shows the output shape.
  • resultsLimit — max posts to return (default 50, up to 2000). You pay per post.
  • proxyConfiguration — preconfigured; leave as is unless you have your own proxy servers.
  • notionConnector / notionParentId — optional Notion delivery.

Input field names follow the conventions used across similar Actors, so switching to this one is usually a drop-in change — the same startUrls / resultsLimit / proxyConfiguration shape you already have in your scripts will run here unchanged.

Example input

{
"locationIds": ["212988663", "213385402"],
"startUrls": ["https://www.instagram.com/explore/locations/214335386/"],
"resultsLimit": 200,
"sessionCookies": [
"sessionid=12345%3AAbCdEf%3A12%3AAbCd...",
"sessionid=67890%3AGhIjKl%3A24%3AEfGh..."
]
}

Output (one record per post)

{
"type": "image",
"shortCode": "Cabc123XyZ",
"url": "https://www.instagram.com/p/Cabc123XyZ/",
"caption": "Sunset over the bay 🌅 #travel",
"hashtags": ["travel"],
"mentions": [],
"likesCount": 12840,
"commentsCount": 213,
"videoViewCount": null,
"displayUrl": "https://...jpg",
"videoUrl": null,
"images": ["https://...jpg"],
"isVideo": false,
"dimensions": { "height": 1080, "width": 1080 },
"ownerUsername": "someaccount",
"ownerId": "123456789",
"timestamp": "2024-06-12T14:00:00.000Z",
"locationId": "212988663"
}

type is image, video or carousel. Video posts include videoUrl and videoViewCount; carousels list every frame in images. Every record carries the locationId it came from, so a multi-location run stays easy to group.

What people use it for

  • Local lead generation — pull the accounts posting from a venue, neighbourhood or trade-show hall, then filter by follower-ish signals (likes/comments) to find the people worth contacting.
  • Event coverage — scrape the venue's location page during and after an event to collect the user-generated content, photographers and hashtags around it.
  • Geo trend tracking — run the same set of locationIds on a schedule and watch which places, captions and hashtags are climbing.
  • Hospitality & retail research — see what customers actually post at a restaurant, hotel or store, not what the brand posts about itself.
  • Content sourcing — collect media URLs and owner handles at a place so you can ask permission to repost.

Pricing

$0.40 per 1,000 posts ($0.0004 each), plus $0.001 each time a run starts — the lowest per-post price on the market for Instagram location scraping.

Flat rate — no volume tiers, no plan gates — and you are only charged for posts actually returned. Sample rows, diagnostic rows, duplicates and no-result runs cost only the start fee.

Worked examples

RunPosts returnedCost
Free preview (no cookie)1 labeled sample$0.001
One location, default limit50$0.021
Five locations × 2001,000$0.401
Blocked / no results0$0.001

Running it on a schedule or from code

The Actor is a normal Apify Actor, so anything the platform offers works: Schedules for a daily geo sweep, Webhooks to fire when a run finishes, and the API to start runs from your own backend.

curl -X POST "https://api.apify.com/v2/acts/Dami_Studio~instagram-location-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"locationIds":["212988663"],"resultsLimit":100,"sessionCookies":["sessionid=..."]}'

Results land in the run's dataset and can be pulled as JSON, CSV, Excel, XML or RSS from the dataset items endpoint, or pushed straight into Notion with the optional connector inputs.

Limitations — read these before you buy

  • A session cookie is mandatory for real data. Without sessionCookies you get exactly one labeled, free sample row. There is no keyless path to Instagram location feeds; anyone claiming otherwise is scraping something else.
  • Cookie lifetime is not under our control. Instagram invalidates sessions on its own schedule, especially for accounts that suddenly read a lot. Expect to refresh throwaway cookies periodically; supply several so one death does not stop a run.
  • Use throwaway accounts only. Automated reading can get an account rate-limited or checkpointed. Never paste a sessionid you care about.
  • Depth is capped by Instagram, not by us. Location feeds paginate a limited way back; asking for 2,000 posts at a small, quiet place will simply return everything available and stop, which is usually far fewer.
  • likesCount can be null. Instagram hides like counts on some posts and for some viewers. Comment counts are more consistently present.
  • Media URLs expire. displayUrl, videoUrl and images are signed CDN links that stop working after a while — download what you need soon after the run.
  • Private accounts are never included, and posts can disappear between the run and when you read the data.
  • Rate limits are real. Heavy concurrency against one place will produce RATE_LIMITED diagnostic rows rather than fabricated data. Add more cookies and lower the limit if you see them.
  • No comment text or follower counts. This Actor returns the location feed's post objects only; per-post comment threads and profile stats are a different job.

FAQ

Why do I need a cookie? Instagram location feeds require a logged-in session — there is no logged-out endpoint that returns them. You supply your own throwaway accounts, so nobody else's session is in the loop.

Is my main account at risk? Use a throwaway account, never your personal one. The Actor rotates between the cookies you give it and spreads requests across rotating exit addresses.

How do I find a location ID? Open the place on Instagram — the URL is /explore/locations/<id>/. That <id> is what goes in locationIds. You can also paste the whole URL into startUrls and let the Actor parse it.

Can I pass several locations at once? Yes. locationIds and startUrls are both lists and can be combined in one run; resultsLimit applies per location.

Do I need a proxy? No — proxying is preconfigured with rotating datacenter addresses. If you enter your own proxy servers they are used exactly as given.

I got a NO_RESULTS / BLOCKED row — why? That is the Actor telling you exactly what happened instead of failing silently. Those rows are free. Add more sessionCookies, lower resultsLimit, and re-run.

What happens on a failed run? Nothing beyond the start fee. Per-post charges only fire for genuine posts pushed to the dataset.

Billing

Two charges apply: a $0.001 run-start fee each time a run begins, and a $0.0004 per-post fee for posts actually delivered. Samples, diagnostics, duplicates, blocked look-ups and no-result runs never incur the per-post fee — a run that returns nothing costs only the $0.001 start fee.