Instagram Location Scraper With Business Contact Leads
Pricing
Pay per usage
Instagram Location Scraper With Business Contact Leads
Scrape Instagram posts by location with the Instagram Location Scraper. Extract post captions, images, videos, hashtags, timestamps, and user info from any public location. Ideal for trend tracking, market research, and content analysis. Fast, accurate, and scalable for bulk locations.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
2
Monthly active users
9 days ago
Last modified
Categories
Share
Instagram Location Scraper — Posts With Business Contact Leads
Instagram Location Scraper With Business Contact Leads turns any Instagram location page, @username, or place keyword into a list of posts — then enriches every unique post owner into a location-based lead with follower counts, bio, category, and opt-in business contact details (email, phone, contact method, address). Every response is structured JSON, ready to pass directly to an LLM, load into a CRM, or index for outreach. Set requireBusinessContact to keep only leads you can actually reach, and re-run the same location or keyword on a schedule to catch newly contactable accounts as they post.
What is Instagram Location Scraper With Business Contact Leads?
Instagram Location Scraper With Business Contact Leads queries Instagram's internal location-feed API for posts tagged at a place — a landmark, city, venue, or address — and returns each post as a structured record together with a resolved lead for the account that posted it. Give it a location URL, an @username whose tagged locations you want to mine, or a plain keyword (e.g. berlin), and it resolves the input, paginates the feed, and pushes one row per post.
What separates it from a plain post scraper is what happens after the post is captured: every unique post owner is queried against Instagram's private profile endpoint and enriched with follower/following/media counts, bio, external link, category, and — where the account opted in — a business contact object (email, phone, contact method, street address). Turn on requireBusinessContact and only posts whose owner exposes a real way to reach them are kept.
A valid Instagram sessionid cookie is required in practice. Logged out, Instagram walls both the location feed's GraphQL endpoint and the owner-info lead endpoint, returning either an authentication error or a stripped profile object with no follower data.
- 📍 Query by location URL,
@username, or a free-text place keyword — type is auto-detected - 🧵 Full post payload: caption, engagement, media, carousel and location metadata, not just a flat lead row
- 👤 Owner profile enrichment, deduplicated per unique account per run
- 📇 Opt-in business contact extraction (email, phone, contact method, address)
- ✅ Contact-only filtering via
requireBusinessContact - ⏳ Absolute or relative date-range filtering on post creation time
What data can you get with Instagram Location Scraper With Business Contact Leads?
Every pushed row is one Instagram post, carrying the full post object plus the resolved owner lead — nothing here is a separate dataset you have to join by hand.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Post | type, id, code, url, createdAt, likeCount, commentCount, caption, isAvailable, isLikeAndViewCountsDisabled, isPinned, isPaidPartnership, isCarousel, isVideo | Content and engagement tracking for a location |
| Owner (base) | owner.id, owner.username, owner.fullName, owner.profilePicUrl, owner.isPrivate, owner.isVerified | Identifying who posted |
| Owner profile enrichment | ownerDetails.followerCount, .followingCount, .mediaCount, .biography, .externalUrl, .category, .isBusiness, .isProfessionalAccount | Lead qualification, audience sizing |
| Business contact lead | ownerContact.publicEmail, .contactPhoneNumber, .businessContactMethod, .addressStreet, .cityName, .zip, hasBusinessContact | Outreach — the actual channel to reach the account |
| Location | location.id, .name, .city, .lat, .lng | Geo-targeting and territory mapping |
| Media | video{id,url,width,height,duration}, image{url,width,height}, audio{id,title,artist,coverArt,duration,audioUrl} | Creative review, asset pull |
Business contact leads
ownerContact is what makes this a lead scraper rather than a post scraper: publicEmail, contactPhoneNumber, businessContactMethod, and the address fields (addressStreet, cityName, zip) come straight off Instagram's contact button, which only a Business or Creator account can populate, and only if that account chose to publish it. In practice a large share of professional accounts leave these blank — the source code never fabricates a value here, it normalizes empty strings and Instagram's own "UNKNOWN" placeholder to null (owner_enrich.py, _clean()). hasBusinessContact is true only when at least one of publicEmail, contactPhoneNumber, or businessContactMethod is a real, non-null value:
{"ownerDetails": {"followerCount": 48213,"followingCount": 512,"mediaCount": 1187,"biography": "Berlin-based coffee roastery. Wholesale + espresso bar.","externalUrl": "https://example-roasters.de","category": "Coffee Shop","isBusiness": true,"isProfessionalAccount": true},"ownerContact": {"publicEmail": "wholesale@example-roasters.de","contactPhoneNumber": "+493012345678","businessContactMethod": "EMAIL","addressStreet": "Torstraße 12","cityName": "Berlin","zip": "10119"},"hasBusinessContact": true}
Post media and engagement
Each row also carries the underlying post untouched — caption, likeCount/commentCount, and whichever media object applies: video (highest-resolution video_versions entry, with duration parsed from Instagram's DASH manifest when the platform doesn't return it directly), image (highest-resolution candidate), or audio (original sound or attached music track, including cover art and duration where Instagram exposes it). A carousel post inherits the first slide's media if the top-level node has none. This lets you pair a lead with the exact content that put them at the location — useful for personalizing outreach ("saw your post at Torstraße Coffee") rather than cold-emailing a bare contact list.
Why not build this yourself?
Instagram's official Graph API and Basic Display API are scoped to content a Business or Creator account authenticates and owns — neither exposes third-party location search, arbitrary user lookups, or another account's contact-button data, and any broader access requires Meta App Review and business verification. There is no official endpoint that reproduces this Actor's query-to-lead workflow.
Reverse-engineering Instagram's private web GraphQL location feed (xdt_location_get_web_info_tab) and profile endpoint (users/{pk}/info) is the only route from "a place" to "a contactable lead," and both are fragile in ways a script you maintain yourself has to absorb: a query doc_id mined out of Instagram's bundled JavaScript at runtime (helper.py), a CSRF token harvested from the page HTML on every location, and IP-based blocking that escalates from datacenter to residential proxies mid-run. This Actor keeps that maintenance in one place — pagination, retry-with-backoff, a datacenter-then-residential proxy fallback ladder, and a dedicated residential route for the owner-info endpoint specifically (main.py, owner_enrich.py) — instead of it living in a brittle script on your own infrastructure.
What's the difference between an Instagram post scraper and a business lead-generation scraper?
An Instagram post scraper returns what was posted; a lead-generation scraper returns who to contact about it — most tools on the Apify Store pick one and stop.
Post-focused scrapers were built to mine content: captions, hashtags, engagement counts, and an owner.username at most. That's enough for content research but not for outreach — there's no way to know if the account behind a post can be reached without visiting the profile separately. Contact-focused lead tools go the other direction: they crawl profiles for an email or phone number but usually discard the post, caption, or location that triggered the match in the first place, so you lose the context that made the lead relevant.
What changed is Instagram's own contact button: Business and Creator accounts can now publish an opt-in email, phone number, or contact method directly on their profile object, readable the same way the Instagram app reads it. Instagram Location Scraper With Business Contact Leads reads both halves into the same row — the full post (caption, video, image, location) and the resolved lead (ownerDetails, ownerContact, hasBusinessContact) arrive together, so a location or a caption never needs to be manually rejoined to a contact record after the fact.
How to scrape Instagram locations with Instagram Location Scraper With Business Contact Leads?
- Open the Actor on its Apify Store listing and click Try for free / Start.
- Enter one or more values into
startUrls— a location URL, an@username, or a place keyword. - Set the query controls that matter for your run:
dateFilterTypewithrelativeValue/relativeUnit(orabsoluteStartDate/absoluteEndDate),enrichOwner,includeBusinessContact, andrequireBusinessContact. - Paste a valid Instagram
sessionidcookie intosessionId— required in practice, since Instagram walls both the location feed and the owner-info endpoint for logged-out requests. - Start the run, then download results as JSON, CSV, or Excel from the run's dataset, or pull them programmatically with the Apify API or SDK.
How to run multiple queries in one job
startUrls uses Apify's stringList editor and accepts an array, so you can queue multiple location URLs, usernames, and keywords in a single run. Each input is processed in turn until maxItems (shared across all inputs) is reached, at which point remaining inputs are skipped rather than started. Concurrency across inputs isn't a configurable property of this Actor — locations are processed sequentially within one run, so parallelizing many locations means starting multiple runs.
⬇️ Input
Every field below comes from the Actor's published input schema (.actor/actor.json) — names, types, and defaults are reproduced exactly.
| Parameter | Required | Type | Default | Constraints |
|---|---|---|---|---|
startUrls | Yes | array (string list) | — | Instagram location page URLs, @usernames, or place keywords. Type is auto-detected per item. |
maxItems | No | integer | 20 | Minimum 0. Upper bound on posts scraped across all inputs; 0 = unlimited. Each post yields one lead row. |
sessionId | No | string | — | Your Instagram sessionid cookie value. Marked isSecret — stored encrypted, never shown back in the input or logs. Required in practice; without it, requests are often blocked or return limited data. |
enrichOwner | No | boolean | true | Fetch each unique post owner's profile (followerCount, followingCount, mediaCount, biography, externalUrl, category, isBusiness, isProfessionalAccount). One request per unique owner per run. |
includeBusinessContact | No | boolean | true | Extract opt-in contact-button data (publicEmail, contactPhoneNumber, businessContactMethod, addressStreet, cityName, zip). Available only for business/creator accounts that published it; null otherwise. |
requireBusinessContact | No | boolean | false | Drop any post whose owner has no public email, phone, or contact method (hasBusinessContact = false). Forces includeBusinessContact on internally so the filter has data to evaluate. |
proxyConfiguration | No | object (proxy editor) | {"useApifyProxy": false} | Standard Apify proxy configuration. If Instagram rejects the current proxy, the Actor falls back to a datacenter, then a residential, Apify Proxy automatically. |
dateFilterType | No | string (enum) | "relative" | One of "absolute", "relative". Selects which date-filter fields below apply. |
absoluteStartDate | No | string | "" | Start date, YYYY-MM-DD. Pattern `^( |
absoluteEndDate | No | string | "" | End date, YYYY-MM-DD. Same pattern. Used when dateFilterType is "absolute"; empty means today. |
relativeValue | No | integer | 0 | Minimum 0. Number of time units for the recent window (e.g. 7). Used when dateFilterType is "relative"; 0 disables date filtering entirely. |
relativeUnit | No | string (enum) | "days" | One of "days", "weeks", "months", "years". |
includeEngagement | No | boolean | true | Include likeCount and commentCount on each post. Turn off to null them out. |
includeVideoMetadata | No | boolean | true | Include the video object on video posts. Turn off to null it out. |
Example input:
{"startUrls": ["https://www.instagram.com/explore/locations/213131048/berlin-germany/"],"maxItems": 50,"sessionId": "58412345%3AAbCdEfGhIjKlMn%3A25%3AAbC...","enrichOwner": true,"includeBusinessContact": true,"requireBusinessContact": true,"dateFilterType": "relative","relativeValue": 30,"relativeUnit": "days","includeEngagement": true,"includeVideoMetadata": true,"proxyConfiguration": { "useApifyProxy": false }}
Common pitfall — bare usernames are read as keywords, not usernames. Type detection only classifies an input as a username when it starts with @ (location_scraper.py, detect_input_type). A value like mrbeast without the @ prefix falls through to the keyword branch and is searched as a place name, not resolved to that account's tagged locations — even though the schema's own example lists 'mrbeast' alongside a location URL and 'berlin'. Always prefix username inputs with @ (@mrbeast) to get that account's posts. Separately, free-text keyword search only has one hard-coded location mapping (berlin) as a last-resort fallback; other keywords depend on Instagram's live search and hashtag-page parsing succeeding, which can return zero locations if Instagram's markup has changed — a direct location URL is the most reliable input type.
⬆️ Output
Results are typed, normalized JSON with a consistent schema across runs — no field is added or removed based on post type, only nulled where data doesn't apply. Every result is pushed as a paid row_result event and is available from the run's dataset as JSON, CSV, Excel/XLSX, or via the Apify API and dataset SDKs.
Scraped results
[{"type": "post","id": "3401928374651029384","code": "C8xY3nZpQrT","url": "https://www.instagram.com/p/C8xY3nZpQrT/","createdAt": "2026-06-14T09:12:47Z","likeCount": 842,"commentCount": 31,"caption": "New single-origin drop, in the shop this weekend ☕","isAvailable": true,"isLikeAndViewCountsDisabled": false,"isPinned": false,"isPaidPartnership": false,"isCarousel": false,"isVideo": false,"owner": {"id": "48213009","username": "example_roasters_berlin","fullName": "Example Roasters","profilePicUrl": "https://scontent.cdninstagram.com/v/t51.2885-19/example_pic.jpg","isPrivate": false,"isVerified": false},"location": {"id": "213131048","name": "Berlin, Germany","city": "Berlin","lat": 52.5200,"lng": 13.4050},"video": null,"image": {"url": "https://scontent.cdninstagram.com/v/t51.29350-15/example_photo.jpg","width": 1440,"height": 1800},"audio": null,"ownerDetails": {"followerCount": 48213,"followingCount": 512,"mediaCount": 1187,"biography": "Berlin-based coffee roastery. Wholesale + espresso bar.","externalUrl": "https://example-roasters.de","category": "Coffee Shop","isBusiness": true,"isProfessionalAccount": true},"ownerContact": {"publicEmail": "wholesale@example-roasters.de","contactPhoneNumber": "+493012345678","businessContactMethod": "EMAIL","addressStreet": "Torstraße 12","cityName": "Berlin","zip": "10119"},"hasBusinessContact": true},{"type": "post","id": "3401928311102934871","code": "C8wR8vLmXyZ","url": "https://www.instagram.com/p/C8wR8vLmXyZ/","createdAt": "2026-06-12T18:45:03Z","likeCount": 2103,"commentCount": 88,"caption": "Weekend market walk 🇩🇪","isAvailable": true,"isLikeAndViewCountsDisabled": false,"isPinned": false,"isPaidPartnership": false,"isCarousel": false,"isVideo": true,"owner": {"id": "911827364","username": "berlin_streetstyle","fullName": "","profilePicUrl": "https://scontent.cdninstagram.com/v/t51.2885-19/example_pic2.jpg","isPrivate": false,"isVerified": false},"location": {"id": "213131048","name": "Berlin, Germany","city": "Berlin","lat": 52.5200,"lng": 13.4050},"video": {"id": "video_3401928311102934871","url": "https://scontent.cdninstagram.com/v/t50.2886-16/example_video.mp4","width": 1080,"height": 1920,"duration": 14.802},"image": null,"audio": {"id": "audio_991827364","title": "Original audio","artist": "berlin_streetstyle","coverArt": "","duration": 0,"audioUrl": "https://scontent.cdninstagram.com/v/t62/example_audio.mp4"},"ownerDetails": {"followerCount": 6104,"followingCount": 891,"mediaCount": 340,"biography": null,"externalUrl": null,"category": null,"isBusiness": false,"isProfessionalAccount": false},"ownerContact": {"publicEmail": null,"contactPhoneNumber": null,"businessContactMethod": null,"addressStreet": null,"cityName": null,"zip": null},"hasBusinessContact": false},{"type": "post","id": "3401928204471029111","code": "C8vN1qPzAbC","url": "https://www.instagram.com/p/C8vN1qPzAbC/","createdAt": "2026-06-09T11:20:15Z","likeCount": 415,"commentCount": 12,"caption": "Coworking day pass now available — link in bio","isAvailable": true,"isLikeAndViewCountsDisabled": false,"isPinned": true,"isPaidPartnership": false,"isCarousel": true,"isVideo": false,"owner": {"id": "220981734","username": "berlin_coworks","fullName": "Berlin CoWorks","profilePicUrl": "https://scontent.cdninstagram.com/v/t51.2885-19/example_pic3.jpg","isPrivate": false,"isVerified": true},"location": {"id": "213131048","name": "Berlin, Germany","city": "Berlin","lat": 52.5200,"lng": 13.4050},"video": null,"image": {"url": "https://scontent.cdninstagram.com/v/t51.29350-15/example_photo3.jpg","width": 1080,"height": 1080},"audio": null,"ownerDetails": {"followerCount": 9887,"followingCount": 204,"mediaCount": 612,"biography": "Flexible desks and meeting rooms in Mitte.","externalUrl": "https://berlincoworks.example","category": null,"isBusiness": true,"isProfessionalAccount": true},"ownerContact": {"publicEmail": null,"contactPhoneNumber": null,"businessContactMethod": "DIRECT_MESSAGE","addressStreet": null,"cityName": null,"zip": null},"hasBusinessContact": true}]
category is frequently null even on business accounts — Instagram doesn't require it, and the field is preserved as null rather than guessed. If enrichOwner or includeBusinessContact are turned off, ownerDetails and/or ownerContact are null on every row instead of omitted. With requireBusinessContact on, the returned row count can be lower than maxItems because non-contactable posts are dropped before being pushed — and dropped posts are never charged, since the pay-per-event row_result fires only on Actor.push_data(), which only runs after the filter (main.py, enrich_and_push).
How can I use the data extracted with Instagram Location Scraper With Business Contact Leads?
- 📈 Local marketers and lead-gen agencies: build a contactable lead list for a venue, neighborhood, or event by filtering rows on
hasBusinessContact: true, then pushownerContactstraight into a cold-outreach sequencer or CRM. - 🤖 AI engineers and LLM developers: ground an outreach agent — the agent issues a location query, receives structured JSON with post context and lead data attached, and drafts a personalized message referencing the actual post (
caption,location.name) instead of a cold template. - 🔬 Market researchers: track which businesses and creators are active at a landmark, competitor venue, or recurring event over time, using
owner.usernameandlocation.nameto build coverage and share-of-presence views. - 🧩 Partnerships and business-development teams: scan a city or venue for professional accounts (
ownerDetails.isBusiness) worth a co-marketing or affiliate outreach, usingcategoryandbiographyto pre-qualify before a human ever opens the profile.
How do you monitor business contact leads over time?
Business contact fields change more often than they look — an account adds a public email after switching to a Creator account, updates a phone number, or finally exposes a contact method months after your first pass. Re-running the same startUrls on a schedule turns a one-off lead list into a live feed of newly reachable accounts.
The fields worth diffing between runs are owner.id (the stable key — usernames can change, the numeric id doesn't), hasBusinessContact, and the individual ownerContact fields themselves: a row where hasBusinessContact flips from false to true, or where publicEmail goes from null to a real address, is a lead that just became reachable and wasn't before. ownerDetails.followerCount is also worth tracking if you're prioritizing by audience size rather than contactability alone.
A practical loop: schedule a run across your target location(s) with requireBusinessContact off (so you see the full picture, not just today's contactable subset), keep each run's dataset, and diff on owner.id + hasBusinessContact against the previous run to isolate newly contactable accounts before re-running with requireBusinessContact: true for the outreach-ready list. Use dateFilterType: "relative" with a relativeValue matching your run cadence (e.g. 7 / "days" for a weekly schedule) so each run only re-processes posts made since the last one. Point the run at an Apify Schedule to automate the cadence — this Actor has no built-in polling or delivery mechanism of its own beyond the standard Apify dataset and webhook surface.
🔗 Integrate Instagram Location Scraper With Business Contact Leads and automate your workflow
Instagram Location Scraper With Business Contact Leads works with any language or tool that can call the Apify API — there's no separate API key or signup outside your Apify account.
REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<YOUR_USERNAME>/instagram-location-scraper-with-business-contact-leads").call(run_input={"startUrls": ["https://www.instagram.com/explore/locations/213131048/berlin-germany/"],"maxItems": 50,"sessionId": "<YOUR_IG_SESSIONID_COOKIE>","requireBusinessContact": True,})for lead in client.dataset(run["defaultDatasetId"]).iterate_items():print(lead["owner"]["username"], lead.get("ownerContact"))
Scheduled monitoring and delivery
There is no actor-specific webhook or push feature — delivery runs through the standard Apify platform surface. Attach an Apify Schedule to run this Actor on a cadence, and an Apify webhook to fire on ACTOR.RUN.SUCCEEDED so a downstream system (Zapier, Make, your own endpoint) picks up new leads without polling the Console manually.
Is it legal to scrape Instagram location posts?
Scraping publicly accessible Instagram posts and profile data is generally lawful in the US and EU; this Actor returns only what any logged-in visitor to a location page or profile can already see. In hiQ Labs, Inc. v. LinkedIn Corp. (9th Cir., 2019), the court held that scraping publicly accessible web data does not violate the Computer Fraud and Abuse Act, and a 2024 Northern District of California ruling in Meta Platforms, Inc. v. Bright Data Ltd. similarly declined to block scraping of Meta's public-facing pages on breach-of-contract grounds alone.
The business-contact fields this Actor extracts (publicEmail, contactPhoneNumber, address) are personal data tied to an identifiable person, even in a business context — so GDPR and CCPA obligations attach to how you store, use, and eventually delete that data, not to the act of reading what's publicly published. Scraping for one-off outreach research carries a different risk profile than storing this data in bulk for AI training or long-term databases. Consult your legal team for commercial use cases involving bulk data storage or unsolicited contact at scale.
❓ Frequently asked questions
Does it work without an Instagram login?
Not reliably. sessionId is optional in the schema, but both the location feed's GraphQL endpoint and the owner-info endpoint reject logged-out requests — without a valid sessionid cookie, Instagram either returns an authentication error or, for the owner endpoint, a stripped profile object with no follower data that this Actor treats as a failed enrichment.
What happens if I put a plain username in startUrls without @?
It's read as a location keyword, not resolved to that account's posts — type detection only treats an input as a username when it's prefixed with @. Use @mrbeast, not mrbeast, to get an account's tagged locations.
How does Instagram Location Scraper With Business Contact Leads handle Instagram's anti-bot measures?
On a blocked response (HTTP 403, 429, 503, or an error mentioning "blocked," "forbidden," or "rate limit"), the Actor climbs a proxy ladder — no proxy → Apify datacenter proxy → Apify residential proxy — and retries the failed location once on the new proxy. Once a residential proxy succeeds, it's kept for the rest of the run. Page fetches and owner-info lookups each retry up to 3 times with exponential backoff independent of the proxy ladder, and owner enrichment always routes through a dedicated residential proxy, since Instagram's private profile endpoint redirects datacenter IPs to a login wall even with a valid session cookie.
Does Instagram Location Scraper With Business Contact Leads extract business contact details?
Yes — in the ownerContact object on every row (publicEmail, contactPhoneNumber, businessContactMethod, addressStreet, cityName, zip), plus a hasBusinessContact boolean. These fields are opt-in: only Business or Creator accounts that filled in Instagram's contact button expose them, and the Actor never fabricates a value — an account that hasn't published contact info returns null for every field in the object.
How many results does it return per query?
Up to maxItems posts per run (default 20, 0 = unlimited), counted across all startUrls. There's no other documented ceiling in the input schema; pagination continues location by location until Instagram's feed stops returning posts or maxItems is hit. If requireBusinessContact is on, the number of rows actually pushed can be lower than maxItems, since non-contactable posts are filtered out before the charged push.
What's the difference between dateFilterType: "relative" and "absolute"?
"relative" (the default) keeps posts from the last relativeValue relativeUnits (e.g. 7 "days") up to now — set relativeValue to 0 to disable date filtering entirely, which is also the schema default. "absolute" uses fixed absoluteStartDate/absoluteEndDate values in YYYY-MM-DD format; leaving absoluteEndDate empty defaults it to today.
How do I use this Actor to monitor new contactable leads over time?
Re-run the same startUrls on an Apify Schedule, diff each run's rows on owner.id against the previous run, and flag any row where hasBusinessContact changed from false to true or where a specific ownerContact field went from null to a real value.
Does it work with Claude, ChatGPT, and AI agent frameworks?
It's callable as a standard Apify Actor run by any agent framework that can hit the Apify API or use the apify-client SDK — an agent can trigger a run, poll or wait for completion, and read the dataset as grounding context before answering. No MCP server is documented for this Actor specifically.
How does it compare to other Instagram lead scrapers?
The closest direct match on the Apify Store, instaprism/instagram-location-to-emails (checked 2026-07-26), takes numeric Instagram location IDs rather than URLs, usernames, or keywords, and its listing advertises a login-free run. Its documented output is a flat lead record (userId, email, phone, followers, category) with no underlying post, caption, media, or location object attached — this Actor returns the full post (caption, engagement, video/image/audio, location) with the lead attached to the same row, and adds a requireBusinessContact toggle to filter to contactable rows in one run instead of two. The other top matches for "business contact leads" terms — bovi/yelp-business-leads and themineworks/yellowpages-us (both checked 2026-07-26) — scrape Yelp and YellowPages, not Instagram, so they aren't direct alternatives for this query surface.
Can I use this Actor without managing proxies or Instagram infrastructure myself?
Yes for infrastructure, no for credentials. proxyConfiguration is optional — leave it off and the Actor still climbs its own datacenter-then-residential fallback ladder on blocks, and owner enrichment always uses a dedicated residential proxy regardless of what you configure. What you do have to supply yourself is a valid Instagram sessionid cookie; there's no way around that requirement, since Instagram walls both endpoints for logged-out clients.
💬 Your feedback
Found a bug, a field that came back empty when it shouldn't have, or a location type this Actor doesn't handle well? Let us know through the Issues tab on this Actor's Apify Console page, or reach out via the Scrapier profile on Apify — reports like these go directly into what gets fixed next.