Instagram Location Scraper - Posts by Place, $0.40/1k
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
12 hours ago
Last modified
Categories
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
sessionidcookies, 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
sessionidcookies 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.
⚠️ Requires a logged-in sessionid cookie
Instagram gates location feeds behind a login. Get the cookie (1 min): log in to instagram.com on a throwaway account → F12 → 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
| Mode | Input | Returns |
|---|---|---|
| Location ID | locationIds (e.g. 212988663) | Top & recent posts at that place |
| Location URL | startUrls — /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-accountsessionidcookies, one per line. Leave empty for a free, labeled sample post that shows the output shape.resultsLimit— max posts to return (default50, up to2000). 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
locationIdson 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
| Run | Posts returned | Cost |
|---|---|---|
| Free preview (no cookie) | 1 labeled sample | $0.001 |
| One location, default limit | 50 | $0.021 |
| Five locations × 200 | 1,000 | $0.401 |
| Blocked / no results | 0 | $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
sessionCookiesyou 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
sessionidyou 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.
likesCountcan benull. Instagram hides like counts on some posts and for some viewers. Comment counts are more consistently present.- Media URLs expire.
displayUrl,videoUrlandimagesare 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_LIMITEDdiagnostic 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.