Instagram Location Scraper - Place Details avatar

Instagram Location Scraper - Place Details

Pricing

Pay per usage

Go to Apify Store
Instagram Location Scraper - Place Details

Instagram Location Scraper - Place Details

Instagram Location Scraper extracts data from Instagram location pages: captions, media URLs, timestamps, geotags, user handles, hashtags, and engagement metrics. Ideal for local trend analysis, market research, venue monitoring, and automating location-based social data pipelines at scale for teams

Pricing

Pay per usage

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

1

Bookmarked

11

Total users

0

Monthly active users

3 days ago

Last modified

Share

Instagram Location Scraper — Venue Details, Address and Phone

Instagram Location Scraper - Place Details collects Instagram posts tagged at a location and attaches the venue's own metadata to every row: street address, city, zip, phone, website, category, the total number of posts ever tagged there, and the linked Facebook Places ID. Feed it a location URL, a username, or a plain keyword — it auto-detects the input type — and get back typed JSON: post captions, engagement, media, owner details, and the place record itself. Built for local-market researchers, franchise site scouts, and OSINT analysts who need to know not just what was posted at a venue, but what the venue actually is.

The honest limit, up front: locationDetails.address and .city populate for many venues. .phone, .website, .category and .zip are best-effort — Instagram only fills them when the location has a linked Facebook Page, so they come back null often. Nothing is guessed or faked to fill the gap.

What is Instagram Location Scraper - Place Details?

It is an Apify Actor that scrapes Instagram's location pages for tagged posts and, in the same run, pulls the venue's own place-details record from Instagram's authenticated venue-metadata endpoint. Every post row carries both: the post itself, and the place it was tagged at. Output is typed, normalized JSON.

An Instagram session is required in practice — see Input below for what that means precisely.

Key features:

  • 📍 Three ways to point it at a place — a full location URL, an Instagram username (locations tagged in that account's posts), or a plain keyword (place-name search) — the input type is detected automatically
  • 🏢 Venue place details on every post — address, city, zip, phone, website, category, via enrichLocation
  • 🔢 Venue-wide activity signallocationPostCount, the total posts ever tagged at that place, independent of how many you actually scrape this run
  • 🔗 Facebook Places linkagefacebookPlacesId and facebookSource when the location is backed by a Facebook Place
  • Absolute or relative date filtering — a fixed YYYY-MM-DD range, or a rolling window in days/weeks/months/years
  • Full post media — image, video (with duration), and attached audio/original-sound metadata

What data can I extract with Instagram Location Scraper - Place Details?

Every dataset row is one Instagram post, carrying both the post's own fields and the venue record it was tagged at.

FieldExample ValueUse Case
type"post"Record-type tag for mixed exports
id"3789234567890123456"Unique post identifier for de-duplication
code"DSPxYzAbCdE"Instagram shortcode, used to build the post URL
url"https://www.instagram.com/p/DSPxYzAbCdE/"Direct link back to the post
createdAt"2026-07-20T14:32:00Z"Publish timestamp — drives the date filter and trend analysis
likeCount847Engagement signal; null when includeEngagement is off
commentCount23Engagement signal; null when includeEngagement is off
caption"Great sunset from the rooftop tonight"Text for keyword and hashtag mining
isAvailabletrueAlways true in current output — a row only exists for a post that resolved
isLikeAndViewCountsDisabledfalseWhether the owner hid engagement counts
isPinnedfalseWhether the post is pinned on the location page
isPaidPartnershipfalseBranded-content flag, useful for sponsorship research
isCarouselfalseMulti-image/video post flag
isVideotrueVideo post flag — gates the video block
owner{ "id": "9876543210", "username": "cityexplorer_nyc", "fullName": "...", "profilePicUrl": "...", "isPrivate": false, "isVerified": false }Post author identity; null if Instagram returned no owner node
location{ "id": "213131048", "name": "Sky Lounge Downtown", "city": "Berlin", "lat": 52.52, "lng": 13.405 }The tagged location as embedded on the post itself
locationDetails{ "address": null, "city": "London, United Kingdom", "zip": null, "phone": null, "website": "http://www.walklondon.com/...", "category": "Landmark & Historical Place" }Venue place-details enrichment (enrichLocation)
locationPostCount2347Total posts ever tagged at this venue (includeLocationPostCount)
facebookPlacesId"111175118906315"Linked Facebook Places identifier (includeFacebookPlace)
facebookSource"facebook_places""facebook_places" when Facebook-Places-backed, else null
video{ "id": "video_3789234567890123456", "url": "...", "width": 1080, "height": 1920, "duration": 12.34 }Highest-resolution video variant; null if not a video
image{ "url": "...", "width": 1080, "height": 1350 }Highest-resolution image variant; null if not present
audio{ "id": "audio_98765", "title": "Original audio", "artist": "cityexplorer_nyc", "coverArt": "...", "duration": 12340, "audioUrl": "..." }Attached music or original-sound track; null if none

Venue place-details fields

locationDetails, locationPostCount, facebookPlacesId and facebookSource are the four keys that make this variant a venue record, not just a post feed. They come from Instagram's own authenticated venue-metadata endpoint, fetched once per unique location and merged onto every post from that place. address and city populate for many venues. phone, website, category and zip are best-effort — Instagram only fills them from the venue's linked Facebook Page, so they arrive null for venues without one, and that null is real, not a scrape failure. locationPostCount is a reliable "how busy is this place" total drawn straight from Instagram's location metadata, distinct from however many posts maxItems actually let you save this run.

Post-level targeting and temporal fields

createdAt plus dateFilterType (with its paired absoluteStartDate/absoluteEndDate or relativeValue/relativeUnit) are what you filter posts on — they narrow which posts from a location make it into the run without touching which venue gets scraped. maxItems is the volume control per run, separate from locationPostCount, which reports the venue's real lifetime total regardless of what you cap this run at.

Why not build this yourself?

No public Instagram or Facebook API hands a third party an arbitrary location's tagged-post feed enriched with the venue's own place details — the Instagram Graph API only reaches content tied to Business/Creator accounts connected through Login, not open location browsing, and there is no public endpoint that returns venue address, phone, category and Facebook Places linkage for a location you don't own. Building this yourself means reverse-engineering it end to end.

In practice that means: extracting the private GraphQL doc_id for the location-posts query by parsing Instagram's bundled JavaScript for a specific internal operation name, scraping a CSRF token out of the page HTML, assembling cursor-paginated GraphQL requests against instagram.com/graphql/query, and separately calling the authenticated api/v1/locations/web_info/ endpoint for venue metadata — which needs its own warm-up page load first so Instagram seeds the cookies the JSON call depends on. Both calls are login-walled: without a valid sessionid cookie, the post query typically comes back with no usable edges and the venue endpoint 302s straight to the login page. On top of that sits retry logic with exponential backoff and a proxy escalation ladder (no proxy → datacenter → sticky residential) for when Instagram blocks a request outright.

Use the official Instagram/Facebook surfaces when you manage the account and location yourself. Use this Actor when you need tagged posts and venue metadata for locations you do not control.

How to use data extracted from Instagram location posts?

📍 Local-market researchers and site scouts

Point startUrls at every candidate venue or neighborhood location URL, turn on enrichLocation and includeLocationPostCount, and compare locationDetails.category, locationPostCount, and recent caption/likeCount activity across the shortlist to see which venues actually draw foot traffic and content before committing to a location decision.

🏢 Agencies auditing venues for clients

Run the same list of client and competitor venues on a schedule, holding dateFilterType: "relative" with a fixed relativeValue/relativeUnit window each time, and diff locationPostCount and engagement week over week to show a client whether tagged activity at their venue is growing relative to the competitor set.

📊 Market research and intelligence

Feed a keyword (a city or district name) into startUrls, let the Actor auto-detect it as a location search, and aggregate locationDetails.category across the returned venues to map category density in that area — useful for expansion research where the question is "what kinds of places already cluster here."

🤖 AI agents and automated pipelines

An agent tool that takes a location URL or venue name and returns structured locationDetails plus recent tagged posts can answer "what is this place and what's being said about it right now" directly from live data, without a separate venue-lookup and post-search step.

⬇️ Input

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarrayInstagram location URLs, usernames, or keywords to scrape. Examples: 'https://www.instagram.com/explore/locations/213131048/berlin-germany/' (URL), 'mrbeast' (username), 'berlin' (keyword). Input type is detected automatically.["https://www.instagram.com/explore/locations/213131048/berlin-germany/"]
enrichLocationNobooleanAdd a locationDetails object to every post: address, city, zip, phone, website, and category. address/city populate for many venues; phone/website/category/zip are best-effort and are null when Instagram has no linked Facebook Page data. Default true.true
includeLocationPostCountNobooleanAdd locationPostCount: the total number of Instagram posts tagged at this venue (how busy the place is). Default true.true
includeFacebookPlaceNobooleanAdd facebookPlacesId (the linked Facebook Places identifier, when present) and facebookSource (set to 'facebook_places' when the venue is Facebook-Places-backed, else null). Default true.true
maxItemsNointegerMaximum number of posts to extract per run (0 for unlimited). Minimum 0. Default 20.50
sessionIdNo (see note)stringInstagram sessionid cookie value. Required in practice: logged-out location posts and venue place details are login-walled. Copy it from your browser cookies while logged into Instagram."58012345678%3A..."
proxyConfigurationNoobjectProxy settings. If Instagram rejects the proxy, a residential proxy is used as a fallback.{ "useApifyProxy": true }
dateFilterTypeNostringChoose whether to filter posts by an absolute date range or a relative time window. Enum: "absolute", "relative". Default "relative"."relative"
absoluteStartDateNostringStart date in YYYY-MM-DD format. Used when Date Filter Mode is 'absolute'. Default ""."2026-06-01"
absoluteEndDateNostringEnd date in YYYY-MM-DD format. Used when Date Filter Mode is 'absolute'. Leave empty for the current date. Default ""."2026-07-25"
relativeValueNointegerNumber of time units back from now. Used when Date Filter Mode is 'relative'. Set greater than 0 to enable filtering. Minimum 0. Default 0.30
relativeUnitNostringUnit of time for the relative window. Enum: "days", "weeks", "months", "years". Default "days"."days"
includeEngagementNobooleanInclude likeCount and commentCount on each post. Turn off to null both fields. Default true.true
includeVideoMetadataNobooleanInclude detailed video metadata (width, height, duration). Turn off to keep the video id and url only. Default true.true

Note on sessionId: the schema does not mark it required — only startUrls is in the required list — but the source's own behavior does. Without a valid sessionid cookie, the location-post GraphQL query typically returns no usable edges (Instagram raises "No session ID provided" or an authentication-related GraphQL error), and the separate venue-metadata endpoint (api/v1/locations/web_info/) redirects to login and silently returns all four enrichment fields as null. Treat sessionId as required for a real run.

Example input

{
"startUrls": ["https://www.instagram.com/explore/locations/213131048/berlin-germany/"],
"enrichLocation": true,
"includeLocationPostCount": true,
"includeFacebookPlace": true,
"maxItems": 50,
"sessionId": "YOUR_INSTAGRAM_SESSIONID_COOKIE",
"dateFilterType": "relative",
"relativeValue": 30,
"relativeUnit": "days",
"includeEngagement": true,
"includeVideoMetadata": true
}

Common pitfall: leaving sessionId empty. The run will not error out cleanly — it logs a warning, attempts the request anyway, and typically comes back with zero posts and an all-null locationDetails block rather than a hard failure. A second, quieter pitfall: setting dateFilterType: "relative" but leaving relativeValue at its default 0 — the filter stays inactive and every post is returned regardless of date, which the run log states explicitly but is easy to miss.

⬆️ Output

Typed, normalized JSON, one row per post, with the venue's place-details record merged onto each. Every key listed in the fields table above is present on every row — enrichment fields that are toggled off or unavailable come back as null, never as a missing key. Export as JSON, CSV or Excel, or read the dataset through the Apify API.

Example output

{
"type": "post",
"id": "3789234567890123456",
"code": "DSPxYzAbCdE",
"url": "https://www.instagram.com/p/DSPxYzAbCdE/",
"createdAt": "2026-07-20T14:32:00Z",
"likeCount": 847,
"commentCount": 23,
"caption": "Amazing sunset views from the rooftop tonight",
"isAvailable": true,
"isLikeAndViewCountsDisabled": false,
"isPinned": false,
"isPaidPartnership": false,
"isCarousel": false,
"isVideo": true,
"owner": {
"id": "9876543210",
"username": "cityexplorer_nyc",
"fullName": "Sarah Mitchell",
"profilePicUrl": "https://example.com/profile.jpg",
"isPrivate": false,
"isVerified": false
},
"location": {
"id": "213131048",
"name": "Berlin, Germany",
"city": "Berlin",
"lat": 52.52,
"lng": 13.405
},
"locationDetails": {
"address": null,
"city": "London, United Kingdom",
"zip": null,
"phone": null,
"website": "http://www.walklondon.com/",
"category": "Landmark & Historical Place"
},
"locationPostCount": 2347,
"facebookPlacesId": "111175118906315",
"facebookSource": "facebook_places",
"video": {
"id": "video_3789234567890123456",
"url": "https://example.com/video.mp4",
"width": 1080,
"height": 1920,
"duration": 12.34
},
"image": {
"url": "https://example.com/image.jpg",
"width": 1080,
"height": 1350
},
"audio": {
"id": "audio_98765",
"title": "Original audio",
"artist": "cityexplorer_nyc",
"coverArt": "https://example.com/cover.jpg",
"duration": 12340,
"audioUrl": "https://example.com/audio.mp4"
}
}

How do you filter and target specific locations?

Location URL vs. username vs. keyword. A full /explore/locations/<id>/ URL is the most precise input — it names one exact venue with no ambiguity. A username instead searches that account's own posts for tagged locations, which surfaces places connected to that person or brand but depends on Instagram exposing location links on their profile HTML. A plain keyword (a place name or city) triggers Instagram's own location search, tried through several fallback strategies in sequence — it is the least deterministic of the three and can return zero or multiple candidate venues for an ambiguous name.

Date scope — one path at a time. dateFilterType switches between two mutually exclusive modes: "absolute" uses absoluteStartDate/absoluteEndDate (YYYY-MM-DD, end defaults to today if left blank); "relative" uses relativeValue + relativeUnit (days/weeks/months/years) as a rolling window ending now. Only the fields for the active mode do anything — a relativeValue of 0 (the default) leaves the relative filter inactive and returns every post regardless of date.

Volume and enrichment cost. maxItems caps posts per run (0 = unlimited); Instagram itself is paged internally in fixed batches under the hood. enrichLocation, includeLocationPostCount and includeFacebookPlace control how much venue metadata each post row carries — turn all three off for the leanest, fastest run when you only need the post feed.

Three targeting examples:

{ "startUrls": ["https://www.instagram.com/explore/locations/213131048/berlin-germany/"], "dateFilterType": "relative", "relativeValue": 7, "relativeUnit": "days" }
{ "startUrls": ["mrbeast"], "dateFilterType": "absolute", "absoluteStartDate": "2026-01-01", "absoluteEndDate": "2026-06-30" }
{ "startUrls": ["berlin"], "enrichLocation": false, "includeLocationPostCount": false, "includeFacebookPlace": false, "maxItems": 200 }

🔗 Want to try other Instagram scrapers?

Scraper NameWhat it extracts
Instagram Reels Hashtag ScraperReels tagged under a given hashtag
Instagram Brand Mention TrackerPosts and mentions of a brand or keyword
Instagram Followers Count ScraperFollower counts for Instagram profiles
Instagram Phone and Email Lead FinderContact details surfaced from Instagram profiles
Instagram Profile Engagement EstimatorEngagement estimates for Instagram profiles
Instagram Related Profile EnricherRelated/similar profile enrichment

How to extract Instagram location data programmatically

Instagram Location Scraper - Place Details runs on Apify. Start it from the Apify Console, or call it through the Apify API and apify_client — one authenticated request in, structured JSON dataset out.

Python example

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<YOUR_USERNAME>/instagram-location-scraper-place-details").call(run_input={
"startUrls": ["https://www.instagram.com/explore/locations/213131048/berlin-germany/"],
"sessionId": "<YOUR_INSTAGRAM_SESSIONID_COOKIE>",
"enrichLocation": True,
"maxItems": 100,
})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
details = post.get("locationDetails") or {}
print(post["caption"][:60], details.get("category"), post["locationPostCount"])

Export to spreadsheets or CRM

Download the dataset as CSV or Excel directly from the Apify Console, or pull it via the API. locationDetails.address, .city, .phone and .website map cleanly onto standard CRM address/contact columns; locationPostCount and facebookPlacesId work well as separate "venue activity" and "Facebook link" columns for lead or venue-tracking sheets.

Yes, for the public venue and post data this Actor collects. The primary record here is the location itself — address, city, category, total tagged-post count, and Facebook Places linkage are business/venue data, comparable to a business directory listing, not personal data. That places this squarely under terms-of-service and database-rights considerations rather than personal-data law: check Instagram's terms before large-scale reuse of collected venue records, and be mindful of database-right and unfair-competition rules if republishing a compiled set of venues as a competing directory.

Separately, the posts attached to each venue are authored by individual Instagram users — incidental content riding alongside the venue record, not this Actor's focus, but still personal data in a strict sense if you store captions or usernames in bulk. Consult legal counsel before any commercial application involving bulk storage of that post-level personal data.

❓ Frequently asked questions

What if a location has zero tagged posts?

The run returns zero rows for that location and moves on to the next startUrls entry — no placeholder or error row is written for an empty venue.

What if venue place details aren't available for a location?

locationDetails still appears on every post from that venue, but with some or all of address, city, zip, phone, website and category set to null. This happens when the location has no linked Facebook Page (Instagram simply has nothing to return), or when scraping ran without a valid sessionId, in which case the whole enrichment block comes back null. Nothing is inferred to fill the gap.

Can I get the venue's total tagged-post count along with its posts?

Yes — includeLocationPostCount (on by default) adds locationPostCount, the venue's lifetime tagged-post total from Instagram's own location metadata. It is independent of maxItems, which only caps how many of those posts this run actually saves.

How accurate is the venue address and phone data?

The Actor returns exactly what Instagram's venue-metadata endpoint reports at request time, sourced from the location's linked Facebook Page when one exists. address and city populate for many venues; phone, website, category and zip are best-effort and frequently null for venues with no linked Facebook Page — that null reflects an actual data gap, not a scrape failure. Validate before using contact fields for outreach.

How many posts can I get per run?

maxItems controls it directly — set it to 0 for unlimited, or any positive integer to cap the total across all startUrls entries. Default is 20. No additional cap is imposed by the Actor itself.

Do I need to provide a session ID?

The input schema does not mark sessionId as required, but in practice it is. Without a valid Instagram sessionid cookie, location posts typically come back empty and venue place details come back all-null, because both the post feed and the venue-metadata endpoint are login-walled on Instagram's side.

Can I search by keyword or username instead of a location URL?

Yes. startUrls accepts any mix of location URLs, Instagram usernames, or plain keywords in the same run — the Actor detects which one each entry is automatically. A username pulls locations tagged in that account's own posts; a keyword runs a place-name search.

What happens to posts outside my date filter?

They are excluded from the output and counted only in the run log, not written to the dataset — so a narrow date window reduces your row count without producing empty or placeholder rows.

Does Instagram Location Scraper - Place Details work with Claude, ChatGPT, and AI agent frameworks?

Yes. It is callable as a standard HTTP endpoint through the Apify API, so any agent framework that can make a request — LangChain, CrewAI, a custom tool definition — can invoke it and receive typed JSON directly.

How does Instagram Location Scraper - Place Details compare to other Instagram location scrapers?

Checked on the Apify Store on 2026-07-26: apidojo/instagram-location-scraper documents no login requirement and a location object limited to id, name, city, lat and lng — no venue address, phone, category or Facebook Places linkage. dami_studio/instagram-location-scraper requires a sessionid cookie like this Actor and adds diagnostic rows for blocked/rate-limited runs, but its documented output has no venue place-details block either. patient_discovery/instagram-location-posts advertises cookieless operation and includes a location address field sourced from the post node itself, but does not document venue phone, website, category, a venue-wide post-count total, or Facebook Places linkage. None of the three document the combination this Actor does: address/city/zip/phone/website/category, a venue-wide locationPostCount, and a facebookPlacesId/facebookSource pair, all merged onto every post row.

Can I use Instagram Location Scraper - Place Details without an Instagram API key or developer account?

Yes — no Instagram Graph API key or Facebook developer account is needed. What you supply instead is an Instagram sessionid cookie value (copied from a logged-in browser session) and your Apify token to run the Actor.

Conclusion

Instagram Location Scraper - Place Details turns a location URL, username, or keyword into both a tagged-post feed and the venue record behind it — address, city, category, total tagged-post count, and Facebook Places linkage, honestly nulled where Instagram itself has nothing to report. It is built for researchers, agencies, and pipelines that need to know the place, not just the posts. Start it from the Apify Console with a location URL and your Instagram session ID to see the full row shape on your first run.