Foursquare Locations Scraper avatar

Foursquare Locations Scraper

Pricing

from $0.06 / 1,000 item extracteds

Go to Apify Store
Foursquare Locations Scraper

Foursquare Locations Scraper

🏪 Export public Foursquare brand locations by city with venue IDs, addresses, phones, coordinates, hours, ratings, selected tips, photos, and source links.

Pricing

from $0.06 / 1,000 item extracteds

Rating

0.0

(0)

Developer

Automation Lab

Automation Lab

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

22 days ago

Last modified

Share

Extract public Foursquare venue records from brand-and-city location pages without an account or Foursquare API key.

Turn URLs such as https://redirect.foursquare.com/locations/starbucks/new-york-city into clean JSON, CSV, Excel, XML, or RSS datasets containing venue names, addresses, phones, coordinates, opening hours, ratings, selected tips, photos, and source links.

Use the Actor for chain expansion analysis, local lead lists, hospitality research, recurring directory refreshes, and brand-footprint monitoring.

What does Foursquare Locations Scraper do?

Foursquare Locations Scraper reads public Foursquare brand directory pages and saves one venue per dataset row.

It supports two equivalent input routes:

  • 🏪 paste Foursquare /locations/<brand>/<city> URLs from the redirect, app, www, or bare host;
  • 📍 provide brand and city pairs and let the Actor build safe URL slugs;
  • 🎯 combine multiple cities in one run;
  • 🧹 deduplicate repeated venues by their Foursquare venue ID;
  • ⛔ stop at a global maxItems limit.

The current public page embeds up to 30 detailed venue records per supplied brand/city URL. The output also includes Foursquare's displayed total location count so you can assess the wider footprint without confusing it with the number exported by the page.

Who is it for?

Retail and chain expansion teams

Compare where a brand appears across cities, inspect neighborhood coverage, and feed coordinates into market maps.

Lead generation teams

Build targeted venue lists with phone numbers, addresses, websites, and opening hours for compliant business outreach.

Hospitality and local-market analysts

Compare categories, ratings, rating-signal counts, selected tips, and hours across public venue listings.

Data and reputation teams

Schedule recurring exports and diff the latest Foursquare records against a warehouse snapshot.

Developers and AI agents

Use the Apify API or MCP to turn a brand/city request into structured place data without maintaining a parser.

Why use this Foursquare scraper?

  • ⚡ HTTP-first: no browser startup or paid API credentials.
  • 🧭 Source-specific: records retain Foursquare venue IDs and canonical links.
  • 📦 Export ready: download JSON, CSV, Excel, XML, or RSS from the dataset.
  • 🔁 Repeatable: save the input as an Apify Task and schedule it.
  • 💳 Pay per result: charges apply only to unique venue rows produced, plus a small run start fee.
  • 🛡️ Batch safe: invalid or unavailable targets are skipped without discarding useful rows from other targets; an all-failed run still fails visibly.

What Foursquare location data can I extract?

FieldDescription
venueIdStable Foursquare venue identifier
namePublic venue name
brandBrand slug converted to readable text
queryCityCity requested in the source URL
categoryPrimary Foursquare venue category
neighborhoodNeighborhood label when available
address, crossStreetStreet and cross-street details
city, state, postalCode, countryAddress components
latitude, longitudeVenue coordinates
phone, formattedPhoneContact number variants
websiteVenue or brand website supplied by Foursquare
rating, ratingSignalsFoursquare rating and signal count
checkinsCount, usersCount, tipCountSource-reported community activity counts, not footfall
countryCode, timeZonePublished country code and venue time zone
categoryIds, chainIdsPublished category and chain identifiers
twitter, facebookSource contact references (usually a handle or page ID, not invented URLs)
verifiedWhether Foursquare marks the venue verified
isOpen, hoursStatusCurrent opening state and status text
hours, popularHoursExisting flattened weekly schedules
hoursTimeframes, popularTimeframesStructured source periods: days, optional includesToday, and open entries with renderedTime
menuUrlPublic menu link when present
directionsUrlReady-to-open coordinate directions link
tipText, tipAuthor, tipUrlOne selected public Foursquare tip
imageUrlsUp to three public venue image URLs
venueUrl, sourceUrlCanonical venue and directory links
sourceTotalLocationsTotal locations reported by the source page
scrapedAtUTC extraction timestamp

Optional fields are omitted when Foursquare does not publish them for a venue. The Actor does not invent missing contacts, ratings, or hours.

How much does it cost to scrape Foursquare locations?

Pricing is pay per event:

  • Run start: $0.005 per run.
  • Venue: tiered by your Apify plan; the BRONZE price is $0.000091861 per unique saved venue.

A 10-venue starter run is about $0.00592 at the BRONZE rate. A 30-venue page is about $0.00776. Your exact price is shown in Apify Console before the run and may be lower on higher plans.

The free Apify plan includes monthly platform credits, so small tests may fit inside those credits. Keep maxItems low while validating a new brand/city URL.

How to scrape Foursquare locations

  1. Open the Actor input page.
  2. Paste one or more public Foursquare brand/city URLs, or add brand/city objects.
  3. Set maxItems to the most venues you want saved.
  4. Click Start.
  5. Review the Foursquare venues dataset view.
  6. Export the data as JSON, CSV, Excel, XML, or RSS.
  7. Save the run as a Task if you want recurring updates.

Input parameters

ParameterTypeRequiredPurpose
startUrlsarrayconditionalFoursquare /locations/<brand>/<city> URLs from redirect, app, www, or the bare host
locationsarrayconditionalObjects with brand and city strings
maxItemsintegernoGlobal unique venue limit; default 10

Provide at least one startUrls or locations entry. If both are present, the Actor processes both and deduplicates canonical input URLs and venue IDs.

Input example: exact URL

{
"startUrls": [
{ "url": "https://redirect.foursquare.com/locations/starbucks/new-york-city" }
],
"maxItems": 10
}

HTTP or HTTPS location links from redirect.foursquare.com, app.foursquare.com, www.foursquare.com, or foursquare.com are accepted and normalized to one canonical HTTPS target. A venue detail URL, arbitrary website, or different path shape is skipped.

Input example: brand and city

{
"locations": [
{ "brand": "Starbucks", "city": "New York City" },
{ "brand": "Starbucks", "city": "Chicago" }
],
"maxItems": 40
}

Names are normalized to lowercase URL slugs. For unusual branding, use the exact URL copied from Foursquare to avoid ambiguity.

Output example

{
"venueId": "51964c1a498eeaca10e9ea4c",
"name": "Starbucks",
"brand": "starbucks",
"queryCity": "new york city",
"category": "Coffee Shop",
"neighborhood": "Upper East Side",
"address": "822 Lexington Ave",
"city": "New York",
"state": "NY",
"postalCode": "10065",
"country": "United States",
"latitude": 40.76462850100318,
"longitude": -73.96668685798046,
"formattedPhone": "(212) 572-0984",
"rating": 6,
"ratingSignals": 213,
"verified": true,
"hoursStatus": "Closed until 5:00 AM",
"tipText": "Service is slow but they are friendly",
"venueUrl": "https://app.foursquare.com/v/starbucks/51964c1a498eeaca10e9ea4c",
"sourceUrl": "https://redirect.foursquare.com/locations/starbucks/new-york-city",
"sourceTotalLocations": 317,
"scrapedAt": "2026-07-21T00:00:00.000Z"
}

Page coverage and limits

Foursquare's public brand/city page currently embeds up to 30 venue objects while separately reporting a larger total count for some chains.

This Actor exports the useful records actually embedded in every supplied URL. It does not claim that one URL exports every venue in the reported total.

To build a wider market sample, supply additional city pages. maxItems is a global cap across those pages, not a promise that a page contains that many records.

Machine-readable run coverage

Open Run coverage summary in the Output tab, or read KV record OUTPUT. Diagnostics do not add dataset rows or item charges. The existing overview remains available; Identity and coverage adds venue IDs, requested markets, community counts and reported totals.

  • savedUniqueCount: unique venue rows saved; equals the sum of per-target savedCount after a completed run.
  • requestedTargetCount: all supplied entries, before validation and canonical-target deduplication.
  • uniqueTargetCount, duplicateInputTargetCount, invalidInputCount: distinct valid targets, repeated canonical inputs, and skipped invalid entries.
  • attemptedTargetCount, unprocessedTargetCount: distinct valid targets attempted or not reached, usually because the global cap stopped processing. Unattempted targets are not labeled failed.
  • globalCapStopped: the cap prevented inspection of remaining page records or targets; reaching the cap exactly at the end of the final page is not itself a stop.
  • targets: each attempted canonical sourceUrl, status (success, empty, failed), reportedTotal, embeddedVenueCount, savedCount, duplicateCount, and sanitized failureReason when relevant. A valid duplicate-only page is success with zero saved rows, not an inaccessible page. Duplicate counts cover records inspected before the cap, not unseen records.

The summary is persisted before no-results failure when possible; all-invalid or all-unavailable batches still fail. Initialization, storage or platform failures can prevent a complete summary.

Example for a capped page followed by an unattempted city:

{
"savedUniqueCount": 2,
"requestedTargetCount": 2,
"uniqueTargetCount": 2,
"duplicateInputTargetCount": 0,
"attemptedTargetCount": 1,
"unprocessedTargetCount": 1,
"invalidInputCount": 0,
"globalCapStopped": true,
"targets": [{
"sourceUrl": "https://redirect.foursquare.com/locations/example-coffee/example-city",
"status": "success",
"reportedTotal": 120,
"embeddedVenueCount": 30,
"savedCount": 2,
"duplicateCount": 0
}]
}

Structured schedules preserve rendered source day labels and times, not normalized timestamps, inferred day numbers or 168 hourly popularity values. Each schedule is bounded to 32 periods and 32 open entries per period, with labels up to 200 characters; the existing flattened fields remain unchanged. Unknown values are omitted; numeric zero and boolean false are retained.

Tips for reliable runs

  • ✅ Copy the public brand/city URL from Foursquare when possible.
  • ✅ Begin with maxItems: 10 to inspect the result shape.
  • ✅ Use separate city URLs for a multi-market comparison.
  • ✅ Store venueId as the warehouse merge key.
  • ✅ Compare scrapedAt and sourceUrl when refreshing records.
  • ❌ Do not pass individual venue detail URLs.
  • ❌ Do not assume every venue has a phone, rating, menu, tip, or photo.

Scheduling a Foursquare monitor

Create an Apify Task from a tested input, then add a daily, weekly, or monthly schedule.

A practical refresh workflow is:

  1. run the same brand/city list each week;
  2. export rows to a named table or warehouse;
  3. join on venueId;
  4. detect newly seen and missing locations;
  5. compare rating, hours, and contact changes;
  6. alert only on meaningful differences.

The Actor itself does not retain previous snapshots or label a venue as opened or closed. Your destination system controls that business logic.

Integrations

Google Sheets

Use the Apify Google Sheets integration to refresh a city-by-city location tracker for non-technical analysts.

Make

Trigger a run from a scenario, wait for completion, iterate dataset rows, and route qualified venues into a CRM.

Zapier

Start a saved Task on demand and send newly matched venue rows into sales or operations workflows.

Webhooks

Attach a run-succeeded webhook that notifies your ETL service with the dataset ID.

Warehouses and BI

Pull dataset JSON through the API and upsert on venueId into BigQuery, Snowflake, PostgreSQL, or a lakehouse.

Use the Actor with the Apify API

The Actor ID is automation-lab/foursquare-locations-scraper.

Keep your Apify token in an environment variable. Never commit it to source control.

JavaScript API example

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/foursquare-locations-scraper').call({
locations: [{ brand: 'Starbucks', city: 'New York City' }],
maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python API example

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/foursquare-locations-scraper').call(run_input={
'locations': [{'brand': 'Starbucks', 'city': 'New York City'}],
'maxItems': 10,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

cURL API example

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~foursquare-locations-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"locations":[{"brand":"Starbucks","city":"New York City"}],"maxItems":10}'

Use the returned run and dataset IDs to poll status and download results.

Use Foursquare Locations Scraper through MCP

Apify MCP lets Claude Code, Claude Desktop, Cursor, and VS Code call the Actor as a tool.

For Claude Code:

$claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/foursquare-locations-scraper"

For Claude Desktop, Cursor, or VS Code:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/foursquare-locations-scraper"
}
}
}

Example prompts:

  • “Scrape 10 Starbucks locations from Foursquare in New York City.”
  • “Compare public Foursquare ratings and hours for this brand in Chicago and Los Angeles.”
  • “Return a CSV-ready list of venue IDs, phones, addresses, and coordinates.”

Data quality

The Actor preserves source values and omits unavailable optional fields rather than filling them with guesses.

Ratings and tips are public Foursquare signals, not independent verification. Opening status can change after scraping. Phone numbers and websites may belong to a chain rather than a specific branch when that is what the source publishes.

Always review a sample before using the data for decisions or outreach.

Error handling

The Actor validates each target independently. Invalid URL forms, incomplete brand/city rows, non-200 pages, and pages without the expected embedded state are logged and skipped while other targets continue.

The run fails with a clear error when no valid target is supplied or every target fails or yields zero venue records. One malformed request cannot silently become an empty successful dataset or discard useful rows already saved from another target.

This Actor accesses public web pages without bypassing a login or CAPTCHA.

You are responsible for your use case. Review Foursquare's terms, applicable database and privacy laws, and outreach rules in your jurisdiction. Do not use public contact information for spam, harassment, sensitive profiling, or unlawful discrimination.

Avoid republishing copyrighted photos or tip text beyond what your use case permits. Minimize stored personal information and honor valid deletion or correction requests.

Limitations

  • One supplied page currently exposes up to 30 detailed venue records.
  • The reported total may exceed exported rows.
  • Only public brand/city location pages are supported.
  • Individual venue URLs and free-form category search are out of scope.
  • Optional fields vary by venue.
  • Foursquare can change its page markup or embedded payload.
  • The Actor does not enrich emails, fetch social profiles, or access private API data; social contact values are copied only when published in the same source response.
  • Community activity counts are source-reported signals, not measured foot traffic.
  • The Actor does not infer openings, closures, or ownership changes.

Troubleshooting

Why did my URL fail validation?

Confirm it is a Foursquare /locations/<brand>/<city> link from the redirect, app, www, or bare Foursquare host. Venue detail paths and unrelated Foursquare pages are not supported.

Why did I receive fewer venues than maxItems?

maxItems is a ceiling. The public page may expose fewer records, and duplicate venue IDs across inputs are saved only once.

Why is a phone, rating, photo, or tip missing?

Foursquare does not publish every optional field for every venue. Missing fields are omitted rather than represented as invented values.

What should I do after a source-layout error?

Retry once later to rule out a transient response. If it persists, include the public source URL and run ID in an issue so the parser can be checked against the current page.

Frequently asked questions

Does this Actor need a Foursquare API key?

No. It reads anonymous public brand/city pages.

Does it use AI, a browser, or a residential proxy?

No. The implementation uses direct HTTP and deterministic parsing of embedded structured state; it does not call an AI service, launch a browser, or use a proxy.

Where is run data retained?

Results, key-value records, and logs remain in the user's Apify storage under that account's retention settings and can be deleted with Apify's storage controls. Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed, and reports are retained for 30 days. There is no external results cache. Foursquare is the named public data source; this Actor is not affiliated with or endorsed by Foursquare.

Can it scrape every Foursquare venue in a city?

No. It is intentionally bounded to the records exposed by supplied public brand/city pages.

Can I export to Excel?

Yes. Choose Excel from the dataset export menu after the run.

Are duplicate venues charged twice?

No. Duplicate Foursquare venue IDs are skipped before saving and charging.

Can I schedule it?

Yes. Save a tested input as an Apify Task and attach a schedule.

Combine this source-specific dataset with other Automation Lab tools when your workflow needs broader local-market coverage:

Use source IDs separately. Do not assume that similarly named records from different platforms are the same venue without a careful address or coordinate match.

Support

If a valid public brand/city URL stops working, open an Actor issue and include:

  • the input URL or brand/city pair;
  • the Apify run ID;
  • the expected result;
  • the actual error or missing field;
  • whether the same page opens anonymously in your browser.

That evidence makes source changes faster to reproduce and fix.