Instagram Location Scraper avatar

Instagram Location Scraper

Pricing

$14.99/month + usage

Go to Apify Store
Instagram Location Scraper

Instagram Location Scraper

Scrapes posts from any Instagram location page, capturing images, videos, captions, timestamps, usernames, hashtags, engagement metrics, and post URLs. Ideal for local market research, trend analysis, competitor insights, and automated geo-based Instagram data extraction

Pricing

$14.99/month + usage

Rating

0.0

(0)

Developer

Scrapio

Scrapio

Maintained by Community

Actor stats

1

Bookmarked

66

Total users

4

Monthly active users

7 days ago

Last modified

Share

Instagram Location Scraper — Extract Posts, Owners and Place Data

Instagram Location Scraper turns any Instagram location page, username, or place keyword into structured post data — no browser, no manual scrolling, no HTML to parse. Every result returns a post's caption, engagement counts and media, plus two embedded entities: the poster's public profile and the tagged place itself, all as typed JSON ready for a database, spreadsheet, or LLM context window. It runs on Apify with pay-per-result pricing, needs an Instagram session cookie to return real results, and ships a residential-proxy fallback path, absolute or relative date filtering, and field-level toggles for engagement and video metadata. This guide documents every input, every output field, and how teams actually deploy it.

What Does Instagram Location Scraper Do?

Instagram Location Scraper is an Apify Actor that fetches the posts shown on an Instagram location page — the same feed a browser shows on a location's Recent or Top tab — and returns each one as a normalized JSON row with its poster and its place attached. It accepts three input forms per line: a direct location URL, an Instagram username (from which it discovers the locations tagged in that user's recent posts), or a free-text place keyword (resolved to a matching location through Instagram's own search). An Instagram sessionId cookie is required in practice — the source raises an explicit error when the location query comes back with no posts and no cookie was supplied.

  • Accepts location URLs, usernames, or free-text place keywords, auto-detecting which one you pasted
  • Returns post-level fields: caption, like/comment counts, media-type flags, paid-partnership and pinned flags
  • Embeds the tagged place (id, name, city, latitude/longitude) on every post
  • Embeds the poster's public profile (id, username, full name, avatar, private/verified flags) on every post
  • Extracts the highest-resolution image or video variant Instagram serves, plus audio/music metadata when present
  • Filters posts to an absolute date range or a relative "last N days/weeks/months/years" window
  • Lets you drop engagement counts or detailed video metadata field-by-field without changing what gets scraped

Features & Capabilities

Three things make up this Actor: what it scrapes per post, how the sort/date/toggle inputs shape each row, and how it holds up against the two closest Actors on the Apify Store.

Core features

  • Auto-detects input type. startUrls accepts a location URL (matched on /locations/), a bare username, or a keyword, and each is routed to a different resolver inside convert_input_to_location_urls().
  • Keyword resolution runs a fallback chain. A keyword is tried against Instagram's topsearch GraphQL endpoint, then a context-less retry of the same endpoint, then a hashtag-page HTML scrape, then a small hardcoded lookup table before giving up — only berlin is populated in that lookup table today.
  • Username resolution scrapes the profile page itself for /explore/locations/ links embedded in that user's recent posts, rather than calling a documented endpoint.
  • Derived boolean flags on every postisCarousel, isVideo, isPaidPartnership, isPinned and isLikeAndViewCountsDisabled — computed from Instagram's raw media_type, carousel_media, pinned_for_users and is_paid_partnership values.
  • Media is collapsed to the best variant. video and image return the single highest-resolution version (max(..., key=width*height)), not Instagram's full list of resolutions.
  • includeEngagement and includeVideoMetadata are opt-out toggles. Turning either off nulls the corresponding fields after extraction — the underlying request and post count are unchanged either way.

How Instagram Location Scraper compares to other Instagram location scrapers

FeatureInstagram Location Scraperapidojo/instagram-location-scraperlouisdeconinck/instagram-location-posts-scraper
Output formatTyped JSON datasetTyped JSON datasetTyped JSON dataset
Input typesLocation URL, username, or keyword — auto-detectedLocation URLs or location IDs (separate fields)Location URLs or location IDs
Date filteringAbsolute range or relative "last N" windowSingle until dateNot documented
Field-level opt-outsincludeEngagement, includeVideoMetadata togglesNot documentedNot documented
Login requirementSession cookie required to return posts"No Authentication needed" per listingNot documented
Owner/place normalizationowner and location returned as nested objectsowner and location returned as nested objects, plus coownersRaw user/location sub-objects passed through largely unmodified

Facts on the two competing Actors are as observed on their Apify Store listings on 26 July 2026. If your use case is feeding structured data into an LLM, the output-format row is the least interesting one — all three return JSON. The input-flexibility and field-toggle rows are the real difference: this Actor is the only one of the three that takes a bare username or keyword and resolves it to a location on its own.

When another tool might suit you better

apidojo/instagram-location-scraper documents no-authentication access and high published run volume — if you need best-effort location posts without ever supplying a session cookie, and you don't need place or owner data broken into clean nested objects, it may be the simpler starting point. louisdeconinck/instagram-location-stats-scraper is the better fit if what you actually need is one aggregate profile per location — media count, business hours, price range — rather than the individual posts themselves; this Actor does not return that aggregate view at all.

Instagram Location Scraper within the Scrapio data stack

Instagram Location Scraper covers location-tagged posts, their embedded place data, and the poster's profile. For hashtag-level analytics instead of a single place, use Instagram Hashtag Analytics Scraper. For sentiment on the comments attached to a post, use Instagram Comment Sentiment Scraper. For a bulk status check across many usernames, use Instagram Profile Bulk Status Checker. For discovering creators by niche keyword instead of by place, use Instagram Influencer Finder by Keyword.

Why do developers and data teams scrape Instagram location data?

Location-tagged Instagram posts carry activity signal — who's posting from a place, how much engagement it's drawing, whether the content is organic or sponsored — that doesn't exist in structured form anywhere else for most venues and neighborhoods.

🏢 Local marketing and tourism teams

A destination marketer or venue owner pastes a city, landmark, or venue's location URL into startUrls, sets sortOrder to recent or ranked, and reads back caption, likeCount, commentCount and owner.username for every geotagged post at that place. isPaidPartnership separates organic geotags from sponsored posts, and location.name/location.city confirm exactly which place resolved from a keyword search. Because dateFilterType supports a relative window, the same run can repeat weekly to track fresh activity at a venue without re-specifying an absolute date range each time.

📊 AI training data and RAG indexing

caption is the highest-information free-text field here, and it arrives already separated from Instagram's raw JSON wrapper rather than needing an HTML strip. For RAG enrichment, index caption alongside location.name and location.city so an agent can answer "what are people posting from this place" against live geotagged content. For training data, the boolean flags (isVideo, isCarousel, isPaidPartnership) and count fields (likeCount, commentCount) are consistently typed across every row and pair directly with caption for a supervised content-classification or engagement-prediction dataset.

📱 Competitive and market intelligence

Track likeCount, commentCount and owner.username for posts geotagged at a competitor's storefront, event venue, or pop-up location across repeated runs with sortOrder: "recent", to see who is posting from that location and how engagement is trending, without opening Instagram in a browser.

🔬 Research and academic use

Researchers studying geotagged social content, event-attendance signals, or location-based engagement patterns can build a dataset from public post, owner and place fields alone. This Actor returns only what Instagram already shows on a public location page — no private-account data, nothing behind a follow gate.

🎥 Product and SaaS development

Teams building a location-intelligence, event-monitoring, or social-listening product can use this Actor as the geotagged-content collection layer, feeding location, owner and engagement fields into their own scoring or mapping logic instead of building an Instagram location scraper from scratch.

🍚 Input Parameters

All twelve parameters, exactly as defined in .actor/input_schema.json. Only startUrls is required.

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarrayList of Instagram location URLs, usernames, or keywords. Examples: 'https://www.instagram.com/explore/locations/213131048/berlin-germany/' (URL), 'mrbeast' (username), 'berlin' (keyword).["https://www.instagram.com/explore/locations/213131048/berlin-germany/"]
maxItemsNointegerMaximum number of posts to extract (0 for unlimited). Minimum 0. Default 20.50
sessionIdNostringInstagram session ID cookie value (required for authentication). Get this from your browser cookies when logged into Instagram. Default ""."5951xxxxx%3Axxxxxxxxxxxxxx%3A..."
proxyConfigurationNoobjectChoose which proxies to use. If Instagram rejects the proxy, a residential proxy will be used as a fallback. Prefilled with {"useApifyProxy": false}.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}
dateFilterTypeNostring (enum)Select whether to use absolute date or relative time. One of absolute, relative. Default "relative"."relative"
absoluteStartDateNostringStart date in YYYY-MM-DD format. Use this when 'Posts newer than' is set to 'absolute'. Default ""."2026-01-01"
absoluteEndDateNostringEnd date in YYYY-MM-DD format. Use this when 'Posts newer than' is set to 'absolute'. Leave empty for current date. Default ""."2026-07-01"
relativeValueNointegerNumber of time units. Use this when 'Posts newer than' is set to 'relative'. Minimum 0. Default 0.30
relativeUnitNostring (enum)Unit of time for relative date. One of days, weeks, months, years. Default "days"."days"
sortOrderNostring (enum)How location posts are ordered. ranked returns Instagram's top posts tab; recent returns the most recent posts tab. Default "ranked"."recent"
includeEngagementNobooleanInclude engagement metrics (like count and comment count) on each post. Turn off to null these fields. Default true.true
includeVideoMetadataNobooleanInclude detailed video metadata (width, height, duration) on video posts. Turn off to keep only the video id and url. Default true.true

⚠️ sessionId is a plain string field in the input schema — it is not flagged isSecret, so the raw cookie value is visible in the run's input history and console rather than masked. Treat it like a password: don't share a saved Task or run link that contains it, and rotate the underlying Instagram session if you ever do.

Example input

{
"startUrls": [
"https://www.instagram.com/explore/locations/213131048/berlin-germany/",
"mrbeast",
"tokyo"
],
"maxItems": 50,
"sessionId": "",
"proxyConfiguration": { "useApifyProxy": false },
"dateFilterType": "relative",
"absoluteStartDate": "",
"absoluteEndDate": "",
"relativeValue": 30,
"relativeUnit": "days",
"sortOrder": "ranked",
"includeEngagement": true,
"includeVideoMetadata": true
}

Supported URL types and input formats

detect_input_type() in the source classifies each startUrls entry before it's resolved:

  • Location URL — any http(s) string containing /locations/, e.g. https://www.instagram.com/explore/locations/213131048/berlin-germany/. Used directly; the location ID is pulled out with a regex on /locations/(\d+)/.
  • Username — a bare handle with or without a leading @, e.g. mrbeast or @mrbeast. The Actor scrapes that profile's HTML and embedded JSON for /explore/locations/ links found on that user's recent posts, then processes each location it finds.
  • Keyword — free text such as berlin or new york. Resolved to a location through Instagram's topsearch endpoint, with a hashtag-page scrape and a small hardcoded lookup (berlin only, in the current source) as fallbacks if the live search comes back empty.

⚠️ A real limitation: any other http(s) URL that does not contain /locations/ — a plain profile URL like https://www.instagram.com/mrbeast/, for example — is not recognized as a URL or a username by detect_input_type(). It falls through to the keyword path and is searched as literal text, which will very likely return zero locations. Paste the bare username (mrbeast) instead of a profile URL to get the intended behavior.

📦 Output Format

Typed, normalized JSON. Every post is one dataset row with the same 19 top-level keys in the same order, run after run — and the default dataset view shown in the Apify Console lists those same 19 fields, so unlike some scrapers, nothing here is hidden behind the view.

Output for posts

All 19 keys, read directly from extract_post_data() in src/extract_posts.py:

{
"type": "post",
"id": "3234567890123456789",
"code": "C1a2B3c4D5e",
"url": "https://www.instagram.com/p/C1a2B3c4D5e/",
"createdAt": "2026-06-14T18:32:07Z",
"likeCount": 1204,
"commentCount": 38,
"caption": "Golden hour at the Brandenburg Gate 🌅 #berlin #travel",
"isAvailable": true,
"isLikeAndViewCountsDisabled": false,
"isPinned": false,
"isPaidPartnership": false,
"isCarousel": false,
"isVideo": true,
"owner": {
"id": "9876543210",
"username": "travel_with_anya",
"fullName": "Anya K.",
"profilePicUrl": "https://scontent.cdninstagram.com/v/anya_profile.jpg",
"isPrivate": false,
"isVerified": false
},
"location": {
"id": "213131048",
"name": "Berlin, Germany",
"city": "Berlin",
"lat": 52.516,
"lng": 13.3777
},
"video": {
"id": "video_3234567890123456789",
"url": "https://scontent.cdninstagram.com/v/berlin_sunset.mp4",
"width": 1080,
"height": 1920,
"duration": 14.7
},
"image": null,
"audio": {
"id": "audio_998877",
"title": "Golden Hour",
"artist": "Ambient Collective",
"coverArt": "https://scontent.cdninstagram.com/v/audio_cover.jpg",
"duration": 30000,
"audioUrl": "https://scontent.cdninstagram.com/v/audio_track.m4a"
}
}

video, image and audio are each null on posts that don't carry that media type — a photo post returns video: null, and a post with no detected music returns audio: null.

Output for place data

The location object embedded on every post, from the same extract_post_data() function:

{
"id": "213131048",
"name": "Berlin, Germany",
"city": "Berlin",
"lat": 52.516,
"lng": 13.3777
}

location itself is null on the rare post where Instagram's response includes no location object at all. lat/lng are null when Instagram omits coordinates for that place.

Output for owner profiles

The owner object embedded on every post:

{
"id": "9876543210",
"username": "travel_with_anya",
"fullName": "Anya K.",
"profilePicUrl": "https://scontent.cdninstagram.com/v/anya_profile.jpg",
"isPrivate": false,
"isVerified": false
}

owner is null if the raw post node carries neither a user nor an owner key.

Schema stability and export options

Field names come from Instagram's internal GraphQL schema (the xdt_location_get_web_info_tab query, addressed by a doc_id the Actor discovers from Instagram's own JavaScript bundle) rather than from CSS selectors, so a purely visual redesign of Instagram's location page is unlikely to break field mapping. When Instagram changes the underlying response shape itself, extract_post_data()'s .get() calls degrade individual values to typed defaults (0, "", None) instead of raising, so one field going missing doesn't fail the row. Export the dataset as JSON, CSV, Excel, or an HTML table from the Apify Console, or read it through the Apify API or apify_client.

Pay-per-event

The Actor charges the row_result event once per post pushed to the dataset, via Actor.push_data(post, charged_event_name="row_result") — the same call runs on both the primary extraction path and the proxy-fallback retry path in src/main.py. No error or accounting row is ever pushed uncharged: if a location fails outright (retries exhausted, or no working proxy found), that location is skipped entirely and no row is written for it — you simply receive fewer rows than requested, with nothing extra to filter out of the dataset.

💡 Instagram Location Scraper Strategy Guide

🎯 Strategy 1: Real-time enrichment pipeline

Trigger a run whenever a new place enters your system — a venue added to a directory, an event location confirmed. Call the Actor with startUrls set to that place's location URL, sortOrder: "recent" so the newest posts surface first, and read back caption, likeCount, commentCount and owner.username per post. Append the result set, or just its count and top post, to that place's record in your CRM or directory. Because maxItems can be set small, a single-place enrichment run stays fast enough to run inline in a request-driven workflow.

🎯 Strategy 2: Scheduled monitoring and alerting

Set up an Apify Schedule to re-run the same startUrls weekly, with dateFilterType: "relative" and relativeValue/relativeUnit matched to the schedule interval (e.g. 7 / "days") so each run only returns posts since the last one. Diff the new run's id values and likeCount/commentCount totals against the previous run's dataset for the same location.id, and alert when total engagement or post volume at a tracked venue moves past a threshold you set. This turns a one-off location snapshot into a standing activity feed for that place.

🎯 Strategy 3: Bulk dataset build

For a research or training dataset spanning many places, load startUrls with as many location URLs, usernames, or keywords as you need in one run, leave sortOrder at its default "ranked", and set maxItems to your target row count — the Actor processes each start value in turn and stops across the whole run once maxItems is reached. Aggregate the resulting dataset to CSV, Excel, or a database via apify_client, keyed on location.id so posts from the same resolved place stay grouped even if you supplied it as a keyword in one run and a URL in the next.

Strategy comparison at a glance

StrategyBest forRun patternOutput format
Real-time enrichmentA directory or CRM record that needs current post activity for one placeSingle-location run triggered on demand via the Apify APIOne JSON row set consumed immediately
Scheduled monitoringTracking post volume and engagement drift at a tracked venue over timeRecurring Apify Schedule with a relative date filter matched to the intervalDataset diffed run-over-run on location.id
Bulk dataset buildResearch or training datasets spanning many locationsHigh maxItems across a long startUrls list in one runCSV/Excel export or apify_client pull

Other Scrapio Actors covering adjacent Instagram data, plus the closest alternatives for location-post data specifically:

Scraper NameWhat it extracts
Instagram Hashtag Analytics ScraperHashtag posts/reels, related-hashtag discovery, and per-hashtag engagement analytics
Instagram Comment Sentiment ScraperPost/reel comments with sentiment, topics, emoji and language
Instagram Profile Bulk Status CheckerBulk account status and classification for many usernames at once
Instagram Influencer Finder by KeywordCreators discovered by niche keyword, or expanded from a seed profile's related creators
Instagram Reel Transcript ScraperReel captions, engagement, and optional speech-to-text transcripts
apidojo/instagram-location-scraperLocation posts via a separate startUrls/locationIds input pair, pay-per-event
louisdeconinck/instagram-location-stats-scraperOne aggregate profile per location (media count, hours, price range) instead of individual posts

How to integrate Instagram Location Scraper with your stack

Instagram Location Scraper works with any language or tool that can make an HTTP request — it runs on Apify, so integration means calling the Apify API or the apify_client / apify-client SDKs.

Python

from apify_client import ApifyClient
import csv
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<YOUR_USERNAME>/instagram-location-scraper").call(run_input={
"startUrls": [
"https://www.instagram.com/explore/locations/213131048/berlin-germany/",
"tokyo",
],
"maxItems": 50,
"sessionId": "<YOUR_INSTAGRAM_SESSION_ID>",
"sortOrder": "recent",
"dateFilterType": "relative",
"relativeValue": 30,
"relativeUnit": "days",
})
posts = list(client.dataset(run["defaultDatasetId"]).iterate_items())
with open("posts.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["id", "url", "caption", "likeCount", "commentCount"])
writer.writeheader()
for post in posts:
writer.writerow({k: post.get(k) for k in writer.fieldnames})
for post in posts:
owner = post.get("owner") or {}
location = post.get("location") or {}
print(location.get("name"), owner.get("username"), post["likeCount"])

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('<YOUR_USERNAME>/instagram-location-scraper').call({
startUrls: ['https://www.instagram.com/explore/locations/213131048/berlin-germany/'],
maxItems: 50,
sessionId: '<YOUR_INSTAGRAM_SESSION_ID>',
sortOrder: 'recent',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const post of items) {
console.log(post.location?.name, post.owner?.username, post.likeCount);
}

Async and scheduled pipelines

There is no webhook input field on this Actor, so use Apify's platform-level Webhooks (configured on the Actor or a Task, triggering on ACTOR.RUN.SUCCEEDED) to be notified when a run finishes, or poll client.run(runId).get() for its status. For fire-and-forget large startUrls lists, start the run with client.actor(...).start(...) instead of .call(...) and let the webhook or a scheduled check pick up the result later. Apify Schedules cover the recurring-run pattern described in Strategy 2 above.

Who Needs Instagram Location Scraper? (Use Cases & Industries)

🏢 Local marketing and tourism teams

A destination marketer tracking a landmark, event venue, or neighborhood pastes its location URL or keyword into startUrls, and reads caption, owner.username and likeCount back per post to see what visitors are actually posting and how it's landing — isPaidPartnership separates organic geotags from sponsored content in the same feed.

📊 AI engineers and RAG builders

Index caption alongside location.name and location.city into a vector store per resolved place, so an agent can answer "what's being posted from this location" against live geotagged content rather than a stale scrape or a generic web crawl.

📱 Competitive intelligence analysts

Track likeCount, commentCount and owner.username for posts geotagged at a competitor's storefront or event location on a recurring schedule, diffing the numbers run-over-run to catch an activity spike before it shows up anywhere else.

🔬 Researchers

Academic or market researchers studying geotagged content, event-attendance signals, or location-based engagement patterns can build a dataset from public post, owner and place fields alone — no Instagram account of their own beyond the session cookie the Actor needs to query, and no data beyond what any visitor to that location page already sees.

🎥 Product and SaaS builders

Teams building a location-intelligence, event-monitoring, or social-listening product use this Actor as the geotagged-content collection layer, feeding location, owner and engagement fields into their own scoring or mapping logic instead of maintaining an Instagram location scraper in-house.

Scraping publicly accessible Instagram content is generally treated as permissible under US law: courts have held that accessing data any visitor can already see, without circumventing a login wall, does not violate the Computer Fraud and Abuse Act — see hiQ Labs v. LinkedIn, 938 F.3d 985 (9th Cir. 2019), a public-profile-scraping dispute — though rulings vary by jurisdiction and by the specific facts involved.

That legal status is separate from Instagram's Terms of Service, which restrict automated data collection. Violating a platform's terms is a contractual and civil matter between you and the platform, not a criminal one, though it can still lead to account or access restrictions — and this Actor's own session-cookie requirement means a run is tied to a real, logged-in Instagram account, which raises that risk directly for whichever account supplies the cookie.

The output does carry personal data: owner.username, owner.fullName and owner.profilePicUrl identify a natural person, so GDPR, CCPA and equivalent regimes apply if you store or process this output in a jurisdiction those laws cover. location fields (name, city, coordinates) describe a place, not a person, and don't carry that same obligation on their own.

Instagram Location Scraper returns only publicly accessible data. What you do with that data is your responsibility — consult legal counsel for commercial applications involving the owner personal-data fields.

❓ Frequently asked questions

Does Instagram Location Scraper work without an Instagram account?

Not in practice. If the location query returns no posts and no sessionId was supplied, the source raises "Instagram requires authentication to return posts" and the run logs a warning that "some requests may fail or return limited data" without one. Supply a valid sessionid cookie value from a logged-in browser session to get real results.

How does Instagram Location Scraper handle Instagram's anti-scraping measures?

Requests use browser-accurate headers and a persisted GraphQL query (doc_id) discovered directly from Instagram's own JavaScript bundle, with up to 3 retries and exponential backoff (2s/4s/6s) per page fetch. On a blocked response, the Actor escalates proxies: none → Apify datacenter → Apify residential, sticking with residential once it works. That escalation triggers when a response's HTTP status is 403, 429, or 503, or when the error text contains "blocked", "forbidden", "rate limit" or "too many requests". One real gap: a login-redirect loop (Instagram bouncing an unauthenticated or expired-session request through its login and home pages) raises a distinct exception whose message doesn't contain any of those trigger words, so ProxyState.is_blocked() classifies it as non-blocking — that location is logged and skipped rather than retried on a new proxy.

Can I run Instagram Location Scraper at scale without getting blocked?

maxItems has no published upper bound (0 means unlimited) and pagination fetches 12 posts per page. No uptime or success-rate figure is published for this Actor — treat proxy escalation and the retry ladder as best-effort rather than a guarantee, particularly given the fallback gap described above.

How fresh is the data Instagram Location Scraper returns?

Every run performs a live fetch. The doc_id and CSRF token used to query a location are re-discovered per location at the start of each run rather than cached across runs, and the GraphQL request itself always goes out fresh — there is no caching layer in the source.

Which fields work best for AI training and RAG indexing?

For RAG indexing: caption carries the most descriptive free-text language and chunks cleanly alongside location.name/location.city. For training data: likeCount, commentCount, isVideo, isCarousel and isPaidPartnership are consistently typed across every record and pair directly with caption for a supervised engagement or content-classification dataset.

What happens to personal data in the owner fields?

Instagram Location Scraper returns only what's publicly visible on a location page — the poster's username, full name and avatar accompany each post the same way they do to any visitor. Lawful basis for storing and using that personal data sits with you as the operator; consult counsel before commercial use in a jurisdiction with GDPR, CCPA or similar personal-data obligations.

Does Instagram Location Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes, as a standard HTTP-callable Apify Actor — any agent framework that can call the Apify API (LangChain, CrewAI, a custom tool definition, n8n) can trigger a run and receive typed JSON back with no parsing step. No MCP server is documented for this Actor.

What happens if a keyword doesn't resolve to a location?

search_locations_by_keyword() tries the topsearch endpoint, a context-less retry, a hashtag-page scrape, and a single hardcoded fallback (berlin only, today) before giving up. If every stage returns nothing, the Actor logs "No locations found for keyword" and moves on to the next startUrls entry — no row is written for that entry, and no run-ending error is raised.

Does turning off includeEngagement or includeVideoMetadata scrape less data?

No. Extraction is identical either way — the same request is made and the same post is parsed. The toggles only null likeCount/commentCount (for includeEngagement) or the width/height/duration fields inside video (for includeVideoMetadata) on the row after extraction, so switching a toggle only changes what's masked, not what's fetched.

How does Instagram Location Scraper compare to other Instagram location scrapers?

Checked on the Apify Store on 26 July 2026: apidojo/instagram-location-scraper documents no-authentication access, per-event pricing, and a customMapFunction input for reshaping rows in-run — capabilities this Actor doesn't have. louisdeconinck/instagram-location-stats-scraper returns one aggregate stats profile per location rather than individual posts. Where this Actor differs: it accepts a location URL, username, or bare keyword in the same input field and resolves all three itself, filters by an absolute or relative date window, and lets you opt out of engagement or video-metadata fields per run without changing the underlying request.

ℹ️ Disclaimer

Instagram Location Scraper extracts only publicly available data from Instagram location pages. This tool is intended for lawful use cases only. Users are responsible for complying with Instagram's terms of service and applicable data protection laws — including GDPR and CCPA where the owner personal-data fields are involved — in their jurisdiction.