Instagram Location Scraper
Scrape Instagram posts by location ID or URL: captions, likes, comments, media URLs, hashtags, owner and timestamp. No login. $0.40 per 1,000 posts.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
locationIds,startUrls,resultsLimit(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0004 per result = $0.4 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Result returned | Charged per post returned. Failed/empty runs not charged. | $0.0004 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-04, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
locationIds | Instagram location/place ids (number in /explore/locations/{id}/). | array |
startUrls | Or /explore/locations/{id}/ URLs. | array |
resultsLimit | Hard cap on posts returned for each location. You are charged per post, so this is also your budget for the run. | integer |
notionConnector | Optional Notion delivery. | string |
notionParentId | Optional Notion data-source id. | string |
sessionCookies | Optional, and normally not needed, runs work with no cookie at all. Supply your own Instagram account cookie here to run on your own account, and to reach feeds that need a signed-in visitor. In Chrome: F12 -> Application -> Cookies -> https://www.instagram.com -> copy the sessionid value. Use an account you own and are authorized to automate. Cookie values are never logged or written to output. Prefer a throwaway account over your main one. | array |
What you get
A structured dataset — each result includes fields like:
ownerUsernamecaptionlikesCountcommentsCounturlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
5 ready-to-run use cases
Bondi Beach Instagram Posts from the Location Page
Public bondi beach instagram posts from any place URL you paste: caption, likes, comment count, media URLs, owner, timestamp. Comment text is not returned.
Disneyland Instagram Posts, Scraped by Location Tag
Public disneyland instagram posts from the tagged place: caption, likes, comment count, media URLs, owner and timestamp. No login. Comment text excluded.
Eiffel Tower Instagram Posts, Scraped by Location
Public eiffel tower instagram posts by place tag: caption, likes, comment count, media URLs, owner and timestamp. No login. Comment text is not returned.
Santorini Instagram Posts, Scraped by Location Tag
Public santorini instagram posts from the tagged place: caption, likes, comment count, media URLs, owner and timestamp. No login. Comment text excluded.
Times Square Instagram Posts, Scraped by Location
Public times square instagram posts by place tag: caption, likes, comment count, image and video URLs, owner and timestamp. No login. Comment text excluded.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Instagram Location Scraper: posts tagged at a place, by location ID
Give it an Instagram place id and get the posts tagged there as rows. Caption, like and comment counts, image and video links, the owner, the timestamp, and the place id each row came from. A place page has a Top feed and a Recent feed holding different posts, and you get both.
Two things to know before you start. You need the numeric place id, the number in /explore/locations/<id>/, because there is no place search here. And a place feed is a sample, not an archive: about 70 posts per place is what the public tabs hand over, whatever you set the limit to.
| Input | Location IDs, or /explore/locations/ URLs |
| Output | One row per post |
| Ceiling | 2,000 posts per run |
| Account needed | None from you |
| Price | $0.40 per 1,000 posts, flat on every plan |
🔍 What Instagram Location Scraper does
You give it places, it returns what people tagged there. Photos, videos and carousels all come back in the same row shape, so you can drop the lot into a sheet without branching on type. Every row carries the locationId it came from, which keeps a multi-place run separable.
Nothing to log into. No cookie, no app review, no business API approval.
Finding the id takes ten seconds. Open the place on Instagram, look at the address bar, and take the number out of instagram.com/explore/locations/212988663/. Paste either the number or the whole URL, and you can mix the two in one run.
If you do have an Instagram cookie and would rather the run read through your own account, put it in sessionCookies. Most people never need to.
📥 What you give it
{
"locationIds": ["212988663"],
"resultsLimit": 50
}
| Field | Default | What it is |
|---|---|---|
locationIds | none | The number out of /explore/locations/<id>/. Numeric ids only. |
startUrls | none | Or paste the /explore/locations/… URLs. Either works, and you can mix them. |
resultsLimit | 50 | Posts for the whole run, not per place, 1 to 2,000. This is also your spend cap. |
sessionCookies | none | Optional. Your own Instagram sessionid, if you would rather the run read through your account. |
proxyConfiguration | Apify default | Leave it alone. Put servers of your own in proxyUrls inside it if you have them. |
notionConnector, notionParentId | none | Optional. Write each post into a Notion data source as well as the dataset. |
Give it at least one place. A run with nothing in either field fails rather than returning an empty dataset. An entry that is not a number is dropped, so check your list if a place you expected is missing.
When you name several places, the run fills them in order until resultsLimit is spent. Put the one you care about most first.
📤 What you get back
A real row from a recent run, with the caption cut short and the long image links trimmed:
{
"ok": true,
"type": "carousel",
"shortCode": "DdfxNBIjQer",
"url": "https://www.instagram.com/p/DdfxNBIjQer/",
"caption": "If you haven’t seen Garry Starr in “Classic Penguins” drop everything and get tickets for the performance at the Second Stage theater in Manhattan. ...",
"hashtags": [],
"mentions": [],
"likesCount": 1,
"commentsCount": 0,
"videoViewCount": null,
"displayUrl": "https://scontent-dfw5-1.cdninstagram.com/v/t39.30808-6/...",
"videoUrl": null,
"images": [
"https://scontent-dfw5-1.cdninstagram.com/v/t39.30808-6/...",
"https://scontent-dfw5-2.cdninstagram.com/v/t39.30808-6/..."
],
"isVideo": false,
"dimensions": {"height": 2048, "width": 1536},
"ownerUsername": "carballodieguez",
"ownerId": "199258671",
"timestamp": "2026-09-20T04:51:32.000Z",
"accessibilityCaption": null,
"locationId": "212988663"
}
| Field | What it is |
|---|---|
type | image, video or carousel. |
locationId | Which of your places produced this row. |
shortCode | Unique per post. Use it as your dedupe key across runs. |
images | Every frame of a carousel, largest version. A single photo gives you one entry. |
hashtags, mentions | Parsed out of the caption for you, without the # or @. |
videoViewCount, videoUrl | null on stills, as above. |
displayUrl, images | Signed links that expire within hours. Download what you want to keep. |
Anything Instagram did not supply comes back null, as accessibilityCaption does above. Nothing is guessed or padded.
🧾 Reading the output
Two kinds of row land in your dataset, and only the first kind is billed.
| Row | How to spot it | Billed |
|---|---|---|
| A post | ok: true and a shortCode | yes |
| A diagnostic | ok: false and a code | no |
Filter on ok == true and you have your posts.
| Code | What it means |
|---|---|
NO_RESULTS | The place resolved and both tabs came back empty. New or very quiet places do this. |
BLOCKED | The place could not be read this time. If you supplied a cookie, check it is still valid. |
A diagnostic row does not fail the run and is never billed as a post. Empty input is the one case that does end the run, and it ends it straight away rather than after any work.
▶️ How to run it
1. Open the place on Instagram and copy the number out of instagram.com/explore/locations/<id>/. 2. Open Instagram Location Scraper and click Try for free. 3. Paste the number into Location IDs, or the whole URL into Location URLs. 4. Set Max posts. Start at 20 while you look at the output shape. 5. Click Start, then download the dataset as JSON, CSV or Excel.
💰 How much does it cost?
$0.40 per 1,000 posts. Flat on every Apify plan, no volume tiers.
You pay per post delivered. A place that returns nothing is not billed for results, and diagnostic rows are not billed either.
💡 What people use it for
- Seeing what guests actually photograph at a venue before writing the brief for a shoot there.
- Finding local creators who post at a place regularly, then approaching them directly.
- Checking what a neighbourhood, festival or stadium looks like through its visitors' cameras.
- Collecting tagged posts around an event as a record, since place feeds move on quickly.
🚧 What it does not do
- No place search. You bring the numeric id. There is no lookup from a place name here.
- About 70 posts per place is what the public tabs hand over. Setting the limit higher does not
reach further in.
- A place feed is a sample. Instagram decides what sits in Top and Recent, so you get a slice
rather than everything ever tagged there.
resultsLimitis for the whole run, not per place, so several places share it.- A non-numeric entry is dropped without a row of its own.
- No private accounts, and no stories or highlights.
- Media links expire within hours. Download what you want to keep.
- An empty run fails rather than returning an empty dataset. Give it at least one place.
🧭 Which Instagram scraper do you need?
| If you want | Use |
|---|---|
| Posts tagged at a place | This one |
| Posts under a hashtag | Instagram Hashtag Scraper |
| Everything one profile has posted | Instagram Profile Scraper |
| One post or reel you have the link for | Instagram Post Scraper |
| Comments under a post | Instagram Comments Scraper |
❓ Questions people ask
Where do I find the location ID? In the address bar. Open the place on Instagram and take the number out of /explore/locations/<id>/.
Can I search for a place by name? Not here. This takes ids and URLs.
Do I need an Instagram account? No. The cookie field is optional.
Why did I get fewer posts than I asked for? Because the place had fewer available. The public tabs hold roughly 70 posts per place, and you are only billed for what arrived.
Is resultsLimit per place or per run? Per run. Ask for 100 across three places and you get 100 posts in total, not 300.
Is scraping Instagram legal? This reads public posts only, never private accounts or messages. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the location ID you used and the run ID. The code on the diagnostic row usually explains it on its own.